diff --git a/CMakeLists.txt b/CMakeLists.txt index 14dbd3d25f75521c3e45612c8fa8e52cefdf3599..d3c8366257fe9a78025b1b7858499bbed3b09ab8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cellframe-sdk C) cmake_minimum_required(VERSION 2.8) set(CMAKE_C_STANDARD 11) -set(CELLFRAME_SDK_NATIVE_VERSION "2.6-104") +set(CELLFRAME_SDK_NATIVE_VERSION "2.6-105") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") diff --git a/dap-sdk/crypto/include/dap_enc_dilithium.h b/dap-sdk/crypto/include/dap_enc_dilithium.h index e9352f3c9f026c0ed0b78626ffd886c3b297c23c..96ade00a959575bccac4339ab73553f2e131d81b 100755 --- a/dap-sdk/crypto/include/dap_enc_dilithium.h +++ b/dap-sdk/crypto/include/dap_enc_dilithium.h @@ -34,6 +34,8 @@ static inline size_t dap_enc_dilithium_calc_signagture_size(dilithium_signature_ uint8_t* dap_enc_dilithium_write_signature(dilithium_signature_t* a_sign, size_t *a_sign_out); dilithium_signature_t* dap_enc_dilithium_read_signature(uint8_t *a_buf, size_t a_buflen); +dilithium_signature_t* dap_enc_dilithium_read_signature_old(uint8_t *a_buf, size_t a_buflen); + uint8_t* dap_enc_dilithium_write_private_key(const dilithium_private_key_t* a_private_key, size_t *a_buflen_out); uint8_t* dap_enc_dilithium_write_public_key(const dilithium_public_key_t* a_public_key, size_t *a_buflen_out); dilithium_private_key_t* dap_enc_dilithium_read_private_key(const uint8_t *a_buf, size_t a_buflen); diff --git a/dap-sdk/crypto/src/dap_enc_dilithium.c b/dap-sdk/crypto/src/dap_enc_dilithium.c index 076b2b8cac4a6d83c0bbc8be6bb2029ab65d44ea..b8d9371bb8c3da326f937558326c83b3f2bcf2f6 100755 --- a/dap-sdk/crypto/src/dap_enc_dilithium.c +++ b/dap-sdk/crypto/src/dap_enc_dilithium.c @@ -157,10 +157,13 @@ dilithium_signature_t* dap_enc_dilithium_read_signature(uint8_t *a_buf, size_t a return NULL; } + uint64_t l_shift_mem = 0; dilithium_kind_t kind; uint64_t l_buflen_internal = 0; memcpy(&l_buflen_internal, a_buf, sizeof(uint64_t)); - memcpy(&kind, a_buf + sizeof(uint64_t), sizeof(dilithium_kind_t)); + l_shift_mem += sizeof(uint64_t); + memcpy(&kind, a_buf + l_shift_mem, sizeof(dilithium_kind_t)); + l_shift_mem += sizeof (dilithium_kind_t); if(l_buflen_internal != a_buflen) return NULL ; dilithium_param_t p; @@ -169,22 +172,30 @@ dilithium_signature_t* dap_enc_dilithium_read_signature(uint8_t *a_buf, size_t a dilithium_signature_t* l_sign = DAP_NEW(dilithium_signature_t); l_sign->kind = kind; - uint64_t l_shift_mem = sizeof(uint64_t) + sizeof(dilithium_kind_t); memcpy(&l_sign->sig_len, a_buf + l_shift_mem, sizeof(uint64_t)); + l_shift_mem += sizeof(uint64_t); + + if( l_sign->sig_len> (UINT64_MAX - l_shift_mem ) ){ + log_it(L_ERROR,"::read_signature() Buflen inside signature %zd is too big ", l_sign->sig_len); + return NULL; + } + + // Dirty hack for old 32 bit version serializations + if( l_sign->sig_len + l_shift_mem + 8 == a_buflen ){ + return dap_enc_dilithium_read_signature_old(a_buf,a_buflen); + } - if( ( l_sign->sig_len> (UINT64_MAX - sizeof(uint64_t) + sizeof(dilithium_kind_t) +sizeof (uint64_t))) || - ( a_buflen < (sizeof(uint64_t) + sizeof(dilithium_kind_t) +sizeof (uint64_t) + l_sign->sig_len )) - ){ + if( a_buflen < (l_shift_mem + l_sign->sig_len) ){ log_it(L_ERROR,"::read_signature() Buflen %zd is smaller than all fields together(%zd)", a_buflen, - sizeof(uint64_t) + sizeof(dilithium_kind_t) + l_sign->sig_len ); + l_shift_mem + l_sign->sig_len ); return NULL; } + l_shift_mem+= l_sign->sig_len; - - l_shift_mem += sizeof(uint64_t); l_sign->sig_data = DAP_NEW_SIZE(unsigned char, l_sign->sig_len); if (!l_sign->sig_data) log_it(L_ERROR,"::read_signature() Can't allocate sig_data %zd size", l_sign->sig_len); + memcpy(l_sign->sig_data, a_buf + l_shift_mem, l_sign->sig_len); l_shift_mem += l_sign->sig_len; return l_sign; @@ -263,6 +274,11 @@ dilithium_private_key_t* dap_enc_dilithium_read_private_key(const uint8_t *a_buf return NULL; } + // Dirty hack to recognize old variant + if (a_buflen +8 == (sizeof(uint64_t) + sizeof(dilithium_kind_t))){ + return dap_enc_dilithium_read_private_key_old(a_buf,a_buflen); + } + if(a_buflen < (sizeof(uint64_t) + sizeof(dilithium_kind_t))){ log_it(L_ERROR,"::read_private_key() Buflen %zd is smaller than first two fields(%zd)", a_buflen,sizeof(uint64_t) + sizeof(dilithium_kind_t) ); return NULL; @@ -331,6 +347,7 @@ dilithium_public_key_t* dap_enc_dilithium_read_public_key(const uint8_t *a_buf, log_it(L_ERROR,"::read_public_key() Buflen %zd is smaller than first two fields(%zd)", a_buflen,sizeof(uint64_t) + sizeof(dilithium_kind_t) ); return NULL; } + dilithium_kind_t kind = 0; uint64_t l_buflen = 0; memcpy(&l_buflen, a_buf, sizeof(uint64_t)); @@ -345,6 +362,11 @@ dilithium_public_key_t* dap_enc_dilithium_read_public_key(const uint8_t *a_buf, return NULL; } + // Dirty hack to recognize old variant + if (a_buflen +8 == (sizeof(uint64_t) + sizeof(dilithium_kind_t) + p.CRYPTO_PUBLICKEYBYTES )){ + return dap_enc_dilithium_read_public_key_old(a_buf,a_buflen); + } + if(a_buflen < (sizeof(uint64_t) + sizeof(dilithium_kind_t) + p.CRYPTO_PUBLICKEYBYTES ) ){ log_it(L_ERROR,"::read_public_key() Buflen %zd is smaller than all fields together(%zd)", a_buflen, sizeof(uint64_t) + sizeof(dilithium_kind_t) + p.CRYPTO_PUBLICKEYBYTES );