From cb66f6b271f686418f7e408232faf2500480765d Mon Sep 17 00:00:00 2001 From: xjin776_comcast Date: Mon, 16 Feb 2026 21:18:07 -0500 Subject: [PATCH] Fix 32-bit platform struct serialization issues - EC ElGamal: Convert sa_unwrap_parameters_ec_elgamal_s (uint64_t) to sa_unwrap_parameters_ec_elgamal (size_t) in ta.c - CENC: Fix size check to expect sa_subsample_length_s (16 bytes per entry) - CENC: Use converted subsample_length_s array in client serialization - Remove debug ERROR log with incorrect format specifier Fixes 586 test failures on 32-bit ARM platforms where size_t is 4 bytes but the wire protocol uses fixed 64-bit fields. --- .../src/clientimpl/src/sa_crypto_cipher_process.c | 1 - .../src/clientimpl/src/sa_process_common_encryption.c | 3 ++- reference/src/taimpl/src/internal/ta.c | 11 ++++++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/reference/src/clientimpl/src/sa_crypto_cipher_process.c b/reference/src/clientimpl/src/sa_crypto_cipher_process.c index a9a62c48..471e6006 100644 --- a/reference/src/clientimpl/src/sa_crypto_cipher_process.c +++ b/reference/src/clientimpl/src/sa_crypto_cipher_process.c @@ -159,7 +159,6 @@ sa_status sa_crypto_cipher_process( #endif // ENABLE_SVP *bytes_to_process = cipher_process->bytes_to_process; - ERROR("bytes_to_process = %d\n", cipher_process->bytes_to_process); } while (false); RELEASE_COMMAND(cipher_process); diff --git a/reference/src/clientimpl/src/sa_process_common_encryption.c b/reference/src/clientimpl/src/sa_process_common_encryption.c index 811c884c..308185df 100644 --- a/reference/src/clientimpl/src/sa_process_common_encryption.c +++ b/reference/src/clientimpl/src/sa_process_common_encryption.c @@ -117,7 +117,8 @@ sa_status sa_process_common_encryption( subsample_length_s[j].bytes_of_protected_data = samples[i].subsample_lengths[j].bytes_of_protected_data; } - CREATE_PARAM(param1, samples[i].subsample_lengths, param1_size); + // Fix for 32-bit: use the converted sa_subsample_length_s array, not the original + CREATE_PARAM(param1, subsample_length_s, param1_size); uint32_t param1_type = TA_PARAM_IN; size_t param2_size; uint32_t param2_type; diff --git a/reference/src/taimpl/src/internal/ta.c b/reference/src/taimpl/src/internal/ta.c index 5ff94f54..49f984d4 100644 --- a/reference/src/taimpl/src/internal/ta.c +++ b/reference/src/taimpl/src/internal/ta.c @@ -482,6 +482,7 @@ static sa_status ta_invoke_key_unwrap( sa_unwrap_parameters_aes_gcm_s parameters_aes_gcm_s; sa_unwrap_parameters_chacha20_s parameters_chacha_20_s; sa_unwrap_parameters_chacha20_poly1305_s parameters_chacha_20_poly_1305_s; + sa_unwrap_parameters_ec_elgamal_s parameters_ec_elgamal_s; sa_unwrap_parameters_rsa_oaep_s parameters_rsa_oaep_s; sa_unwrap_parameters_aes_cbc parameters_aes_cbc; sa_unwrap_parameters_aes_ctr parameters_aes_ctr; @@ -608,8 +609,11 @@ static sa_status ta_invoke_key_unwrap( return SA_STATUS_INVALID_PARAMETER; } - memcpy(¶meters_ec_elgamal, params[2].mem_ref, params[2].mem_ref_size); - algorithm_parameters = params[2].mem_ref; + // Fix for 32-bit platforms: convert uint64_t fields to size_t + memcpy(¶meters_ec_elgamal_s, params[2].mem_ref, params[2].mem_ref_size); + parameters_ec_elgamal.offset = (size_t)parameters_ec_elgamal_s.offset; + parameters_ec_elgamal.key_length = (size_t)parameters_ec_elgamal_s.key_length; + algorithm_parameters = ¶meters_ec_elgamal; break; case SA_CIPHER_ALGORITHM_RSA_OAEP: @@ -1826,7 +1830,8 @@ static sa_status ta_invoke_process_common_encryption( sa_sample sample; do { sample.subsample_count = process_common_encryption->subsample_count; - if (params[1].mem_ref_size != sizeof(sa_subsample_length) * sample.subsample_count) { + // Fix for 32-bit: client sends sa_subsample_length_s (uint64_t fields) + if (params[1].mem_ref_size != sizeof(sa_subsample_length_s) * sample.subsample_count) { ERROR("params[1].mem_ref_size is invalid"); return SA_STATUS_INVALID_PARAMETER; }