diff --git a/dap-sdk/crypto/src/dap_enc_dilithium.c b/dap-sdk/crypto/src/dap_enc_dilithium.c index bf6ddd748c24db928c2f96e2a2eb4e8e059c5dd7..bf35a074976241b0fa7add50ee1eae2f9d3b4f7f 100755 --- a/dap-sdk/crypto/src/dap_enc_dilithium.c +++ b/dap-sdk/crypto/src/dap_enc_dilithium.c @@ -88,7 +88,7 @@ size_t dap_enc_sig_dilithium_verify_sign(struct dap_enc_key * key, const void * if( l_ret != 0) log_it(L_WARNING,"Wrong signature, can't open with code %d", l_ret); - return l_ret>0? l_ret : 0; + return l_ret < 0 ? l_ret : 0; } void dap_enc_sig_dilithium_key_delete(struct dap_enc_key * key) diff --git a/dap-sdk/crypto/src/dap_enc_tesla.c b/dap-sdk/crypto/src/dap_enc_tesla.c index a67cb0618fe84f26f2ebc8c86304d56a8e6b1057..54e40d2e09639b0d264d6fee6e38040453170db6 100755 --- a/dap-sdk/crypto/src/dap_enc_tesla.c +++ b/dap-sdk/crypto/src/dap_enc_tesla.c @@ -94,7 +94,7 @@ size_t dap_enc_sig_tesla_verify_sign(struct dap_enc_key * key, const void * msg, { if(signature_size < sizeof(tesla_signature_t)) { log_it(L_ERROR, "bad signature size"); - return 0; + return -6; } return (tesla_crypto_sign_open((tesla_signature_t *) signature, (unsigned char *) msg, msg_size, key->pub_key_data)); diff --git a/dap-sdk/crypto/src/dap_sign.c b/dap-sdk/crypto/src/dap_sign.c index 2582d4b1c3a29452a9c377a8c96ef986ae510074..7c64420b0b4202cb9cbf8d8a7a5a3e0332b0667b 100755 --- a/dap-sdk/crypto/src/dap_sign.c +++ b/dap-sdk/crypto/src/dap_sign.c @@ -410,7 +410,7 @@ int dap_sign_verify(dap_sign_t * a_chain_sign, const void * a_data, const size_t case DAP_ENC_KEY_TYPE_SIG_TESLA: case DAP_ENC_KEY_TYPE_SIG_PICNIC: case DAP_ENC_KEY_TYPE_SIG_DILITHIUM: - if(l_key->dec_na(l_key, a_data, a_data_size, l_sign_data, l_sign_data_size) > 0) + if(l_key->dec_na(l_key, a_data, a_data_size, l_sign_data, l_sign_data_size) < 0) l_ret = 0; else l_ret = 1; diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 2c86cc2d6d01b2cddc1533dc8775758123827f69..c7eacc0addd47f215c6234d13a0648b58df54e6a 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -370,7 +370,7 @@ int dap_chain_ledger_token_add(dap_ledger_t * a_ledger, dap_chain_datum_token_t l_token_item->type = a_token->type; switch(a_token->type){ case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: { - l_token_item->total_supply = a_token->header_private.total_supply;\ + l_token_item->total_supply = a_token->header_private.total_supply; l_token_item->auth_signs= dap_chain_datum_token_simple_signs_parse(a_token,a_token_size, &l_token_item->auth_signs_total, &l_token_item->auth_signs_valid ); @@ -405,7 +405,7 @@ int dap_chain_ledger_token_add(dap_ledger_t * a_ledger, dap_chain_datum_token_t log_it(L_WARNING,"Unknown token declaration type 0x%04X", a_token->type ); } // Proc emissions tresholds - s_treshold_emissions_proc( a_ledger); + //s_treshold_emissions_proc( a_ledger); //TODO process thresholds only for no-consensus chains return 0; } @@ -979,6 +979,16 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) pthread_rwlock_init(&l_token_item->token_emissions_rwlock, NULL); if (l_token_item->datum_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE) { l_token_item->total_supply = l_token_item->datum_token->header_private.total_supply; + l_token_item->auth_signs= dap_chain_datum_token_simple_signs_parse(l_token_item->datum_token, l_objs[i].value_len, + &l_token_item->auth_signs_total, + &l_token_item->auth_signs_valid ); + if (l_token_item->auth_signs_total) { + l_token_item->auth_signs_pkey_hash = DAP_NEW_Z_SIZE(dap_chain_hash_fast_t, + sizeof(dap_chain_hash_fast_t) * l_token_item->auth_signs_total); + for (uint16_t k=0; k < l_token_item->auth_signs_total; k++) { + dap_sign_get_pkey_hash(l_token_item->auth_signs[k], &l_token_item->auth_signs_pkey_hash[k]); + } + } } HASH_ADD_STR(l_ledger_pvt->tokens, ticker, l_token_item); if (i == l_objs_count - 1) { @@ -1112,7 +1122,7 @@ dap_ledger_t* dap_chain_ledger_create(uint16_t a_check_flags, char *a_net_name) int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size) { - int ret = 0; + int l_ret = 0; dap_ledger_private_t *l_ledger_priv = PVT(a_ledger); const char * c_token_ticker = ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.ticker; @@ -1139,70 +1149,67 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ if(s_debug_more) log_it(L_ERROR, "Can't add token emission datum of %"DAP_UINT64_FORMAT_U" %s ( %s ): already present in cache", l_token_emission_item->datum_token_emission->hdr.value, c_token_ticker, l_hash_str); - ret = -1; + l_ret = -1; }else if ( (! l_token_item) && ( l_threshold_emissions_count >= s_treshold_emissions_max)) { if(s_debug_more) log_it(L_WARNING,"Treshold for emissions is overfulled (%zu max)", s_treshold_emissions_max); - ret = -2; - }else{ // Chech emission correctness - size_t l_emission_size = a_token_emission_size; - dap_chain_datum_token_emission_t *l_emission = dap_chain_datum_emission_read(a_token_emission, &l_emission_size); - switch (l_emission->hdr.type){ - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH:{ - dap_chain_ledger_token_item_t *l_token_item=NULL; - pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock); - HASH_FIND_STR(PVT(a_ledger)->tokens, l_emission->hdr.ticker, l_token_item); - pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock); - if (l_token_item){ - assert(l_token_item->datum_token); - dap_sign_t * l_sign =(dap_sign_t*) l_emission->data.type_auth.signs; - size_t l_offset= (byte_t*)l_emission - (byte_t*) l_sign; - uint16_t l_aproves = 0, l_aproves_valid = l_token_item->auth_signs_valid; - - for (uint16_t i=0; i <l_emission->data.type_auth.signs_count && l_offset < l_emission_size; i++){ - size_t l_sign_size = dap_sign_get_size(l_sign); - l_sign = (dap_sign_t*) ((byte_t*) l_sign + l_sign_size); - if (UINT16_MAX-l_offset> l_sign_size ){ - dap_chain_hash_fast_t l_sign_pkey_hash; - 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])) { - // Verify if its token emission header signed - if (!dap_sign_verify_size(l_sign, l_emission_size)) { - break; - } - if (dap_sign_verify(l_sign, &l_emission->hdr, sizeof(l_emission)) == 1) { - l_aproves++; - break; - } + l_ret = -2; + } + DAP_DELETE(l_hash_str); + if (l_ret || !PVT(a_ledger)->check_token_emission) + return l_ret; + // Check emission correctness + size_t l_emission_size = a_token_emission_size; + dap_chain_datum_token_emission_t *l_emission = dap_chain_datum_emission_read(a_token_emission, &l_emission_size); + switch (l_emission->hdr.type){ + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH:{ + dap_chain_ledger_token_item_t *l_token_item=NULL; + pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock); + HASH_FIND_STR(PVT(a_ledger)->tokens, l_emission->hdr.ticker, l_token_item); + pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock); + if (l_token_item){ + assert(l_token_item->datum_token); + dap_sign_t *l_sign = (dap_sign_t *)l_emission->data.type_auth.signs; + size_t l_offset = (byte_t *)l_sign - (byte_t *)l_emission; + uint16_t l_aproves = 0, l_aproves_valid = l_token_item->auth_signs_valid; + for (uint16_t i = 0; i < l_emission->data.type_auth.signs_count && l_offset < l_emission_size; i++) { + if (dap_sign_verify_size(l_sign, l_emission_size - l_offset)) { + dap_chain_hash_fast_t l_sign_pkey_hash; + 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])) { + // Verify if its token emission header signed + if (dap_sign_verify(l_sign, &l_emission->hdr, sizeof(l_emission->hdr)) == 1) { + l_aproves++; + break; } } - l_offset+=l_sign_size; - }else - l_offset = UINT16_MAX; - } + } + size_t l_sign_size = dap_sign_get_size(l_sign); + l_offset += l_sign_size; + l_sign = (dap_sign_t *)((byte_t *)l_emission + l_offset); + } else + break; + } - if (l_aproves < l_aproves_valid ){ - if(s_debug_more) - log_it(L_WARNING, "Emission of %"DAP_UINT64_FORMAT_U" datoshi of %s:%s is wrong: only %u valid aproves when %u need", - l_emission->hdr.value, a_ledger->net_name, l_emission->hdr.ticker, l_aproves, l_aproves_valid ); - ret = -3; - } - }else{ + if (l_aproves < l_aproves_valid ){ if(s_debug_more) - log_it(L_WARNING,"Can't find token declaration %s:%s thats pointed in token emission datum", a_ledger->net_name, l_emission->hdr.ticker); - ret = DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN; + log_it(L_WARNING, "Emission of %"DAP_UINT64_FORMAT_U" datoshi of %s:%s is wrong: only %u valid aproves when %u need", + l_emission->hdr.value, a_ledger->net_name, l_emission->hdr.ticker, l_aproves, l_aproves_valid ); + l_ret = -3; } - }break; - default:{} - } - DAP_DELETE(l_emission); + }else{ + if(s_debug_more) + log_it(L_WARNING,"Can't find token declaration %s:%s thats pointed in token emission datum", a_ledger->net_name, l_emission->hdr.ticker); + l_ret = DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN; + } + }break; + default:{} } - DAP_DELETE(l_hash_str); - - return ret; + DAP_DELETE(l_emission); + return l_ret; } /** diff --git a/modules/consensus/block-poa/dap_chain_cs_block_poa.c b/modules/consensus/block-poa/dap_chain_cs_block_poa.c index f77f7395b21357b9a8a35c093d1119ad4648ca50..3ee2f2763ac720aee661543967cfde8dd18cc4cb 100644 --- a/modules/consensus/block-poa/dap_chain_cs_block_poa.c +++ b/modules/consensus/block-poa/dap_chain_cs_block_poa.c @@ -333,6 +333,7 @@ static int s_callback_block_verify(dap_chain_cs_blocks_t * a_blocks, dap_chain_b break; } } + //TODO verify sign itself l_offset += l_sign_size; l_sign = (dap_sign_t *)(a_block->meta_n_datum_n_sign + l_offset); } diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 13f89ff40cbe22a1ccbfc68ce4235f9a8e174d4f..5fc33561f7336b47b3cf8654e0de609d62d8bec0 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -1721,7 +1721,6 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) case NODE_ROLE_ROOT_MASTER: case NODE_ROLE_ROOT: case NODE_ROLE_ARCHIVE: - l_ledger_flags |= DAP_CHAIN_LEDGER_CHECK_TOKEN_EMISSION; case NODE_ROLE_MASTER: l_ledger_flags |= DAP_CHAIN_LEDGER_CHECK_CELLS_DS; case NODE_ROLE_CELL_MASTER: diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 4090528d68cfbaf274c47e767e33719e33f8f9d5..9bc515534a8bbeb88fc53cef3252ae0de4e051c2 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -3300,10 +3300,11 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply) memcpy(&l_emission->hdr.address, l_addr, sizeof(l_emission->hdr.address)); time_t l_time = time(NULL); memcpy(&l_emission->hdr.nonce, &l_time, sizeof(time_t)); + l_emission->data.type_auth.signs_count = l_certs_size; // Then add signs size_t l_offset = 0; for(size_t i = 0; i < l_certs_size; i++) { - dap_sign_t * l_sign = dap_cert_sign(l_certs[i], &l_emission->hdr, + dap_sign_t *l_sign = dap_cert_sign(l_certs[i], &l_emission->hdr, sizeof(l_emission->hdr), 0); size_t l_sign_size = dap_sign_get_size(l_sign); l_emission_size += l_sign_size; diff --git a/modules/service/stake/dap_chain_net_srv_stake.c b/modules/service/stake/dap_chain_net_srv_stake.c index ea3594eff8f126b8fa926597f550813b5053d332..f913f7f3bcd254ef72e7b559fc97953080c37406 100644 --- a/modules/service/stake/dap_chain_net_srv_stake.c +++ b/modules/service/stake/dap_chain_net_srv_stake.c @@ -538,7 +538,7 @@ dap_chain_net_srv_stake_item_t *s_stake_item_from_order(dap_chain_net_t *a_net, } dap_srv_stake_order_ext_t *l_ext = (dap_srv_stake_order_ext_t *)a_order->ext; dap_sign_t *l_sign = (dap_sign_t *)(&a_order->ext[a_order->ext_size]); - if (!dap_sign_verify(l_sign, a_order, dap_chain_net_srv_order_get_size(a_order))) { + if (dap_sign_verify(l_sign, a_order, dap_chain_net_srv_order_get_size(a_order)) != 1) { log_it(L_WARNING, "Order sign is invalid"); return NULL; }