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