Skip to content

Commit d2a730b

Browse files
committed
Merge branch 'dev' into cryptolib#369-fuzz
2 parents 61afac3 + d72b9e2 commit d2a730b

File tree

11 files changed

+102
-42
lines changed

11 files changed

+102
-42
lines changed

CMakeLists.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ option(SA_FILE "Save Security Association to File" OFF)
6161
option(KEY_VALIDATION "Validate existance of key duplication" OFF)
6262
OPTION(KMC_MDB_RH "KMC-MDB-RedHat-Integration-Testing" OFF) #Disabled by default, enable with: -DKMC_MDB_RH=ON
6363
OPTION(KMC_MDB_DB "KMC-MDB-Debian-Integration-Testing" OFF) #Disabled by default, enable with: -DKMC_MDB_DB=ON
64-
OPTION(KMC_CFFI_EXCLUDE "KMC-Exclude-Problematic-CFFI-Code" OFF) #Disabled by default, enable with: -DKMC_CFFI_EXCLUDE=ON
6564
OPTION(CRYPTO_EPROC "Enables the building and use of Extended Procedures" OFF) #Disabled by default, enable with -DCRYPTO_EPROC=ON
6665

6766
OPTION(MAC_SIZE "The size of the max MAC buffer in bytes")
@@ -154,12 +153,10 @@ endif()
154153

155154
IF(KMC_MDB_RH)
156155
ADD_DEFINITIONS(-DKMC_MDB_RH)
157-
ADD_DEFINITIONS(-DKMC_CFFI_EXCLUDE)
158156
ENDIF(KMC_MDB_RH)
159157

160158
IF(KMC_MDB_DB)
161159
ADD_DEFINITIONS(-DKMC_MDB_DB)
162-
ADD_DEFINITIONS(-DKMC_CFFI_EXCLUDE)
163160
ENDIF(KMC_MDB_DB)
164161

165162
IF(CRYPTO_EPROC)

docs/wiki/Environment_Building.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,5 @@ The two flags (DEBUG and TEST_ENC) can be used simultaneously, or separately.
9696
9797
> * KMC_MDB_RH "KMC-MDB-RedHat-Integration-Testing" -- Default OFF
9898
> * KMC_MDB_DB "KMC-MDB-Debian-Integration-Testing" -- Default OFF
99-
> * KMC_CFFI_EXCLUDE "KMC-Exclude-Problematic-CFFI-Code" -- Default OFF
10099
101100
> * CRYPTO_EPROC "Enables building of Extended Procedures -- Default OFF (CURRENTLY A WIP - Not ready for Operations)

include/crypto_error.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,9 @@
153153
#define CRYPTO_LIB_ERR_INVALID_FHECF (-79)
154154
#define CRYPTO_LIB_ERR_TM_SECONDARY_HDR_SIZE (-80)
155155
#define CRYPTO_LIB_ERR_TM_SECONDARY_HDR_VN (-81)
156+
#define CRYPTO_LIB_ERR_TC_FRAME_LENGTH_MISMATCH (-82)
156157

157-
#define CRYPTO_CORE_ERROR_CODES_MAX -81
158+
#define CRYPTO_CORE_ERROR_CODES_MAX -82
158159

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

include/crypto_structs.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,9 @@
3131
#include "common_types.h"
3232
#endif // Assume build outside of NOS3/cFS infrastructure
3333

34-
#ifndef KMC_CFFI_EXCLUDE // Exclude libraries that CFFI parser can’t process
3534
#include <stdlib.h>
3635
#include <stdint.h>
3736
#include <stdio.h>
38-
#endif
3937

