Skip to content

Commit da65f0d

Browse files
authored
Merge pull request #343 from nasa/332-pack-structures-if-not-multiple-of-32-bits
332 pack structures if not multiple of 32 bits
2 parents 2af8229 + e96dcba commit da65f0d

File tree

3 files changed

+79
-43
lines changed

3 files changed

+79
-43
lines changed

include/crypto_structs.h

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ typedef struct
4646
uint16_t scid : 16; // Spacecraft ID
4747
uint16_t vcid : 6; // Virtual Channel ID
4848
uint8_t mapid : 6; // Multiplexer Access Point ID
49-
} crypto_gvcid_t;
49+
} __attribute__((packed)) crypto_gvcid_t;
5050
#define CRYPTO_GVCID_SIZE (sizeof(crypto_gvcid_t))
5151

5252
/*
@@ -88,7 +88,7 @@ typedef struct
8888
uint8_t arsnw_len : 8; // Anti-Replay Seq Num Window Length
8989
uint16_t arsnw; // Anti-Replay Seq Num Window
9090

91-
} SecurityAssociation_t;
91+
} __attribute__((packed)) SecurityAssociation_t;
9292
#define SA_SIZE (sizeof(SecurityAssociation_t))
9393

9494
/*
@@ -104,7 +104,7 @@ typedef struct
104104
uint8_t ispif : 1; // Invalid SPI Flag
105105
uint16_t lspiu : 16; // Last SPI Used
106106
uint8_t snval : 8; // SN Value (LSB)
107-
} SDLS_FSR_t;
107+
} __attribute__((packed)) SDLS_FSR_t;
108108
#define SDLS_FSR_SIZE (sizeof(SDLS_FSR_t))
109109

110110
typedef struct
@@ -275,7 +275,7 @@ typedef struct
275275
uint8_t vcid : 6; // Virtual Channel ID
276276
uint16_t fl : 10; // The whole transfer frame length (max 1024)
277277
uint8_t fsn : 8; // Frame sequence number, also N(S), zeroed on Type-B frames
278-
} TC_FramePrimaryHeader_t;
278+
} __attribute__((packed)) TC_FramePrimaryHeader_t;
279279
#define TC_FRAME_PRIMARYHEADER_STRUCT_SIZE (sizeof(TC_FramePrimaryHeader_t))
280280
#define TC_FRAME_HEADER_SIZE 5
281281

@@ -289,15 +289,15 @@ typedef struct
289289
uint8_t sn_field_len;
290290
uint8_t pad[PAD_SIZE]; // Count of the used fill Bytes
291291
uint8_t pad_field_len;
292-
} TC_FrameSecurityHeader_t;
292+
} __attribute__((packed)) TC_FrameSecurityHeader_t;
293293
#define TC_FRAME_SECHEADER_SIZE (sizeof(TC_FrameSecurityHeader_t))
294294

295295
typedef struct
296296
{
297297
uint8_t mac[MAC_SIZE]; // Message Authentication Code
298298
uint8_t mac_field_len;
299299
uint16_t fecf; // Frame Error Control Field
300-
} TC_FrameSecurityTrailer_t;
300+
} __attribute__((packed)) TC_FrameSecurityTrailer_t;
301301
#define TC_FRAME_SECTRAILER_SIZE (sizeof(TC_FrameSecurityTrailer_t))
302302

303303
typedef struct
@@ -307,7 +307,7 @@ typedef struct
307307
uint8_t tc_pdu[TC_FRAME_DATA_SIZE];
308308
uint16_t tc_pdu_len;
309309
TC_FrameSecurityTrailer_t tc_sec_trailer;
310-
} TC_t;
310+
} __attribute__((packed)) TC_t;
311311
#define TC_SIZE (sizeof(TC_t))
312312

313313
/*
@@ -342,7 +342,7 @@ typedef struct
342342
CCSDS_HDR_t hdr;
343343
CCSDS_PUS_t pus;
344344
SDLS_TLV_t pdu;
345-
} CCSDS_t;
345+
} __attribute__((packed)) CCSDS_t;
346346
#define CCSDS_SIZE (sizeof(CCSDS_t))
347347

348348
/*
@@ -370,7 +370,7 @@ typedef struct
370370
uint8_t fbc : 2; // FARM-B Counter
371371
uint8_t spare1 : 1; // Reserved Spare "0"
372372
uint8_t rv : 8; // Report Value
373-
} Telemetry_Frame_Ocf_Clcw_t;
373+
} __attribute__((packed)) Telemetry_Frame_Ocf_Clcw_t;
374374

375375
#define TELEMETRY_FRAME_OCF_CLCW_SIZE (sizeof(Telemetry_Frame_Ocf_Clcw_t))
376376

@@ -386,7 +386,7 @@ typedef struct
386386
uint8_t bsaf : 1; // Bad Security Association Flag
387387
uint16_t lspi : 16; // Last SPI Used
388388
uint8_t snval : 8; // Sequence Number Value (LSB)
389-
} Telemetry_Frame_Ocf_Fsr_t;
389+
} __attribute__((packed)) Telemetry_Frame_Ocf_Fsr_t;
390390

391391
#define TELEMETRY_FRAME_OCF_FSR_SIZE (sizeof(Telemetry_Frame_Ocf_Fsr_t))
392392

@@ -463,10 +463,10 @@ typedef struct
463463
uint8_t spare : 2; // Reserved Spare
464464
// 0 = Shall be set to 0
465465
// Sync Flag 1 = Undefined
466-
uint8_t vfcc : 2; // VC Frame Count cycle
466+
uint8_t vfcc : 4; // VC Frame Count cycle
467467
// Sync Flag 0 = Shall be 11
468468
// Sync Flag 1 = Undefined
469-
uint16_t fhp : 11; // First Header Pointer
469+
uint16_t fhp : 16; // First Header Pointer
470470
// Sync Flag 0 = Contains position of the first byte of the first packet in the data field
471471
// Sync Flag 1 = undefined
472472
} AOS_FramePrimaryHeader_t;
@@ -493,7 +493,7 @@ typedef struct
493493
AOS_FrameSecurityHeader_t tm_sec_header;
494494
uint8_t aos_pdu[AOS_FRAME_DATA_SIZE];
495495
AOS_FrameSecurityTrailer_t aos_sec_trailer;
496-
} AOS_t;
496+
} __attribute__((packed)) AOS_t;
497497
#define AOS_SIZE (sizeof(AOS_t))
498498

499499
#define AOS_MIN_SIZE \

src/core/crypto.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ uint8_t Crypto_Prep_Reply(uint8_t *reply, uint8_t appID)
287287
reply[count++] = (sdls_frame.pdu.hdr.pdu_len & 0xFF00) >> 8;
288288
reply[count++] = (sdls_frame.pdu.hdr.pdu_len & 0x00FF);
289289

290+
sdls_frame.pdu.hdr.type = 0;
290291
return count;
291292
}
292293

test/unit/ut_crypto.c

Lines changed: 65 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ UTEST(CRYPTO_C, PDU_SWITCH)
112112

113113
Crypto_Init();
114114

115-
sdls_frame.hdr.type = 0;
116-
sdls_frame.pdu.hdr.uf = 0;
115+
sdls_frame.pdu.hdr.type = PDU_TYPE_COMMAND;
116+
sdls_frame.pdu.hdr.uf = PDU_USER_FLAG_FALSE;
117117
printf("SG_KEY_MGMT\n");
118118
sdls_frame.pdu.hdr.sg = SG_KEY_MGMT;
119119
sdls_frame.pdu.hdr.pid = PID_OTAR;
@@ -131,7 +131,6 @@ UTEST(CRYPTO_C, PDU_SWITCH)
131131
status = Crypto_PDU(ingest, &tc_frame);
132132
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
133133

134-
sdls_frame.pdu.hdr.pdu_len = 0;
135134
sdls_frame.pdu.hdr.pid = PID_KEY_VERIFICATION;
136135
status = Crypto_PDU(ingest, &tc_frame);
137136
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
@@ -142,7 +141,7 @@ UTEST(CRYPTO_C, PDU_SWITCH)
142141

143142
sdls_frame.pdu.hdr.pid = PID_KEY_INVENTORY;
144143
status = Crypto_PDU(ingest, &tc_frame);
145-
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
144+
ASSERT_EQ(status, CRYPTOGRAPHY_UNSUPPORTED_OPERATION_FOR_KEY_RING);
146145

147146
sdls_frame.pdu.hdr.pid = SG_KEY_MGMT;
148147
status = Crypto_PDU(ingest, &tc_frame);
@@ -184,11 +183,11 @@ UTEST(CRYPTO_C, PDU_SWITCH)
184183

185184
sdls_frame.pdu.hdr.pid = PID_READ_ARSN;
186185
status = Crypto_PDU(ingest, &tc_frame);
187-
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
186+
ASSERT_EQ(status, CRYPTO_LIB_ERROR);
188187

189188
sdls_frame.pdu.hdr.pid = PID_SA_STATUS;
190189
status = Crypto_PDU(ingest, &tc_frame);
191-
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
190+
ASSERT_EQ(status, CRYPTO_LIB_ERROR);
192191

193192
sdls_frame.pdu.hdr.pid = 0b111;
194193
status = Crypto_PDU(ingest, &tc_frame);
@@ -198,19 +197,19 @@ UTEST(CRYPTO_C, PDU_SWITCH)
198197
sdls_frame.pdu.hdr.sg = SG_SEC_MON_CTRL;
199198
sdls_frame.pdu.hdr.pid = PID_LOG_STATUS;
200199
status = Crypto_PDU(ingest, &tc_frame);
201-
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
200+
ASSERT_EQ(status, CRYPTO_LIB_ERROR);
202201

203202
sdls_frame.pdu.hdr.pid = PID_DUMP_LOG;
204203
status = Crypto_PDU(ingest, &tc_frame);
205-
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
204+
ASSERT_EQ(status, CRYPTO_LIB_ERROR);
206205

207206
sdls_frame.pdu.hdr.pid = PID_ERASE_LOG;
208207
status = Crypto_PDU(ingest, &tc_frame);
209-
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
208+
ASSERT_EQ(status, CRYPTO_LIB_ERROR);
210209

211210
sdls_frame.pdu.hdr.pid = PID_SELF_TEST;
212211
status = Crypto_PDU(ingest, &tc_frame);
213-
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
212+
ASSERT_EQ(status, CRYPTO_LIB_ERROR);
214213

215214
sdls_frame.pdu.hdr.pid = PID_ALARM_FLAG;
216215
status = Crypto_PDU(ingest, &tc_frame);
@@ -220,53 +219,45 @@ UTEST(CRYPTO_C, PDU_SWITCH)
220219
status = Crypto_PDU(ingest, &tc_frame);
221220
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
222221

223-
printf("PID_LOG_STATUS\n");
224-
sdls_frame.pdu.hdr.sg = PID_LOG_STATUS;
225-
sdls_frame.pdu.hdr.pid = PID_LOG_STATUS;
226-
status = Crypto_PDU(ingest, &tc_frame);
227-
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
228-
229222
printf("UF_TRUE\n");
230-
sdls_frame.pdu.hdr.uf = 1;
231-
sdls_frame.pdu.hdr.pid = 0;
223+
sdls_frame.pdu.hdr.uf = PDU_USER_FLAG_TRUE;
224+
sdls_frame.pdu.hdr.pid = PID_IDLE_FRAME_TRIGGER;
232225
status = Crypto_PDU(ingest, &tc_frame);
233226
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
234227

235-
sdls_frame.pdu.hdr.pid = 1;
228+
sdls_frame.pdu.hdr.pid = PID_TOGGLE_BAD_SPI;
236229
status = Crypto_PDU(ingest, &tc_frame);
237230
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
238231

239-
sdls_frame.pdu.hdr.pid = 2;
232+
sdls_frame.pdu.hdr.pid = PID_TOGGLE_BAD_IV;
240233
status = Crypto_PDU(ingest, &tc_frame);
241234
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
242235

243-
sdls_frame.pdu.hdr.pid = 3;
236+
sdls_frame.pdu.hdr.pid = PID_TOGGLE_BAD_MAC;
244237
status = Crypto_PDU(ingest, &tc_frame);
245238
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
246239

247-
sdls_frame.pdu.hdr.pid = 4;
240+
sdls_frame.pdu.hdr.pid = PID_TOGGLE_BAD_FECF;
248241
status = Crypto_PDU(ingest, &tc_frame);
249242
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
250243

251-
sdls_frame.pdu.hdr.pid = 5;
244+
sdls_frame.pdu.hdr.pid = PID_MODIFY_KEY;
252245
status = Crypto_PDU(ingest, &tc_frame);
253246
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
254247

255-
sdls_frame.pdu.hdr.pid = 6;
248+
sdls_frame.pdu.hdr.pid = PID_MODIFY_ACTIVE_TM;
256249
status = Crypto_PDU(ingest, &tc_frame);
257250
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
258251

259-
// TODO: (RB) Disabled for now. Key Inventory needs to be re-worked. - Not currently using EP
260-
261-
// sdls_frame.pdu.hdr.pid = 7;
262-
// status = Crypto_PDU(ingest, &tc_frame);
263-
// ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
252+
sdls_frame.pdu.hdr.pid = PID_MODIFY_VCID;
253+
status = Crypto_PDU(ingest, &tc_frame);
254+
ASSERT_EQ(status, CRYPTO_LIB_ERROR);
264255

265256
sdls_frame.pdu.hdr.pid = 8;
266257
status = Crypto_PDU(ingest, &tc_frame);
267258
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
268259

269-
sdls_frame.hdr.type = 1;
260+
sdls_frame.hdr.type = PDU_TYPE_REPLY;
270261
sdls_frame.pdu.hdr.pid = 8;
271262
status = Crypto_PDU(ingest, &tc_frame);
272263
ASSERT_EQ(status, CRYPTO_LIB_SUCCESS);
@@ -360,4 +351,48 @@ UTEST(CRYPTO_C, GET_ECS_ALGO_KEY_LEN)
360351
ASSERT_EQ(algo_keylen, 32);
361352
}
362353

354+
UTEST(CRYPTO_C, STRUCT_SIZE_VERIFICATION)
355+
{
356+
ASSERT_EQ(CRYPTO_GVCID_SIZE, (size_t)4);
357+
ASSERT_EQ(SA_SIZE, (size_t)2348);
358+
ASSERT_EQ(SDLS_FSR_SIZE, (size_t)4);
359+
ASSERT_EQ(SDLS_TLV_HDR_SIZE, (size_t)3);
360+
ASSERT_EQ(SDLS_TLV_SIZE, (size_t)497);
361+
ASSERT_EQ(SDLS_EKB_SIZE, (size_t)514);
362+
ASSERT_EQ(SDLS_OTAR_SIZE, (size_t)(2 + 16 + 30*514 + 16));
363+
ASSERT_EQ(SDLS_KEY_SIZE, (size_t)2);
364+
ASSERT_EQ(SDLS_KEY_INVENTORY_CMD_SIZE, (size_t)4);
365+
ASSERT_EQ(SDLS_KEY_INVENTORY_RPLY_SIZE, (size_t)3);
366+
ASSERT_EQ(SDLS_KEYV_CMD_BLK_SIZE, (size_t)18);
367+
ASSERT_EQ(SDLS_KEYV_CMD_SIZE, (size_t)(29*18));
368+
ASSERT_EQ(SDLS_KEYV_RPLY_BLK_SIZE, (size_t)50);
369+
ASSERT_EQ(SDLS_KEYV_RPLY_SIZE, (size_t)(50*29));
370+
ASSERT_EQ(SDLS_KEYDB_CMD_SIZE, (size_t)12);
371+
ASSERT_EQ(SDLS_KEYDB_RPLY_SIZE, (size_t)38);
372+
ASSERT_EQ(SDLS_SA_STATUS_RPLY_SIZE, (size_t)3);
373+
ASSERT_EQ(SDLS_SA_READ_ARSN_RPLY_SIZE, (size_t)22);
374+
ASSERT_EQ(SDLS_MC_LOG_RPLY_SIZE, (size_t)4);
375+
ASSERT_EQ(SDLS_MC_DUMP_RPLY_SIZE, (size_t)7);
376+
ASSERT_EQ(SDLS_MC_DUMP_BLK_RPLY_SIZE, (size_t)(7*50));
377+
ASSERT_EQ(SDLS_MC_ST_RPLY_SIZE, (size_t)1);
378+
ASSERT_EQ(SDLS_MC_SN_RPLY_SIZE, (size_t)16);
379+
ASSERT_EQ(TC_FRAME_PRIMARYHEADER_STRUCT_SIZE, (size_t)5);
380+
ASSERT_EQ(TC_FRAME_SECHEADER_SIZE, (size_t)70);
381+
ASSERT_EQ(TC_FRAME_SECTRAILER_SIZE, (size_t)19);
382+
ASSERT_EQ(TC_SIZE, (size_t)(5 + 70 + 19 + 2 + 1019));
383+
ASSERT_EQ(CCSDS_HDR_SIZE, (size_t)6);
384+
ASSERT_EQ(CCSDS_PUS_SIZE, (size_t)4);
385+
ASSERT_EQ(CCSDS_SIZE, (size_t)(6 + 4 + 497));
386+
ASSERT_EQ(TELEMETRY_FRAME_OCF_CLCW_SIZE, (size_t)4);
387+
ASSERT_EQ(TELEMETRY_FRAME_OCF_FSR_SIZE, (size_t)4);
388+
ASSERT_EQ(TM_FRAME_PRIMARYHEADER_SIZE, (size_t)6);
389+
ASSERT_EQ(TM_FRAME_SECHEADER_SIZE, (size_t)18);
390+
ASSERT_EQ(TM_FRAME_SECTRAILER_SIZE, (size_t)22);
391+
ASSERT_EQ(TM_SIZE, (size_t)(6 + 18 + 1786 + 22));
392+
ASSERT_EQ(AOS_FRAME_PRIMARYHEADER_SIZE, (size_t)8);
393+
ASSERT_EQ(AOS_FRAME_SECHEADER_SIZE, (size_t)18);
394+
ASSERT_EQ(AOS_FRAME_SECTRAILER_SIZE, (size_t)22);
395+
ASSERT_EQ(AOS_SIZE, (size_t)(8 + 18 + 1786 + 22));
396+
}
397+
363398
UTEST_MAIN();

0 commit comments

Comments
 (0)