Skip to content

Commit 7bc238b

Browse files
authored
Merge pull request #397 from nasa/202-enforce-arsn-only-with-auth-or-aead
202 enforce arsn only with auth or aead
2 parents 3bb4d53 + 91d935f commit 7bc238b

File tree

11 files changed

+442
-447
lines changed

11 files changed

+442
-447
lines changed

include/crypto_error.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,10 @@
140140
#define CRYPTO_LIB_ERR_ABM_LEN_GREATER_THAN_MAX_ABM_SIZE (-67)
141141
#define CRYPTO_LIB_ERR_STMACF_LEN_GREATER_THAN_MAX_MAC_SIZE (-68)
142142
#define CRYPTO_LIB_ERR_SHPLF_LEN_GREATER_THAN_MAX_PAD_SIZE (-69)
143+
#define CRYPTO_LIB_ERR_INVALID_SVC_TYPE_WITH_ARSN (-70)
144+
#define CRYPTO_LIB_ERR_ARSN_LT_SHSNF (-71)
143145

144-
#define CRYPTO_CORE_ERROR_CODES_MAX -69
146+
#define CRYPTO_CORE_ERROR_CODES_MAX -71
145147

146148
// Define codes for returning MDB Strings, and determining error based on strings
147149
#define CAM_ERROR_CODES 600

src/core/crypto_error.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,9 @@ char *crypto_enum_errlist_core[] = {(char *)"CRYPTO_LIB_SUCCESS",
9090
(char *)"CRYPTO_LIB_ERR_SHSNF_LEN_GREATER_THAN_MAX_ARSN_SIZE",
9191
(char *)"CRYPTO_LIB_ERR_ABM_LEN_GREATER_THAN_MAX_ABM_SIZE",
9292
(char *)"CRYPTO_LIB_ERR_STMACF_LEN_GREATER_THAN_MAX_MAC_SIZE",
93-
(char *)"CRYPTO_LIB_ERR_SHPLF_LEN_GREATER_THAN_MAX_PAD_SIZE"};
93+
(char *)"CRYPTO_LIB_ERR_SHPLF_LEN_GREATER_THAN_MAX_PAD_SIZE",
94+
(char *)"CRYPTO_LIB_ERR_INVALID_SVC_TYPE_WITH_ARSN",
95+
(char *)"CRYPTO_LIB_ERR_ARSN_LT_SHSNF"};
9496

