Skip to content

Commit 07a5e88

Browse files
authored
Merge pull request #476 from nasa/475-release-with-race-condition-fix
475 release with race condition fix
2 parents ce3b7bb + 69cfa59 commit 07a5e88

File tree

16 files changed

+324
-238
lines changed

16 files changed

+324
-238
lines changed

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
cmake_minimum_required(VERSION 3.14.0)
1919
project(crypto C)
2020

21+
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
22+
2123
#
2224
# CUSTOM PATH Definiton
2325
#

include/crypto.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
** Crypto Version
5050
*/
5151
#define CRYPTO_LIB_MAJOR_VERSION 1
52-
#define CRYPTO_LIB_MINOR_VERSION 3
52+
#define CRYPTO_LIB_MINOR_VERSION 4
5353
#define CRYPTO_LIB_REVISION 1
5454
#define CRYPTO_LIB_MISSION_REV 0
5555

@@ -329,7 +329,9 @@ extern CamConfig_t *cam_config;
329329
extern GvcidManagedParameters_t *gvcid_managed_parameters;
330330
extern GvcidManagedParameters_t *current_managed_parameters;
331331
extern GvcidManagedParameters_t gvcid_managed_parameters_array[GVCID_MAX_PARAM_SIZE];
332-
extern GvcidManagedParameters_t current_managed_parameters_struct;
332+
extern GvcidManagedParameters_t tc_current_managed_parameters_struct;
333+
extern GvcidManagedParameters_t tm_current_managed_parameters_struct;
334+
extern GvcidManagedParameters_t aos_current_managed_parameters_struct;
333335
extern int gvcid_counter;
334336
extern KeyInterface key_if;
335337
extern McInterface mc_if;

src/CMakeLists.txt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,13 @@ endif()
128128

129129
# Create the app module
130130
if(DEFINED CFE_SYSTEM_PSPNAME)
131-
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/cpu${TGTSYS_${SYSVAR}}/${INSTALL_SUBDIR}")
131+
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${TGTSYS_${SYSVAR}}/${INSTALL_SUBDIR}")
132132
add_cfe_app(crypto ${LIB_SRC_FILES})
133133
target_include_directories(crypto PUBLIC ../include)
134134
else()
135135
# Standalone build
136136
add_library(crypto SHARED ${LIB_SRC_FILES})
137+
target_include_directories(crypto PUBLIC ../include)
137138
endif()
138139

139140
if(CRYPTO_LIBGCRYPT)
@@ -159,23 +160,25 @@ endif()
159160

