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