9597
char *crypto_enum_errlist_config[] = {
9698
(char *)"CRYPTO_CONFIGURATION_NOT_COMPLETE",

src/core/crypto_mc.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -267,17 +267,18 @@ int32_t Crypto_SA_readARSN(uint8_t *ingest)
267267
uint16_t spi = 0x0000;
268268
SecurityAssociation_t *sa_ptr;
269269
int x;
270+
int status = CRYPTO_LIB_SUCCESS;
270271

271272
// Read ingest
272273
spi = ((uint8_t)sdls_frame.pdu.data[0] << BYTE_LEN) | (uint8_t)sdls_frame.pdu.data[1];
274+
status = sa_if->sa_get_from_spi(spi, &sa_ptr);
273275

274-
if (sa_if->sa_get_from_spi(spi, &sa_ptr) != CRYPTO_LIB_SUCCESS)
276+
if (status != CRYPTO_LIB_SUCCESS)
275277
{
276278
// TODO - Error handling
277-
status = CRYPTO_LIB_ERR_SA_NOT_OPERATIONAL; // Error -- unable to get SA from SPI.
279+
return status; // Error -- unable to get SA from SPI.
278280
}
279-
280-
if (status == CRYPTO_LIB_SUCCESS)
281+
else
281282
{
282283
// Prepare for Reply
283284
sdls_frame.pdu.hdr.pdu_len = (SPI_LEN + sa_ptr->arsn_len) * BYTE_LEN; // bits

src/sa/internal/sa_interface_inmemory.template.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,19 @@ static int32_t sa_get_from_spi(uint16_t spi, SecurityAssociation_t **security_as
731731
{
732732
return CRYPTO_LIB_ERR_NULL_ABM;
733733
} // Must have abm if doing authentication
734+
735+
// ARSN must be 0 octets in length if not using Auth/Auth Enc
736+
if (sa[spi].ast == 0 && sa[spi].arsn_len != 0)
737+
{
738+
return CRYPTO_LIB_ERR_INVALID_SVC_TYPE_WITH_ARSN;
739+
}
740+
741+
// ARSN length cannot be less than shsnf length
742+
if (sa[spi].shsnf_len > sa[spi].arsn_len)
743+
{
744+
return CRYPTO_LIB_ERR_ARSN_LT_SHSNF;
745+
}
746+
734747
#ifdef SA_DEBUG
735748
printf(KYEL "DEBUG - Printing local copy of SA Entry for current SPI.\n" RESET);
736749
Crypto_saPrint(*security_association);
@@ -860,6 +873,20 @@ void sa_non_operational_sa(int *i_p, int32_t *status, uint8_t tfvn, uint16_t sci
860873
*i_p = i;
861874
}
862875

876+
void sa_mismatched_arsn(int *i_p, int32_t *status, uint8_t tfvn, uint16_t scid, uint16_t vcid, uint8_t mapid)
877+
{
878+
int i = *i_p;
879+
if ((sa[i].arsn_len > 0 && sa[i].ast == 0) && (sa[i].gvcid_blk.tfvn == tfvn) && (sa[i].gvcid_blk.scid == scid) && (sa[i].gvcid_blk.vcid == vcid) &&
880+
(sa[i].gvcid_blk.mapid == mapid && sa[i].sa_state == SA_OPERATIONAL))
881+
{
882+
#ifdef SA_DEBUG
883+
printf(KRED "An operational SA (%d) was found - but invalid ARSN length.\n" RESET, sa[i].spi);
884+
#endif
885+
*status = CRYPTO_LIB_ERR_INVALID_SVC_TYPE_WITH_ARSN;
886+
}
887+
*i_p = i;
888+
}
889+
863890
void sa_debug_block(uint8_t tfvn, uint16_t scid, uint16_t vcid, uint8_t mapid)
864891
{
865892
// Detailed debug block
@@ -922,6 +949,12 @@ int32_t sa_get_operational_sa_from_gvcid_generate_error(int32_t *status, uint8_t
922949
sa_debug_block(tfvn, scid, vcid, mapid);
923950
return *status;
924951
}
952+
sa_mismatched_arsn(&i, status, tfvn, scid, vcid, mapid);
953+
if (*status != CRYPTO_LIB_SUCCESS)
954+
{
955+
sa_debug_block(tfvn, scid, vcid, mapid);
956+
return *status;
957+
}
925958
}
926959
}
927960
return *status;

test/unit/ut_aos_process.c

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,9 @@ UTEST(AOS_PROCESS, HAPPY_PATH_CLEAR_FECF)
285285
sa_if->sa_get_from_spi(10, &sa_ptr); // Disable SPI 10
286286
sa_ptr->sa_state = SA_KEYED;
287287
sa_if->sa_get_from_spi(9, &sa_ptr); // Enable and setup 9
288-
sa_ptr->sa_state = SA_OPERATIONAL;
288+
sa_ptr->sa_state = SA_OPERATIONAL;
289+
sa_ptr->arsn_len = 0;
290+
sa_ptr->shsnf_len = 0;
289291

290292
status =
291293
Crypto_AOS_ProcessSecurity((uint8_t *)framed_aos_b, framed_aos_len, &ptr_processed_frame, &processed_aos_len);
@@ -475,6 +477,8 @@ UTEST(AOS_PROCESS, INSERT_ZONE_PRESENT_PLAINTEXT)
475477
sa_ptr->sa_state = SA_KEYED;
476478
sa_if->sa_get_from_spi(9, &sa_ptr); // Enable and setup 9
477479
sa_ptr->sa_state = SA_OPERATIONAL;
480+
sa_ptr->arsn_len = 0;
481+
sa_ptr->shsnf_len = 0;
478482

479483
status =
480484
Crypto_AOS_ProcessSecurity((uint8_t *)framed_aos_b, framed_aos_len, &ptr_processed_frame, &processed_aos_len);
@@ -517,16 +521,13 @@ UTEST(AOS_PROCESS, AES_CMAC_256_TEST_0)
517521
TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE,
518522
AOS_CHECK_FECF_TRUE, 0x3F, SA_INCREMENT_NONTRANSMITTED_IV_TRUE);
519523
// AOS Tests
520-
// Crypto_Config_Add_Gvcid_Managed_Parameter(1, 0x002c, 0, AOS_HAS_FECF, AOS_SEGMENT_HDRS_NA, AOS_NO_OCF, 1786,
521-
// AOS_FHEC_NA, AOS_IZ_NA, 0);
522524
GvcidManagedParameters_t AOS_UT_Managed_Parameters = {
523525
1, 0x002c, 0, AOS_HAS_FECF, AOS_FHEC_NA, AOS_IZ_NA, 0, AOS_SEGMENT_HDRS_NA, 1786, AOS_NO_OCF, 1};
524526
Crypto_Config_Add_Gvcid_Managed_Parameters(AOS_UT_Managed_Parameters);
525527
status = Crypto_Init();
526528

527529
// Test frame setup
528530
// Note: SPI 11 (0x0B)
529-
// Setup: | hdr 6 |SPI| data | MAC | FECF
530531
char *framed_aos_h =
531532
"42C000001800000B08010000000F00112233445566778899AABBCCDDEEFFA107FF000006D2ABBABBAABBAABBAABBAABBAABBAABBAABBAA"
532533
"BBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABB"
@@ -582,7 +583,6 @@ UTEST(AOS_PROCESS, AES_CMAC_256_TEST_0)
582583
sa_ptr->gvcid_blk.scid = 0x44;
583584
sa_ptr->iv_len = 0;
584585
sa_ptr->shivf_len = 0;
585-
memset(sa_ptr->abm, 0x00, (sa_ptr->abm_len * sizeof(uint8_t))); // Bitmask of zeros
586586

587587
// Truth frame setup
588588
char *truth_aos_h =
@@ -623,11 +623,6 @@ UTEST(AOS_PROCESS, AES_CMAC_256_TEST_0)
623623
int truth_aos_len = 0;
624624
hex_conversion(truth_aos_h, &truth_aos_b, &truth_aos_len);
625625

626-
// Test Specific Setup
627-
// SaInterface sa_if = get_sa_interface_inmemory();
628-
// Expose/setup SA for testing
629-
// Configure SA 15
630-
631626
status =
632627
Crypto_AOS_ProcessSecurity((uint8_t *)framed_aos_b, framed_aos_len, &ptr_processed_frame, &processed_aos_len);
633628
ASSERT_EQ(CRYPTO_LIB_SUCCESS, status);
@@ -1738,6 +1733,8 @@ UTEST(AOS_PROCESS, AEAD_GCM_BITMASK_1)
17381733

17391734
UTEST(AOS_PROCESS, AOS_SA_SEGFAULT_TEST)
17401735
{
1736+
remove("sa_save_file.bin");
1737+
17411738
// Local Variables
17421739
int32_t status = CRYPTO_LIB_SUCCESS;
17431740
uint8_t *ptr_processed_frame = NULL;
@@ -1773,6 +1770,8 @@ UTEST(AOS_PROCESS, AOS_SA_SEGFAULT_TEST)
17731770

17741771
UTEST(AOS_PROCESS, AOS_SA_NOT_OPERATIONAL)
17751772
{
1773+
remove("sa_save_file.bin");
1774+
17761775
// Local Variables
17771776
int32_t status = CRYPTO_LIB_SUCCESS;
17781777
uint8_t *ptr_processed_frame = NULL;
@@ -1792,17 +1791,17 @@ UTEST(AOS_PROCESS, AOS_SA_NOT_OPERATIONAL)
17921791
status = Crypto_Init();
17931792

17941793
// Test frame setup
1795-
char *framed_aos_h = "42C00000000000050000000000000000FFFF";
1794+
char *framed_aos_h = "42C00000000800090000000000000000FFFF";
17961795
char *framed_aos_b = NULL;
17971796
int framed_aos_len = 0;
17981797
hex_conversion(framed_aos_h, &framed_aos_b, &framed_aos_len);
17991798

18001799
SecurityAssociation_t *sa_ptr = NULL;
18011800
SaInterface sa_if = get_sa_interface_inmemory();
1802-
sa_if->sa_get_from_spi(10, &sa_ptr); // Disable SPI 10
1803-
sa_ptr->sa_state = SA_KEYED;
1804-
sa_if->sa_get_from_spi(5, &sa_ptr); // Enable and setup 5
1801+
sa_if->sa_get_from_spi(9, &sa_ptr); // Disable SPI 10
18051802
sa_ptr->sa_state = SA_NONE;
1803+
sa_ptr->arsn_len = 0;
1804+
sa_ptr->shsnf_len = 0;
18061805

18071806
crypto_key_t *ekp = NULL;
18081807
ekp = key_if->get_key(sa_ptr->ekid);
@@ -1842,19 +1841,23 @@ UTEST(AOS_PROCESS, AOS_OCF_TEST)
18421841
status = Crypto_Init();
18431842

18441843
// Test frame setup
1845-
char *framed_aos_h = "42C00000001500090000000000000000DEADBEEFFFFF";
1844+
char *framed_aos_h = "42C00000000800090000000000000000DEADBEEFFFFF";
18461845
char *framed_aos_b = NULL;
18471846
int framed_aos_len = 0;
18481847
hex_conversion(framed_aos_h, &framed_aos_b, &framed_aos_len);
18491848

18501849
SecurityAssociation_t *sa_ptr = NULL;
18511850
SaInterface sa_if = get_sa_interface_inmemory();
1852-
sa_if->sa_get_from_spi(9, &sa_ptr); // Enable and setup 5
1853-
sa_ptr->sa_state = SA_OPERATIONAL;
1854-
sa_ptr->shivf_len = 0;
1855-
sa_ptr->gvcid_blk.tfvn = 1;
1856-
sa_ptr->gvcid_blk.vcid = 0;
1857-
sa_ptr->gvcid_blk.mapid = 0;
1851+
sa_if->sa_get_from_spi(9, &sa_ptr); // Enable and setup 9
1852+
sa_ptr->sa_state = SA_OPERATIONAL;
1853+
sa_ptr->shivf_len = 0;
1854+
sa_ptr->shsnf_len = 0;
1855+
sa_ptr->arsn_len = 0;
1856+
sa_ptr->iv_len = 0;
1857+
sa_ptr->shivf_len = 0;
1858+
sa_ptr->stmacf_len = 0;
1859+
sa_ptr->arsnw_len = 0;
1860+
sa_ptr->arsn_len = 0;
18581861

18591862
status =
18601863
Crypto_AOS_ProcessSecurity((uint8_t *)framed_aos_b, framed_aos_len, &ptr_processed_frame, &processed_aos_len);
@@ -1898,9 +1901,11 @@ UTEST(AOS_PROCESS, AOS_KEY_STATE_TEST)
18981901
sa_if->sa_get_from_spi(10, &sa_ptr); // Disable SPI 10
18991902
sa_ptr->sa_state = SA_KEYED;
19001903
sa_if->sa_get_from_spi(5, &sa_ptr); // Enable and setup 5
1901-
sa_ptr->sa_state = SA_OPERATIONAL;
1902-
sa_ptr->est = 1;
1903-
sa_ptr->ecs = CRYPTO_CIPHER_AES256_GCM;
1904+
sa_ptr->sa_state = SA_OPERATIONAL;
1905+
sa_ptr->est = 1;
1906+
sa_ptr->ecs = CRYPTO_CIPHER_AES256_GCM;
1907+
sa_ptr->arsn_len = 0;
1908+
sa_ptr->shsnf_len = 0;
19041909

19051910
crypto_key_t *ekp = NULL;
19061911
ekp = key_if->get_key(sa_ptr->ekid);

test/unit/ut_crypto.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ UTEST(CRYPTO_C, OTAR_0_140_142_FAIL_TEST)
460460
// Expect success on next valid IV && ARSN
461461
printf(KGRN "Checking next valid IV && valid ARSN... should be able to receive it... \n" RESET);
462462
status = Crypto_TC_ProcessSecurity(buffer_OTAR_b, &buffer_OTAR_len, &tc_nist_processed_frame);
463-
ASSERT_EQ(CRYPTO_LIB_ERR_SDLS_EP_NOT_BUILT, status);
463+
ASSERT_NE(CRYPTO_LIB_SUCCESS, status);
464464

465465
printf("\n");
466466
Crypto_Shutdown();

0 commit comments

Comments
 (0)