160161
file(GLOB CRYPTO_INCLUDES ../include/*.h)
161162
set_target_properties(crypto PROPERTIES PUBLIC_HEADER "${CRYPTO_INCLUDES}")
163+
file(GLOB CRYPTO_INCLUDES ../support/standalone/*.h)
164+
set_target_properties(crypto PROPERTIES PUBLIC_HEADER "${CRYPTO_INCLUDES}")
162165
# This causes the library to be installed as libcryptolib.so while still being
163166
# referred to as crypto from CMake. Without this, the library filename would be
164167
# libcrypto.so which would conflict with openssl
165168
set_target_properties(crypto PROPERTIES OUTPUT_NAME "cryptolib")
166169

167170
add_custom_command(TARGET crypto POST_BUILD
168-
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:crypto> ${PROJECT_BINARY_DIR}/lib/libcrypto.so
169-
COMMENT "Created ${PROJECT_BINARY_DIR}/lib/libCrypto.so"
171+
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:crypto> ${PROJECT_BINARY_DIR}/libcryptolib.so
172+
COMMENT "Created ${PROJECT_BINARY_DIR}/libcryptolib.so"
170173
)
171174

172175
if(DEFINED CFE_SYSTEM_PSPNAME)
173176
install(TARGETS crypto
174177
DESTINATION ${CMAKE_INSTALL_PREFIX}/${TGTSYS_${SYSVAR}}/${INSTALL_SUBDIR}
175-
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_PREFIX}/host)
178+
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_PREFIX}/include)
176179
else()
177180
install(TARGETS crypto
178-
DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
181+
DESTINATION ${CMAKE_INSTALL_PREFIX}/
179182
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_PREFIX}/include)
180183
endif()
181184

src/core/crypto.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1447,8 +1447,8 @@ int32_t Crypto_Get_Security_Trailer_Length(SecurityAssociation_t *sa_ptr)
14471447
**/
14481448
void Crypto_Set_FSR(uint8_t *p_ingest, uint16_t byte_idx, uint16_t pdu_len, SecurityAssociation_t *sa_ptr)
14491449
{
1450-
if (current_managed_parameters_struct.has_ocf == TM_HAS_OCF ||
1451-
current_managed_parameters_struct.has_ocf == AOS_HAS_OCF)
1450+
if (tm_current_managed_parameters_struct.has_ocf == TM_HAS_OCF ||
1451+
aos_current_managed_parameters_struct.has_ocf == AOS_HAS_OCF)
14521452
{
14531453
Telemetry_Frame_Ocf_Fsr_t temp_report;
14541454
byte_idx += (pdu_len + sa_ptr->stmacf_len);

src/core/crypto_aos.c

Lines changed: 61 additions & 59 deletions
Large diffs are not rendered by default.

src/core/crypto_config.c

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,11 @@ CryptographyKmcCryptoServiceConfig_t *cryptography_kmc_crypto_config = NULL;
4545
CamConfig_t *cam_config = NULL;
4646

4747
GvcidManagedParameters_t gvcid_managed_parameters_array[GVCID_MAN_PARAM_SIZE];
48-
int gvcid_counter = 0;
49-
GvcidManagedParameters_t gvcid_null_struct = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
50-
GvcidManagedParameters_t current_managed_parameters_struct = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
48+
int gvcid_counter = 0;
49+
GvcidManagedParameters_t gvcid_null_struct = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
50+
GvcidManagedParameters_t tc_current_managed_parameters_struct = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
51+
GvcidManagedParameters_t tm_current_managed_parameters_struct = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
52+
GvcidManagedParameters_t aos_current_managed_parameters_struct = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
5153

5254
// GvcidManagedParameters_t* gvcid_managed_parameters = NULL;
5355
// GvcidManagedParameters_t* current_managed_parameters = NULL;
@@ -72,28 +74,25 @@ int32_t Crypto_SC_Init(void)
7274
{
7375
int32_t status = CRYPTO_LIB_SUCCESS;
7476
Crypto_Config_CryptoLib(KEY_TYPE_INTERNAL, MC_TYPE_INTERNAL, SA_TYPE_INMEMORY, CRYPTOGRAPHY_TYPE_LIBGCRYPT,
75-
IV_INTERNAL, CRYPTO_TC_CREATE_FECF_TRUE, TC_PROCESS_SDLS_PDUS_TRUE, TC_HAS_PUS_HDR,
77+
IV_INTERNAL, CRYPTO_TC_CREATE_FECF_TRUE, TC_PROCESS_SDLS_PDUS_TRUE, TC_NO_PUS_HDR,
7678
TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE,
7779
TC_CHECK_FECF_TRUE, 0x3F, SA_INCREMENT_NONTRANSMITTED_IV_TRUE);
7880
// TC
79-
// Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 0, TC_HAS_FECF, TC_HAS_SEGMENT_HDRS, TC_OCF_NA, 1024,
80-
// AOS_FHEC_NA, AOS_IZ_NA, 0);
8181
GvcidManagedParameters_t TC_UT_Managed_Parameters = {
8282
0, 0x0003, 0, TC_HAS_FECF, AOS_FHEC_NA, AOS_IZ_NA, 0, TC_HAS_SEGMENT_HDRS, 1024, TC_OCF_NA, 1};
8383
Crypto_Config_Add_Gvcid_Managed_Parameters(TC_UT_Managed_Parameters);
84-
85-
// Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 4, TC_HAS_FECF, TC_HAS_SEGMENT_HDRS, TC_OCF_NA, 1024,
86-
// AOS_FHEC_NA, AOS_IZ_NA, 0);
8784
TC_UT_Managed_Parameters.vcid = 2;
8885
Crypto_Config_Add_Gvcid_Managed_Parameters(TC_UT_Managed_Parameters);
86+
TC_UT_Managed_Parameters.vcid = 3;
87+
Crypto_Config_Add_Gvcid_Managed_Parameters(TC_UT_Managed_Parameters);
8988

9089
// TM
91-
// Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 1, TM_HAS_FECF, TM_SEGMENT_HDRS_NA, TM_HAS_OCF, 1786,
92-
// AOS_FHEC_NA, AOS_IZ_NA, 0);
9390
GvcidManagedParameters_t TM_UT_Managed_Parameters = {
94-
0, 0x0003, 1, TM_HAS_FECF, AOS_FHEC_NA, AOS_IZ_NA, 0, TM_SEGMENT_HDRS_NA, 1786, TM_HAS_OCF, 1};
91+
0, 0x0003, 1, TM_HAS_FECF, AOS_FHEC_NA, AOS_IZ_NA, 0, TM_SEGMENT_HDRS_NA, 1786, TM_NO_OCF, 1};
92+
Crypto_Config_Add_Gvcid_Managed_Parameters(TM_UT_Managed_Parameters);
93+
TM_UT_Managed_Parameters.vcid = 4;
9594
Crypto_Config_Add_Gvcid_Managed_Parameters(TM_UT_Managed_Parameters);
96-
TM_UT_Managed_Parameters.vcid = 2;
95+
TM_UT_Managed_Parameters.vcid = 5;
9796
Crypto_Config_Add_Gvcid_Managed_Parameters(TM_UT_Managed_Parameters);
9897
status = Crypto_Init();
9998
return status;
@@ -397,7 +396,9 @@ int32_t Crypto_Shutdown(void)
397396
int32_t status = CRYPTO_LIB_SUCCESS;
398397

399398
// current_managed_parameters = NULL;
400-
current_managed_parameters_struct = gvcid_null_struct;
399+
tc_current_managed_parameters_struct = gvcid_null_struct;
400+
tm_current_managed_parameters_struct = gvcid_null_struct;
401+
aos_current_managed_parameters_struct = gvcid_null_struct;
401402
for (int i = 0; i <= gvcid_counter; i++)
402403
{
403404
gvcid_managed_parameters_array[i] = gvcid_null_struct;

src/core/crypto_tc.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -243,10 +243,10 @@ int32_t Crypto_TC_Frame_Validation(uint16_t *p_enc_frame_len)
243243
}
244244

245245
// Check maximum managed parameter size
246-
if (*p_enc_frame_len > current_managed_parameters_struct.max_frame_size)
246+
if (*p_enc_frame_len > tc_current_managed_parameters_struct.max_frame_size)
247247
{
248248
#ifdef DEBUG
249-
printf("Managed length is: %d\n", current_managed_parameters_struct.max_frame_size);
249+
printf("Managed length is: %d\n", tc_current_managed_parameters_struct.max_frame_size);
250250
printf("New enc frame length will be: %d\n", *p_enc_frame_len);
251251
#endif
252252
printf(KRED "Error: New frame would violate maximum tc frame managed parameter! \n" RESET);
@@ -695,7 +695,7 @@ int32_t Crypto_TC_Do_Encrypt(uint8_t sa_service_type, SecurityAssociation_t *sa_
695695
*/
696696

697697
// Only calculate & insert FECF if CryptoLib is configured to do so & gvcid includes FECF.
698-
if (current_managed_parameters_struct.has_fecf == TC_HAS_FECF)
698+
if (tc_current_managed_parameters_struct.has_fecf == TC_HAS_FECF)
699699
{
700700
#ifdef FECF_DEBUG
701701
printf(KCYN "Calcing FECF over %d bytes\n" RESET, new_enc_frame_header_field_length - 1);
@@ -818,15 +818,15 @@ int32_t Crytpo_TC_Validate_TC_Temp_Header(const uint16_t in_frame_length, TC_Fra
818818
// Lookup-retrieve managed parameters for frame via gvcid:
819819
status =
820820
Crypto_Get_Managed_Parameters_For_Gvcid(temp_tc_header.tfvn, temp_tc_header.scid, temp_tc_header.vcid,
821-
gvcid_managed_parameters_array, &current_managed_parameters_struct);
821+
gvcid_managed_parameters_array, &tc_current_managed_parameters_struct);
822822

823823
if (status != CRYPTO_LIB_SUCCESS)
824824
{
825825
mc_if->mc_log(status);
826826
return status;
827827
} // Unable to get necessary Managed Parameters for TC TF -- return with error.
828828

829-
if (current_managed_parameters_struct.has_segmentation_hdr == TC_HAS_SEGMENT_HDRS)
829+
if (tc_current_managed_parameters_struct.has_segmentation_hdr == TC_HAS_SEGMENT_HDRS)
830830
{
831831
*segmentation_hdr = p_in_frame[5];
832832
*map_id = *segmentation_hdr & 0x3F;
@@ -1194,7 +1194,7 @@ int32_t Crypto_TC_ApplySecurity_Cam(const uint8_t *p_in_frame, const uint16_t in
11941194
*/
11951195
uint16_t index = TC_FRAME_HEADER_SIZE; // Frame header is 5 bytes
11961196

1197-
if (current_managed_parameters_struct.has_segmentation_hdr == TC_HAS_SEGMENT_HDRS)
1197+
if (tc_current_managed_parameters_struct.has_segmentation_hdr == TC_HAS_SEGMENT_HDRS)
11981198
{
11991199
index++; // Add 1 byte to index because segmentation header used for this gvcid.
12001200
}
@@ -1321,7 +1321,7 @@ int32_t Crypto_TC_ProcessSecurity(uint8_t *ingest, int *len_ingest, TC_t *tc_sdl
13211321
int32_t Crypto_TC_Parse_Check_FECF(uint8_t *ingest, int *len_ingest, TC_t *tc_sdls_processed_frame)
13221322
{
13231323
int32_t status = CRYPTO_LIB_SUCCESS;
1324-
if (current_managed_parameters_struct.has_fecf == TC_HAS_FECF)
1324+
if (tc_current_managed_parameters_struct.has_fecf == TC_HAS_FECF)
13251325
{
13261326
tc_sdls_processed_frame->tc_sec_trailer.fecf =
13271327
(((ingest[tc_sdls_processed_frame->tc_header.fl - 1] << 8) & 0xFF00) |
@@ -1665,7 +1665,7 @@ int32_t Crypto_TC_Prep_AAD(TC_t *tc_sdls_processed_frame, uint8_t fecf_len, uint
16651665
if ((sa_service_type == SA_AUTHENTICATION) || (sa_service_type == SA_AUTHENTICATED_ENCRYPTION))
16661666
{
16671667
uint16_t tc_mac_start_index = tc_sdls_processed_frame->tc_header.fl + 1 - fecf_len - sa_ptr->stmacf_len;
1668-
if (current_managed_parameters_struct.max_frame_size < tc_mac_start_index)
1668+
if (tc_current_managed_parameters_struct.max_frame_size < tc_mac_start_index)
16691669
{
16701670
status = CRYPTO_LIB_ERR_TC_FRAME_LENGTH_UNDERFLOW;
16711671
mc_if->mc_log(status);
@@ -1864,17 +1864,17 @@ void Crypto_TC_Get_Ciper_Mode_TCP(uint8_t sa_service_type, uint32_t *encryption_
18641864
**/
18651865
void Crypto_TC_Calc_Lengths(uint8_t *fecf_len, uint8_t *segment_hdr_len, uint8_t *ocf_len)
18661866
{
1867-
if (current_managed_parameters_struct.has_fecf == TC_NO_FECF)
1867+
if (tc_current_managed_parameters_struct.has_fecf == TC_NO_FECF)
18681868
{
18691869
*fecf_len = 0;
18701870
}
18711871

1872-
if (current_managed_parameters_struct.has_segmentation_hdr == TC_NO_SEGMENT_HDRS)
1872+
if (tc_current_managed_parameters_struct.has_segmentation_hdr == TC_NO_SEGMENT_HDRS)
18731873
{
18741874
*segment_hdr_len = 0;
18751875
}
18761876

1877-
if (current_managed_parameters_struct.has_ocf == TC_OCF_NA)
1877+
if (tc_current_managed_parameters_struct.has_ocf == TC_OCF_NA)
18781878
{
18791879
*ocf_len = 0;
18801880
}
@@ -1892,7 +1892,7 @@ void Crypto_TC_Calc_Lengths(uint8_t *fecf_len, uint8_t *segment_hdr_len, uint8_t
18921892
void Crypto_TC_Set_Segment_Header(TC_t *tc_sdls_processed_frame, uint8_t *ingest, int *byte_idx)
18931893
{
18941894
int byte_idx_tmp = *byte_idx;
1895-
if (current_managed_parameters_struct.has_segmentation_hdr == TC_HAS_SEGMENT_HDRS)
1895+
if (tc_current_managed_parameters_struct.has_segmentation_hdr == TC_HAS_SEGMENT_HDRS)
18961896
{
18971897
tc_sdls_processed_frame->tc_sec_header.sh = (uint8_t)ingest[*byte_idx];
18981898
byte_idx_tmp++;
@@ -1960,7 +1960,7 @@ int32_t Crypto_TC_ProcessSecurity_Cam(uint8_t *ingest, int *len_ingest, TC_t *tc
19601960
// Lookup-retrieve managed parameters for frame via gvcid:
19611961
status = Crypto_Get_Managed_Parameters_For_Gvcid(
19621962
tc_sdls_processed_frame->tc_header.tfvn, tc_sdls_processed_frame->tc_header.scid,
1963-
tc_sdls_processed_frame->tc_header.vcid, gvcid_managed_parameters_array, &current_managed_parameters_struct);
1963+
tc_sdls_processed_frame->tc_header.vcid, gvcid_managed_parameters_array, &tc_current_managed_parameters_struct);
19641964

19651965
if (status != CRYPTO_LIB_SUCCESS)
19661966
{

0 commit comments

Comments
 (0)