diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index ab5d617d167682665721b6c2fbb9a57f7ab1aed4..661745602f9134e374b83c46ffd2d8e30e2dc940 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -2209,7 +2209,17 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ dap_sign_t *l_sign = (dap_sign_t *)(l_emission->tsd_n_signs + l_emission->data.type_auth.tsd_total_size); 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++) { + size_t l_sign_data_check_size = sizeof(l_emission->hdr); + size_t l_sign_auth_count = l_emission->data.type_auth.signs_count; + size_t l_sign_auth_size = l_emission->data.type_auth.size; + void *l_emi_ptr_check_size = &l_emission->hdr; + if (l_emission->hdr.version == 3) { + l_sign_data_check_size = sizeof(dap_chain_datum_token_emission_t) + l_emission->data.type_auth.tsd_total_size; + l_emission->data.type_auth.signs_count = 0; + l_emission->data.type_auth.size = 0; + l_emi_ptr_check_size = l_emission; + } + for (uint16_t i = 0; i < l_sign_auth_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); @@ -2217,7 +2227,7 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ 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) { + if (dap_sign_verify(l_sign, l_emi_ptr_check_size, l_sign_data_check_size) == 1) { l_aproves++; break; } @@ -2229,6 +2239,10 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ } else break; } + if (l_emission->hdr.version == 3) { + l_emission->data.type_auth.signs_count = l_sign_auth_count; + l_emission->data.type_auth.size = l_sign_auth_size; + } if (l_aproves < l_aproves_valid ){ if(s_debug_more) { char *l_balance = dap_chain_balance_print(l_emission->hdr.value_256); diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c index b6f4e5fdad1341b5b0a3c0fe77fb07314b0e6517..f41d9ee01c7284bfa3be820d195de7fd5dd64491 100644 --- a/modules/common/dap_chain_datum_token.c +++ b/modules/common/dap_chain_datum_token.c @@ -315,7 +315,7 @@ dap_sign_t ** dap_chain_datum_token_signs_parse(dap_chain_datum_token_t * a_datu dap_chain_datum_token_emission_t *dap_chain_datum_emission_create(uint256_t a_value, const char *a_ticker, dap_chain_addr_t *a_addr) { dap_chain_datum_token_emission_t *l_emission = DAP_NEW_Z(dap_chain_datum_token_emission_t); - l_emission->hdr.version = 2; + l_emission->hdr.version = 3; l_emission->hdr.value_256 = a_value; strncpy(l_emission->hdr.ticker, a_ticker, DAP_CHAIN_TICKER_SIZE_MAX - 1); l_emission->hdr.ticker[DAP_CHAIN_TICKER_SIZE_MAX - 1] = '\0'; @@ -407,6 +407,9 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_ if (!a_emission || a_emission->hdr.type != DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH) return NULL; + size_t l_signs_count = a_emission->data.type_auth.signs_count; + size_t l_old_signs_size = a_emission->data.type_auth.size; + if (a_emission->data.type_auth.size > a_emission->data.type_auth.tsd_total_size) { size_t l_pub_key_size = 0; @@ -420,8 +423,9 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_ } DAP_DELETE(l_pub_key); } - - dap_sign_t *l_new_sign = dap_sign_create(a_sign_key, a_emission, sizeof(a_emission->hdr), 0); + a_emission->data.type_auth.signs_count = 0; + a_emission->data.type_auth.size = 0; + dap_sign_t *l_new_sign = dap_sign_create(a_sign_key, a_emission, sizeof(dap_chain_datum_token_emission_t) + a_emission->data.type_auth.tsd_total_size, 0); if (!l_new_sign) return NULL; size_t l_emission_size = dap_chain_datum_emission_get_size((uint8_t *)a_emission); @@ -429,8 +433,10 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_ size_t l_sign_size = dap_sign_get_size(l_new_sign); memcpy(l_ret->tsd_n_signs + l_ret->data.type_auth.size, l_new_sign, l_sign_size); DAP_DELETE(l_new_sign); - l_ret->data.type_auth.size += l_sign_size; - l_ret->data.type_auth.signs_count++; + l_old_signs_size += l_sign_size; + l_signs_count++; + l_ret->data.type_auth.size = l_old_signs_size; + l_ret->data.type_auth.signs_count = l_signs_count; return l_ret; }