From def923e18212fdce0ea704b365b7e1ae81a09c1e Mon Sep 17 00:00:00 2001 From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net> Date: Tue, 12 Jan 2021 15:26:31 +0700 Subject: [PATCH] [!] More crypto fixes --- CMakeLists.txt | 2 +- dap-sdk/crypto/src/dap_enc_dilithium.c | 72 ++++++++++++++++---------- 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d3c8366257..00389be856 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-105") +set(CELLFRAME_SDK_NATIVE_VERSION "2.6-106") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") diff --git a/dap-sdk/crypto/src/dap_enc_dilithium.c b/dap-sdk/crypto/src/dap_enc_dilithium.c index b8d9371bb8..cf8ce98887 100755 --- a/dap-sdk/crypto/src/dap_enc_dilithium.c +++ b/dap-sdk/crypto/src/dap_enc_dilithium.c @@ -164,7 +164,7 @@ dilithium_signature_t* dap_enc_dilithium_read_signature(uint8_t *a_buf, size_t a 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) + if(l_buflen_internal != (uint64_t) a_buflen) return NULL ; dilithium_param_t p; if(!dilithium_params_init(&p, kind)) @@ -176,17 +176,17 @@ dilithium_signature_t* dap_enc_dilithium_read_signature(uint8_t *a_buf, size_t a 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); + log_it(L_ERROR,"::read_signature() Buflen inside signature %"DAP_UINT64_FORMAT_u" 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 ){ + if( l_sign->sig_len + l_shift_mem + 8 == (uint64_t) a_buflen ){ return dap_enc_dilithium_read_signature_old(a_buf,a_buflen); } - 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, + if( (uint64_t) a_buflen < (l_shift_mem + l_sign->sig_len) ){ + log_it(L_ERROR,"::read_signature() Buflen %zd is smaller than all fields together(%"DAP_UINT64_FORMAT_u")", a_buflen, l_shift_mem + l_sign->sig_len ); return NULL; } @@ -194,7 +194,7 @@ dilithium_signature_t* dap_enc_dilithium_read_signature(uint8_t *a_buf, size_t a 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); + log_it(L_ERROR,"::read_signature() Can't allocate sig_data %"DAP_UINT64_FORMAT_u" 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; @@ -209,13 +209,13 @@ dilithium_signature_t* dap_enc_dilithium_read_signature(uint8_t *a_buf, size_t a */ dilithium_signature_t* dap_enc_dilithium_read_signature_old(uint8_t *a_buf, size_t a_buflen) { - if( !a_buf || (a_buflen < (sizeof(uint32_t) + sizeof(dilithium_kind_t)) ) ) + if( !a_buf || (a_buflen < (sizeof(uint32_t) + sizeof(uint32_t)) ) ) return NULL ; - dilithium_kind_t kind; + uint32_t kind; uint32_t l_buflen_internal = 0; memcpy(&l_buflen_internal, a_buf, sizeof(uint32_t)); - memcpy(&kind, a_buf + sizeof(uint32_t), sizeof(dilithium_kind_t)); - if(l_buflen_internal != a_buflen) + memcpy(&kind, a_buf + sizeof(uint32_t), sizeof(uint32_t)); + if(l_buflen_internal != (uint32_t) a_buflen) return NULL ; dilithium_param_t p; if(!dilithium_params_init(&p, kind)) @@ -223,10 +223,24 @@ dilithium_signature_t* dap_enc_dilithium_read_signature_old(uint8_t *a_buf, size dilithium_signature_t* l_sign = DAP_NEW(dilithium_signature_t); l_sign->kind = kind; - size_t l_shift_mem = sizeof(uint32_t) + sizeof(dilithium_kind_t); + uint64_t l_shift_mem = sizeof(uint32_t) + sizeof(uint32_t); memcpy(&l_sign->sig_len, a_buf + l_shift_mem, sizeof(unsigned long long)); + if( l_sign->sig_len> (UINT64_MAX - l_shift_mem ) ){ + log_it(L_ERROR,"::read_signature_old() Buflen inside signature %"DAP_UINT64_FORMAT_u" is too big ", l_sign->sig_len); + return NULL; + } + + if( (uint64_t) a_buflen < (l_shift_mem + l_sign->sig_len) ){ + log_it(L_ERROR,"::read_signature_old() Buflen %zd is smaller than all fields together(%" DAP_UINT64_FORMAT_u")", a_buflen, + l_shift_mem + l_sign->sig_len ); + return NULL; + } + + l_shift_mem += sizeof(unsigned long long); l_sign->sig_data = DAP_NEW_SIZE(unsigned char, l_sign->sig_len); + if (!l_sign->sig_data) + log_it(L_ERROR,"::read_signature_old() Can't allocate sig_data %"DAP_UINT64_FORMAT_u" 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; @@ -288,7 +302,7 @@ dilithium_private_key_t* dap_enc_dilithium_read_private_key(const uint8_t *a_buf uint64_t l_buflen = 0; memcpy(&l_buflen, a_buf, sizeof(uint64_t)); memcpy(&kind, a_buf + sizeof(uint64_t), sizeof(dilithium_kind_t)); - if(l_buflen != a_buflen) + if(l_buflen != (uint64_t) a_buflen) return NULL; dilithium_param_t p; if(!dilithium_params_init(&p, kind)) @@ -311,20 +325,20 @@ dilithium_private_key_t* dap_enc_dilithium_read_private_key(const uint8_t *a_buf /* Deserialize a private key. */ dilithium_private_key_t* dap_enc_dilithium_read_private_key_old(const uint8_t *a_buf, size_t a_buflen) { - if(!a_buf || a_buflen < (sizeof(uint32_t) + sizeof(dilithium_kind_t))) + if(!a_buf || a_buflen < (sizeof(uint32_t) + sizeof(uint32_t))) return NULL; dilithium_kind_t kind; uint32_t l_buflen = 0; memcpy(&l_buflen, a_buf, sizeof(uint32_t)); - memcpy(&kind, a_buf + sizeof(uint32_t), sizeof(dilithium_kind_t)); - if(l_buflen != a_buflen) + memcpy(&kind, a_buf + sizeof(uint32_t), sizeof(uint32_t)); + if(l_buflen != (uint32_t) a_buflen) return NULL; dilithium_param_t p; if(!dilithium_params_init(&p, kind)) return NULL; - if(a_buflen < (sizeof(uint64_t) + sizeof(dilithium_kind_t) + p.CRYPTO_SECRETKEYBYTES ) ){ + if(a_buflen < (sizeof(uint32_t) + sizeof(uint32_t) + p.CRYPTO_SECRETKEYBYTES ) ){ log_it(L_ERROR,"::read_private_key() Buflen %zd is smaller than all fields together(%zd)", a_buflen, - sizeof(uint64_t) + sizeof(dilithium_kind_t) + p.CRYPTO_SECRETKEYBYTES ); + sizeof(uint32_t) + sizeof(uint32_t) + p.CRYPTO_SECRETKEYBYTES ); return NULL; } @@ -332,7 +346,7 @@ dilithium_private_key_t* dap_enc_dilithium_read_private_key_old(const uint8_t *a l_private_key->kind = kind; l_private_key->data = DAP_NEW_SIZE(unsigned char, p.CRYPTO_SECRETKEYBYTES); - memcpy(l_private_key->data, a_buf + sizeof(uint32_t) + sizeof(dilithium_kind_t), p.CRYPTO_SECRETKEYBYTES); + memcpy(l_private_key->data, a_buf + sizeof(uint32_t) + sizeof(uint32_t), p.CRYPTO_SECRETKEYBYTES); return l_private_key; } @@ -343,7 +357,7 @@ dilithium_public_key_t* dap_enc_dilithium_read_public_key(const uint8_t *a_buf, log_it(L_ERROR,"::read_public_key() NULL buffer on input"); return NULL; } - if(a_buflen < (sizeof(uint64_t) + sizeof(dilithium_kind_t))){ + if( a_buflen < (sizeof(uint64_t) + sizeof(dilithium_kind_t))){ 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; } @@ -352,8 +366,10 @@ dilithium_public_key_t* dap_enc_dilithium_read_public_key(const uint8_t *a_buf, uint64_t l_buflen = 0; memcpy(&l_buflen, a_buf, sizeof(uint64_t)); memcpy(&kind, a_buf + sizeof(uint64_t), sizeof(dilithium_kind_t)); - if(l_buflen != a_buflen){ - log_it(L_ERROR,"::read_public_key() Buflen field inside buffer is %u when expected to be %u", l_buflen, a_buflen); + + if(l_buflen != (uint64_t) a_buflen){ + log_it(L_ERROR,"::read_public_key() Buflen field inside buffer is %"DAP_UINT64_FORMAT_u" when expected to be %" DAP_UINT64_FORMAT_u, + l_buflen,(uint64_t) a_buflen); return NULL; } dilithium_param_t p; @@ -403,16 +419,16 @@ dilithium_public_key_t* dap_enc_dilithium_read_public_key_old(const uint8_t *a_b log_it(L_ERROR,"::read_public_key() NULL buffer on input"); return NULL; } - if(a_buflen < (sizeof(uint64_t) + sizeof(dilithium_kind_t))){ - 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) ); + if(a_buflen < (sizeof(uint32_t) + sizeof(uint32_t))){ + log_it(L_ERROR,"::read_public_key() Buflen %zd is smaller than first two fields(%zd)", a_buflen,sizeof(uint32_t) + sizeof(uint32_t) ); return NULL; } - dilithium_kind_t kind; + uint32_t kind; uint32_t l_buflen = 0; memcpy(&l_buflen, a_buf, sizeof(uint32_t)); - memcpy(&kind, a_buf + sizeof(uint32_t), sizeof(dilithium_kind_t)); - if(l_buflen != a_buflen) + memcpy(&kind, a_buf + sizeof(uint32_t), sizeof(uint32_t)); + if(l_buflen != (uint32_t) a_buflen) return NULL; dilithium_param_t p; if(!dilithium_params_init(&p, kind)){ @@ -420,9 +436,9 @@ dilithium_public_key_t* dap_enc_dilithium_read_public_key_old(const uint8_t *a_b return NULL; } - if(a_buflen < (sizeof(uint64_t) + sizeof(dilithium_kind_t) + p.CRYPTO_PUBLICKEYBYTES ) ){ + if(a_buflen < (sizeof(uint32_t) + sizeof(uint32_t) + p.CRYPTO_PUBLICKEYBYTES ) ){ log_it(L_ERROR,"::read_public_key_old() Buflen %zd is smaller than all fields together(%zd)", a_buflen, - sizeof(uint64_t) + sizeof(dilithium_kind_t) + p.CRYPTO_PUBLICKEYBYTES ); + sizeof(uint32_t) + sizeof(uint32_t) + p.CRYPTO_PUBLICKEYBYTES ); return NULL; } -- GitLab