From 573608d537a7d67b89e16b176a1cde4ef07c3a7c Mon Sep 17 00:00:00 2001 From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net> Date: Thu, 14 Jan 2021 18:33:37 +0700 Subject: [PATCH] [+] One more fix of wrong import --- CMakeLists.txt | 2 +- dap-sdk/crypto/include/dap_enc_dilithium.h | 3 +- dap-sdk/crypto/src/dap_enc_dilithium.c | 124 +++++++++++++++++++-- 3 files changed, 118 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 91754f5a56..7aa013e15c 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-111") +set(CELLFRAME_SDK_NATIVE_VERSION "2.6-112") 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 96ade00a95..ac0752a75b 100755 --- a/dap-sdk/crypto/include/dap_enc_dilithium.h +++ b/dap-sdk/crypto/include/dap_enc_dilithium.h @@ -35,6 +35,7 @@ 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); +dilithium_signature_t* dap_enc_dilithium_read_signature_old2(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); @@ -43,5 +44,5 @@ dilithium_private_key_t* dap_enc_dilithium_read_private_key_old(const uint8_t *a dilithium_public_key_t* dap_enc_dilithium_read_public_key(const uint8_t *a_buf, size_t a_buflen); dilithium_public_key_t* dap_enc_dilithium_read_public_key_old(const uint8_t *a_buf, size_t a_buflen); - +dilithium_public_key_t* dap_enc_dilithium_read_public_key_old2(const uint8_t *a_buf, size_t a_buflen); #endif diff --git a/dap-sdk/crypto/src/dap_enc_dilithium.c b/dap-sdk/crypto/src/dap_enc_dilithium.c index f9a3f32447..c548ae2364 100755 --- a/dap-sdk/crypto/src/dap_enc_dilithium.c +++ b/dap-sdk/crypto/src/dap_enc_dilithium.c @@ -151,18 +151,18 @@ dilithium_signature_t* dap_enc_dilithium_read_signature(uint8_t *a_buf, size_t a log_it(L_ERROR,"::read_signature() NULL buffer on input"); return NULL; } - if(a_buflen < (sizeof(uint64_t) + sizeof(dilithium_kind_t) + sizeof (uint64_t) )){ + if(a_buflen < (sizeof(uint64_t) + sizeof(uint64_t) + sizeof (uint64_t) )){ log_it(L_ERROR,"::read_signature() Buflen %zd is smaller than first three fields(%zd)", a_buflen, sizeof(uint64_t) + sizeof(dilithium_kind_t) +sizeof (uint64_t) ); return NULL; } uint64_t l_shift_mem = 0; - dilithium_kind_t kind; + uint64_t kind; uint64_t l_buflen_internal = 0; memcpy(&l_buflen_internal, a_buf, sizeof(uint64_t)); l_shift_mem += sizeof(uint64_t); - memcpy(&kind, a_buf + l_shift_mem, sizeof(dilithium_kind_t)); + memcpy(&kind, a_buf + l_shift_mem, sizeof(uint64_t)); l_shift_mem += sizeof (dilithium_kind_t); if(l_buflen_internal != (uint64_t) a_buflen) return NULL ; @@ -185,6 +185,11 @@ dilithium_signature_t* dap_enc_dilithium_read_signature(uint8_t *a_buf, size_t a return dap_enc_dilithium_read_signature_old(a_buf,a_buflen); } + // Dirty hack for old 32 bit version serializations + if( l_sign->sig_len + l_shift_mem + 4 == (uint64_t) a_buflen ){ + return dap_enc_dilithium_read_signature_old2(a_buf,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 ); @@ -248,6 +253,53 @@ dilithium_signature_t* dap_enc_dilithium_read_signature_old(uint8_t *a_buf, size return l_sign; } +/** + * @brief dap_enc_dilithium_read_signature_old2 + * @param a_buf + * @param a_buflen + * @return + */ +dilithium_signature_t* dap_enc_dilithium_read_signature_old2(uint8_t *a_buf, size_t a_buflen) +{ + if( !a_buf || (a_buflen < (sizeof(uint32_t) + sizeof(uint64_t)) ) ) + return NULL ; + uint64_t kind=0; + uint32_t l_buflen_internal = 0; + memcpy(&l_buflen_internal, a_buf, sizeof(uint32_t)); + memcpy(&kind, a_buf + sizeof(uint32_t), sizeof(uint64_t)); + if(l_buflen_internal != (uint32_t) a_buflen) + return NULL ; + dilithium_param_t p; + if(!dilithium_params_init(&p, kind)) + return NULL ; + + dilithium_signature_t* l_sign = DAP_NEW(dilithium_signature_t); + if(!l_sign) + return NULL; + l_sign->kind =(dilithium_kind_t) kind; + uint64_t l_shift_mem = sizeof(uint32_t) + sizeof(uint64_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; +} + /* Serialize a private key. */ uint8_t* dap_enc_dilithium_write_private_key(const dilithium_private_key_t* a_private_key, size_t *a_buflen_out) @@ -396,6 +448,10 @@ dilithium_public_key_t* dap_enc_dilithium_read_public_key(const uint8_t *a_buf, 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); } + // Dirty hack to recognize old variant 2 + if (a_buflen +4 == (sizeof(uint64_t) + sizeof(dilithium_kind_t) + p.CRYPTO_PUBLICKEYBYTES )){ + return dap_enc_dilithium_read_public_key_old2(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, @@ -430,11 +486,11 @@ dilithium_public_key_t* dap_enc_dilithium_read_public_key(const uint8_t *a_buf, dilithium_public_key_t* dap_enc_dilithium_read_public_key_old(const uint8_t *a_buf, size_t a_buflen) { if (!a_buf){ - log_it(L_ERROR,"::read_public_key() NULL buffer on input"); + log_it(L_ERROR,"::read_public_key_old() NULL buffer on input"); return NULL; } 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) ); + log_it(L_ERROR,"::read_public_key_old() Buflen %zd is smaller than first two fields(%zd)", a_buflen,sizeof(uint32_t) + sizeof(uint32_t) ); return NULL; } @@ -445,8 +501,8 @@ dilithium_public_key_t* dap_enc_dilithium_read_public_key_old(const uint8_t *a_b if(l_buflen != (uint32_t) a_buflen) return NULL; dilithium_param_t p; - if(!dilithium_params_init(&p, kind)){ - log_it(L_ERROR,"::read_public_key() Can't find params for signature kind %d", kind); + if(!dilithium_params_init(&p, (dilithium_kind_t) kind)){ + log_it(L_ERROR,"::read_public_key_old() Can't find params for signature kind %d", kind); return NULL; } @@ -460,13 +516,63 @@ dilithium_public_key_t* dap_enc_dilithium_read_public_key_old(const uint8_t *a_b if(!l_public_key){ return NULL; } - memcpy(&l_public_key->kind+sizeof(uint32_t), &kind,sizeof (kind)); + memcpy(&l_public_key->kind, &kind,sizeof (l_public_key->kind)); + + l_public_key->data = DAP_NEW_Z_SIZE(unsigned char, p.CRYPTO_PUBLICKEYBYTES); + if(!l_public_key->data){ + DAP_DELETE(l_public_key); + return NULL; + } + memcpy(l_public_key->data, a_buf + sizeof(uint32_t) + sizeof(uint32_t), p.CRYPTO_PUBLICKEYBYTES); + return l_public_key; +} + +/** + * @brief dap_enc_dilithium_read_public_key_old2 + * @param a_buf + * @param a_buflen + * @return + */ +dilithium_public_key_t* dap_enc_dilithium_read_public_key_old2(const uint8_t *a_buf, size_t a_buflen) +{ + if (!a_buf){ + log_it(L_ERROR,"::read_public_key_old2() NULL buffer on input"); + return NULL; + } + if(a_buflen < (sizeof(uint32_t) + sizeof(uint32_t))){ + log_it(L_ERROR,"::read_public_key_old2() Buflen %zd is smaller than first two fields(%zd)", a_buflen,sizeof(uint32_t) + sizeof(uint32_t) ); + return NULL; + } + + uint64_t kind=0; + uint32_t l_buflen = 0; + memcpy(&l_buflen, a_buf, sizeof(uint32_t)); + memcpy(&kind, a_buf + sizeof(uint64_t), sizeof(uint64_t)); + if(l_buflen != (uint32_t) a_buflen) + return NULL; + dilithium_param_t p; + if(!dilithium_params_init(&p,(dilithium_kind_t) kind)){ + log_it(L_ERROR,"::read_public_key_old2() Can't find params for signature kind %d", kind); + return NULL; + } + + if(a_buflen < (sizeof(uint32_t) + sizeof(uint64_t) + p.CRYPTO_PUBLICKEYBYTES ) ){ + log_it(L_ERROR,"::read_public_key_old2() Buflen %zd is smaller than all fields together(%zd)", a_buflen, + sizeof(uint32_t) + sizeof(uint64_t) + p.CRYPTO_PUBLICKEYBYTES ); + return NULL; + } + + dilithium_public_key_t* l_public_key = DAP_NEW_Z(dilithium_public_key_t); + if(!l_public_key){ + return NULL; + } + memcpy(&l_public_key->kind, &kind,sizeof (l_public_key->kind)); l_public_key->data = DAP_NEW_Z_SIZE(unsigned char, p.CRYPTO_PUBLICKEYBYTES); if(!l_public_key->data){ DAP_DELETE(l_public_key); return NULL; } - memcpy(l_public_key->data, a_buf + sizeof(uint32_t) + sizeof(dilithium_kind_t), p.CRYPTO_PUBLICKEYBYTES); + memcpy(l_public_key->data, a_buf + sizeof(uint32_t) + sizeof(uint64_t), p.CRYPTO_PUBLICKEYBYTES); return l_public_key; } -- GitLab