4038
/*
4139
** Definitions

src/core/crypto_error.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ char *crypto_enum_errlist_core[] = {(char *)"CRYPTO_LIB_SUCCESS",
102102
(char *)"CRYPTO_LIB_ERR_TM_FL_LT_MAX_FRAME_SIZE",
103103
(char *)"CRYPTO_LIB_ERR_INVALID_FHECF",
104104
(char *)"CRYPTO_LIB_ERR_TM_SECONDARY_HDR_SIZE",
105-
(char *)"CRYPTO_LIB_ERR_TM_SECONDARY_HDR_VN"};
105+
(char *)"CRYPTO_LIB_ERR_TM_SECONDARY_HDR_VN",
106+
(char *)"CRYPTO_LIB_ERR_TC_FRAME_LENGTH_MISMATCH"};
106107

107108
char *crypto_enum_errlist_config[] = {
108109
(char *)"CRYPTO_CONFIGURATION_NOT_COMPLETE",

src/core/crypto_tc.c

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -992,6 +992,13 @@ int32_t Crypto_TC_ApplySecurity_Cam(const uint8_t *p_in_frame, const uint16_t in
992992
return status;
993993
}
994994

995+
if (temp_tc_header.fl + 1 != in_frame_length)
996+
{
997+
status = CRYPTO_LIB_ERR_TC_FRAME_LENGTH_MISMATCH;
998+
mc_if->mc_log(status);
999+
return status;
1000+
}
1001+
9951002
#ifdef SA_DEBUG
9961003
printf(KYEL "DEBUG - Printing SA Entry for current frame.\n" RESET);
9971004
Crypto_saPrint(sa_ptr);
@@ -1033,16 +1040,20 @@ int32_t Crypto_TC_ApplySecurity_Cam(const uint8_t *p_in_frame, const uint16_t in
10331040
uint8_t fecf_len = FECF_SIZE;
10341041
uint8_t ocf_len = TELEMETRY_FRAME_OCF_CLCW_SIZE;
10351042
Crypto_TC_Calc_Lengths(&fecf_len, &segment_hdr_len, &ocf_len);
1036-
// Calculate tf_payload length here to be used in other logic
10371043

1038-
if (temp_tc_header.fl <= TC_FRAME_HEADER_SIZE - segment_hdr_len - fecf_len + 1)
1044+
// Calculate tf_payload length here to be used in other logic
1045+
int16_t payload_calc = temp_tc_header.fl - TC_FRAME_HEADER_SIZE - segment_hdr_len - fecf_len + 1;
1046+
// check if payload length underflows
1047+
if (payload_calc < 0)
10391048
{
1049+
#ifdef TC_DEBUG
1050+
printf("Payload Calculation Underflow: %d\n", payload_calc);
1051+
#endif
10401052
status = CRYPTO_LIB_ERR_TC_FRAME_LENGTH_UNDERFLOW;
10411053
mc_if->mc_log(status);
10421054
return status;
10431055
}
1044-
1045-
tf_payload_len = temp_tc_header.fl - TC_FRAME_HEADER_SIZE - segment_hdr_len - fecf_len + 1;
1056+
tf_payload_len = (uint16_t)payload_calc;
10461057

10471058
/**
10481059
* A note on plaintext: Take a permissive approach to allow the lengths of fields that aren't going to be used.
@@ -1826,9 +1837,9 @@ int32_t Crypto_TC_ProcessSecurity_Cam(uint8_t *ingest, int *len_ingest, TC_t *tc
18261837
tc_sdls_processed_frame->tc_header.fsn = (uint8_t)ingest[byte_idx];
18271838
byte_idx++;
18281839

1829-
if (*len_ingest < tc_sdls_processed_frame->tc_header.fl + 1) // Specified frame length larger than provided frame!
1840+
if (tc_sdls_processed_frame->tc_header.fl + 1 != *len_ingest) // Specified frame length larger than provided frame!
18301841
{
1831-
status = CRYPTO_LIB_ERR_INPUT_FRAME_LENGTH_SHORTER_THAN_FRAME_HEADERS_LENGTH;
1842+
status = CRYPTO_LIB_ERR_TC_FRAME_LENGTH_MISMATCH;
18321843
mc_if->mc_log(status);
18331844
return status;
18341845
}
@@ -1844,14 +1855,6 @@ int32_t Crypto_TC_ProcessSecurity_Cam(uint8_t *ingest, int *len_ingest, TC_t *tc
18441855
return status;
18451856
} // Unable to get necessary Managed Parameters for TC TF -- return with error.
18461857

1847-
// The frame thinks it should be size X, but we received <X bytes
1848-
if ((tc_sdls_processed_frame->tc_header.fl + 1) < *len_ingest)
1849-
{
1850-
status = CRYPTO_LIB_ERR_TC_FRAME_LENGTH_UNDERFLOW;
1851-
mc_if->mc_log(status);
1852-
return status;
1853-
}
1854-
18551858
// Segment Header
18561859
Crypto_TC_Set_Segment_Header(tc_sdls_processed_frame, ingest, &byte_idx);
18571860

@@ -1908,13 +1911,6 @@ int32_t Crypto_TC_ProcessSecurity_Cam(uint8_t *ingest, int *len_ingest, TC_t *tc
19081911

19091912
Crypto_TC_Calc_Lengths(&fecf_len, &segment_hdr_len, &ocf_len);
19101913

1911-
if (tc_sdls_processed_frame->tc_header.fl <= TC_FRAME_HEADER_SIZE - segment_hdr_len - fecf_len + 1)
1912-
{
1913-
status = CRYPTO_LIB_ERR_TC_FRAME_LENGTH_UNDERFLOW;
1914-
mc_if->mc_log(status);
1915-
return status;
1916-
}
1917-
19181914
// Parse & Check FECF
19191915
status = Crypto_TC_Parse_Check_FECF(ingest, len_ingest, tc_sdls_processed_frame);
19201916
if (status != CRYPTO_LIB_SUCCESS)

src/sa/internal/sa_interface_inmemory.template.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,11 +1019,8 @@ static int32_t sa_start(TC_t *tc_frame)
10191019
gvcid.tfvn = (sdls_frame.tlv_pdu.data[count] >> 4);
10201020
gvcid.scid = (sdls_frame.tlv_pdu.data[count] << 12) | (sdls_frame.tlv_pdu.data[count + 1] << 4) |
10211021
(sdls_frame.tlv_pdu.data[count + 2] >> 4);
1022-
gvcid.vcid =
1023-
((sdls_frame.tlv_pdu.data[count + 2] << 4) | (sdls_frame.tlv_pdu.data[count + 3] & 0xC0) >> 6);
1024-
1025-
printf("\nParsed GVCID %d:\n\tTFVN: %d\n\tSCID: %d\n\tVCID: %d\n", x, gvcid.tfvn, gvcid.scid,
1026-
gvcid.vcid);
1022+
gvcid.vcid = (((sdls_frame.tlv_pdu.data[count + 2] & 0x0F) << 2) |
1023+
(sdls_frame.tlv_pdu.data[count + 3] & 0xC0) >> 6);
10271024

10281025
if (current_managed_parameters_struct.has_segmentation_hdr == TC_HAS_SEGMENT_HDRS)
10291026
{

support/scripts/build_kmc.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ source $SCRIPT_DIR/env.sh
1111

1212
rm $BASE_DIR/CMakeCache.txt
1313

14-
cmake $BASE_DIR -DCODECOV=1 -DDEBUG=1 -DCRYPTO_KMC=1 -DKEY_KMC=1 -DMC_DISABLED=1 -DSA_MARIADB=1 -DTEST=1 -DKMC_CFFI_EXCLUDE=1 -DSA_FILE=1 -DKMC_MDB_DB=1 && make && make test
14+
cmake $BASE_DIR -DCODECOV=1 -DDEBUG=1 -DCRYPTO_KMC=1 -DKEY_KMC=1 -DMC_DISABLED=1 -DSA_MARIADB=1 -DTEST=1 -DSA_FILE=1 -DKMC_MDB_DB=1 && make && make test

support/scripts/internal_docker_build.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@ mkdir $BASE_DIR/build/internal > /dev/null 2>&1
1717

1818
echo "Internal build and test..."
1919
$DFLAGS -v $BASE_DIR:$BASE_DIR -w $BASE_DIR/build/internal $DBOX bash -c \
20-
"../../support/scripts/build_support.sh"
20+
"../../support/scripts/build_internal.sh"
2121
echo ""

test/unit/ut_tc_apply.c

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1480,6 +1480,7 @@ UTEST(TC_APPLY_SECURITY, TC_KEY_STATE_TEST)
14801480
UTEST(TC_APPLY_SECURITY, TC_HEAP_BUFFER_OVERFLOW_TEST)
14811481
{
14821482
remove("sa_save_file.bin");
1483+
int status = CRYPTO_LIB_SUCCESS;
14831484
// Setup & Initialize CryptoLib
14841485
Crypto_Config_CryptoLib(KEY_TYPE_INTERNAL, MC_TYPE_INTERNAL, SA_TYPE_INMEMORY, CRYPTOGRAPHY_TYPE_LIBGCRYPT,
14851486
IV_INTERNAL, CRYPTO_TC_CREATE_FECF_TRUE, TC_PROCESS_SDLS_PDUS_TRUE, TC_HAS_PUS_HDR,
@@ -1490,7 +1491,8 @@ UTEST(TC_APPLY_SECURITY, TC_HEAP_BUFFER_OVERFLOW_TEST)
14901491
GvcidManagedParameters_t TC_UT_Managed_Parameters = {
14911492
1, 0x0003, 0, TC_NO_FECF, AOS_FHEC_NA, AOS_IZ_NA, 0, TC_NO_SEGMENT_HDRS, 1024, TC_OCF_NA, 1};
14921493
Crypto_Config_Add_Gvcid_Managed_Parameters(TC_UT_Managed_Parameters);
1493-
Crypto_Init();
1494+
status = Crypto_Init();
1495+
ASSERT_EQ(CRYPTO_LIB_SUCCESS, status);
14941496
// Test string
14951497
char *test_frame_pt_h = "6403000000";
14961498
char *test_frame_pt_b = NULL;
@@ -1506,7 +1508,41 @@ UTEST(TC_APPLY_SECURITY, TC_HEAP_BUFFER_OVERFLOW_TEST)
15061508

15071509
Crypto_Shutdown();
15081510
free(test_frame_pt_b);
1509-
ASSERT_EQ(CRYPTO_LIB_ERR_TC_FRAME_LENGTH_UNDERFLOW, return_val);
1511+
ASSERT_EQ(CRYPTO_LIB_ERR_TC_FRAME_LENGTH_MISMATCH, return_val);
1512+
}
1513+
1514+
UTEST(TC_APPLY_SECURITY, TC_HEAP_BUFFER_OVERFLOW_TEST_2)
1515+
{
1516+
remove("sa_save_file.bin");
1517+
int status = CRYPTO_LIB_SUCCESS;
1518+
// Setup & Initialize CryptoLib
1519+
Crypto_Config_CryptoLib(KEY_TYPE_INTERNAL, MC_TYPE_INTERNAL, SA_TYPE_INMEMORY, CRYPTOGRAPHY_TYPE_LIBGCRYPT,
1520+
IV_INTERNAL, CRYPTO_TC_CREATE_FECF_TRUE, TC_PROCESS_SDLS_PDUS_TRUE, TC_HAS_PUS_HDR,
1521+
TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_TRUE,
1522+
TC_CHECK_FECF_TRUE, 0x3F, SA_INCREMENT_NONTRANSMITTED_IV_TRUE);
1523+
// Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 0, TC_HAS_FECF, TC_NO_SEGMENT_HDRS, TC_OCF_NA, 1024,
1524+
// AOS_FHEC_NA, AOS_IZ_NA, 0);
1525+
GvcidManagedParameters_t TC_UT_Managed_Parameters = {
1526+
0, 0x0003, 0, TC_HAS_FECF, AOS_FHEC_NA, AOS_IZ_NA, 0, TC_HAS_SEGMENT_HDRS, 1024, TC_OCF_NA, 1};
1527+
Crypto_Config_Add_Gvcid_Managed_Parameters(TC_UT_Managed_Parameters);
1528+
status = Crypto_Init();
1529+
ASSERT_EQ(CRYPTO_LIB_SUCCESS, status);
1530+
// Test string
1531+
char *test_frame_pt_h = "20030006190031FA2A79206F7F0DAD55CE54899DD37FA6D007B4E86DB4E86DA4B4E867";
1532+
char *test_frame_pt_b = NULL;
1533+
int test_frame_pt_len = 0;
1534+
1535+
hex_conversion(test_frame_pt_h, (char **)&test_frame_pt_b, &test_frame_pt_len);
1536+
1537+
uint8_t *ptr_enc_frame = NULL;
1538+
uint16_t enc_frame_len = 0;
1539+
int32_t return_val = CRYPTO_LIB_ERROR;
1540+
1541+
return_val = Crypto_TC_ApplySecurity((uint8_t *)test_frame_pt_b, test_frame_pt_len, &ptr_enc_frame, &enc_frame_len);
1542+
1543+
Crypto_Shutdown();
1544+
free(test_frame_pt_b);
1545+
ASSERT_EQ(CRYPTO_LIB_ERR_TC_FRAME_LENGTH_MISMATCH, return_val);
15101546
}
15111547

15121548
UTEST_MAIN();

0 commit comments

Comments
 (0)