From b577d23764efeea252b20e7d97811bf8f309b1d6 Mon Sep 17 00:00:00 2001
From: Roman Khlopkov <roman.khlopkov@demlabs.net>
Date: Mon, 20 Sep 2021 12:19:38 +0300
Subject: [PATCH] [+] Sign size calc

---
 dap-sdk/crypto/include/dap_sign.h                | 2 +-
 dap-sdk/crypto/src/dap_sign.c                    | 6 ++++--
 modules/chain/dap_chain_ledger.c                 | 6 +++++-
 modules/common/dap_chain_datum_tx.c              | 2 +-
 modules/consensus/dag-pos/dap_chain_cs_dag_pos.c | 5 +++--
 modules/net/srv/dap_chain_net_srv_order.c        | 5 +++--
 6 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/dap-sdk/crypto/include/dap_sign.h b/dap-sdk/crypto/include/dap_sign.h
index 0c01cfb7c6..4018361a65 100755
--- a/dap-sdk/crypto/include/dap_sign.h
+++ b/dap-sdk/crypto/include/dap_sign.h
@@ -127,7 +127,7 @@ uint8_t* dap_sign_get_sign(dap_sign_t *a_sign, size_t *a_sign_out);
 uint8_t* dap_sign_get_pkey(dap_sign_t *a_sign, size_t *a_pub_key_out);
 bool dap_sign_get_pkey_hash(dap_sign_t *a_sign, dap_chain_hash_fast_t * a_sign_hash);
 
-bool dap_sign_verify_size(dap_sign_t *a_sign);
+bool dap_sign_verify_size(dap_sign_t *a_sign, size_t a_max_key_size);
 dap_enc_key_t *dap_sign_to_enc_key(dap_sign_t * a_chain_sign);
 const char * dap_sign_type_to_str(dap_sign_type_t a_chain_sign_type);
 dap_sign_type_t dap_sign_type_from_str(const char * a_type_str);
diff --git a/dap-sdk/crypto/src/dap_sign.c b/dap-sdk/crypto/src/dap_sign.c
index c518366970..11c17df04a 100755
--- a/dap-sdk/crypto/src/dap_sign.c
+++ b/dap-sdk/crypto/src/dap_sign.c
@@ -315,10 +315,12 @@ bool dap_sign_get_pkey_hash(dap_sign_t *a_sign, dap_chain_hash_fast_t * a_sign_h
 }
 
 
-bool dap_sign_verify_size(dap_sign_t *a_sign)
+bool dap_sign_verify_size(dap_sign_t *a_sign, size_t a_max_key_size)
 {
     if (a_sign->header.sign_pkey_size > a_sign->header.sign_size)
         return false;
+    if (a_sign->header.sign_pkey_size > a_max_key_size)
+        return false;
     return true;
 }
 
@@ -349,7 +351,7 @@ dap_enc_key_t *dap_sign_to_enc_key(dap_sign_t * a_chain_sign)
  */
 int dap_sign_verify(dap_sign_t * a_chain_sign, const void * a_data, const size_t a_data_size)
 {
-    if (!a_chain_sign || !a_data || !dap_sign_verify_size(a_chain_sign))
+    if (!a_chain_sign || !a_data)
         return -2;
 
     dap_enc_key_t * l_key = dap_sign_to_enc_key(a_chain_sign);
diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index a21907184f..d9eaf907ae 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -1113,12 +1113,16 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, const dap_
                                 dap_sign_get_pkey_hash(l_sign,&l_sign_pkey_hash);
                                 // Find pkey in auth hashes
                                 for(uint16_t k=0; k< l_token_item->auth_signs_total; k++  ){
-                                    if ( dap_hash_fast_compare(&l_sign_pkey_hash, &l_token_item->auth_signs_pkey_hash[k]))
+                                    if ( dap_hash_fast_compare(&l_sign_pkey_hash, &l_token_item->auth_signs_pkey_hash[k])) {
                                         // Verify if its token emission header signed
+                                        if (!dap_sign_verify_size(l_sign, a_token_emission_size)) {
+                                            break;
+                                        }
                                         if( dap_sign_verify(l_sign,&a_token_emission->hdr, sizeof (a_token_emission) ) ){
                                             l_aproves++;
                                             break;
                                         }
+                                    }
                                 }
                                 l_offset+=l_sign_size;
                             }else
diff --git a/modules/common/dap_chain_datum_tx.c b/modules/common/dap_chain_datum_tx.c
index 2c8a7d8f45..6f48ec58ed 100644
--- a/modules/common/dap_chain_datum_tx.c
+++ b/modules/common/dap_chain_datum_tx.c
@@ -237,7 +237,7 @@ int dap_chain_datum_tx_verify_sign(dap_chain_datum_tx_t *tx)
                 log_it(L_WARNING,"Incorrect signature's header, possible corrupted data");
                 return -4;
             }
-            if(dap_sign_verify(l_sign, tx->tx_items, tx_items_pos) != 1) {
+            if (!dap_sign_verify_size(l_sign, tx_items_size) || dap_sign_verify(l_sign, tx->tx_items, tx_items_pos) != 1) {
                 // invalid signature
                 ret = 0;
                 tx_items_pos += l_item_tx_size;
diff --git a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
index 5e810d4c82..fc2be92cdd 100644
--- a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
+++ b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
@@ -238,8 +238,9 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_
             }
             size_t l_dag_event_size_without_sign = dap_chain_cs_dag_event_calc_size_excl_signs(a_dag_event,a_dag_event_size);
 
-            int l_sign_verify_ret = dap_sign_verify(l_sign,a_dag_event,l_dag_event_size_without_sign);
-            if ( l_sign_verify_ret != 0){
+            bool l_sign_verify_ret = dap_sign_verify_size(l_sign, a_dag_event_size) &&
+                    dap_sign_verify(l_sign,a_dag_event,l_dag_event_size_without_sign) == 0;
+            if ( !l_sign_verify_ret ){
                 log_it(L_WARNING, "Event's sign is incorrect: code %d", l_sign_verify_ret);
                 return -41;
 
diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c
index 9e1f98e2e0..a85237c4df 100644
--- a/modules/net/srv/dap_chain_net_srv_order.c
+++ b/modules/net/srv/dap_chain_net_srv_order.c
@@ -34,7 +34,7 @@
 #if DAP_SRV_STAKE_USED
 #include "dap_chain_net_srv_stake.h"
 #else
-static bool dap_chain_net_srv_stake_key_delegated() { return false; }
+static bool dap_chain_net_srv_stake_key_delegated(dap_chain_addr_t *a_addr) { UNUSED(a_addr); return false; }
 #endif
 //#include "dap_chain_net_srv_geoip.h"
 
@@ -535,7 +535,8 @@ static void s_srv_order_callback_notify(void *a_arg, const char a_op_code, const
             dap_chain_global_db_gr_del(dap_strdup(a_key), a_group);
         } else {
             dap_sign_t *l_sign = (dap_sign_t *)&l_order->ext[l_order->ext_size];
-            if (!dap_sign_verify(l_sign, l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size)) {
+            if (!dap_sign_verify_size(l_sign, a_value_len) ||
+                    dap_sign_verify(l_sign, l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size) != 1) {
                 dap_chain_global_db_gr_del(dap_strdup(a_key), a_group);
                 DAP_DELETE(l_gdb_group_str);
                 return;
-- 
GitLab