From 83e239455256924ce314b7f2bda6771b187b9316 Mon Sep 17 00:00:00 2001 From: cellframe <roman.khlopkov@demlabs.net> Date: Wed, 7 Dec 2022 15:49:36 +0300 Subject: [PATCH] [+] Emission sign get --- modules/common/dap_chain_datum_token.c | 55 ++++++++++++++----- .../common/include/dap_chain_datum_token.h | 1 + modules/mempool/dap_chain_mempool.c | 5 +- 3 files changed, 43 insertions(+), 18 deletions(-) diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c index 87b17712b2..fea2a34771 100644 --- a/modules/common/dap_chain_datum_token.c +++ b/modules/common/dap_chain_datum_token.c @@ -312,8 +312,6 @@ 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; - dap_sign_t *l_sign = NULL; - if (a_emission->data.type_auth.size > a_emission->data.type_auth.tsd_total_size) { size_t l_pub_key_size = 0; @@ -328,26 +326,53 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_ DAP_DELETE(l_pub_key); } - l_sign = dap_sign_create(a_sign_key, a_emission, sizeof(a_emission->hdr), 0); - if (!l_sign) + dap_sign_t *l_new_sign = dap_sign_create(a_sign_key, a_emission, sizeof(a_emission->hdr), 0); + if (!l_new_sign) return NULL; size_t l_emission_size = dap_chain_datum_emission_get_size((uint8_t *)a_emission); - dap_chain_datum_token_emission_t *l_ret = DAP_REALLOC(a_emission, l_emission_size + dap_sign_get_size(l_sign)); - size_t l_sign_size = dap_sign_get_size(l_sign); - memcpy(l_ret->tsd_n_signs + l_ret->data.type_auth.size, l_sign, l_sign_size); - DAP_DELETE(l_sign); + dap_chain_datum_token_emission_t *l_ret = DAP_REALLOC(a_emission, l_emission_size + dap_sign_get_size(l_new_sign)); + 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++; return l_ret; } -// #define DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE 0x0001 -// Extended declaration of privatetoken with in-time control -// #define DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL 0x0002 -// Token update -// #define DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE 0x0003 -// Open token with now ownership -// #define DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC 0x0004 +dap_sign_t *dap_chain_datum_emission_get_signs(dap_chain_datum_token_emission_t *a_emission, size_t *a_signs_count) { + if (!a_emission || !a_signs_count || a_emission->hdr.type != DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH) { + log_it(L_ERROR, "Parameters must be not-null!"); + return NULL; + } + if (!a_emission->data.type_auth.signs_count || a_emission->data.type_auth.size <= a_emission->data.type_auth.tsd_total_size) { + *a_signs_count = 0; + log_it(L_INFO, "No signes found"); + return NULL; + } + size_t l_expected_size = a_emission->data.type_auth.size - a_emission->data.type_auth.tsd_total_size, l_actual_size = 0; + /* First sign */ + dap_sign_t *l_sign = (dap_sign_t*)(a_emission->tsd_n_signs + a_emission->data.type_auth.tsd_total_size); + size_t l_count, l_sign_size; + for (l_count = 0, l_sign_size = 0; l_count < a_emission->data.type_auth.signs_count && (l_sign_size = dap_sign_get_size(l_sign)); ++l_count) { + if (!dap_sign_verify_size(l_sign, l_sign_size)) { + break; + } + l_actual_size += l_sign_size; + l_sign = (dap_sign_t *)((byte_t *)l_sign + l_sign_size); + } + if ((l_expected_size != l_actual_size) || (l_count < a_emission->data.type_auth.signs_count)) { + log_it(L_CRITICAL, "Malformed signs, only %lu of %hu are present (%lu != %lu)", l_count, a_emission->data.type_auth.signs_count, + l_actual_size, l_expected_size); + } + dap_sign_t *l_ret = DAP_NEW_Z_SIZE(dap_sign_t, l_actual_size); + if (!l_ret) { + log_it(L_CRITICAL, "Out of memory!"); + return NULL; + } + *a_signs_count = MIN(l_count, a_emission->data.type_auth.signs_count); + memcpy(l_ret, a_emission->tsd_n_signs + a_emission->data.type_auth.tsd_total_size, l_actual_size); + return l_ret; +} // 256 TYPE bool dap_chain_datum_token_is_old(uint8_t a_type) { diff --git a/modules/common/include/dap_chain_datum_token.h b/modules/common/include/dap_chain_datum_token.h index 7ca4b99375..7bf4a44af2 100644 --- a/modules/common/include/dap_chain_datum_token.h +++ b/modules/common/include/dap_chain_datum_token.h @@ -453,5 +453,6 @@ byte_t *dap_chain_emission_get_tsd(dap_chain_datum_token_emission_t *a_emission, dap_chain_datum_token_emission_t *dap_chain_datum_emission_read(byte_t *a_emission_serial, size_t *a_emission_size); size_t dap_chain_datum_emission_get_size(uint8_t *a_emission_serial); dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_t *a_sign_key, dap_chain_datum_token_emission_t *a_emission); +dap_sign_t *dap_chain_datum_emission_get_signs(dap_chain_datum_token_emission_t *a_emission, size_t *a_signs_count); // 256 TYPE bool dap_chain_datum_token_is_old(uint8_t a_type); diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index d5c8ab08d1..98f70b3323 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -697,7 +697,6 @@ char *dap_chain_mempool_base_tx_create(dap_chain_t *a_chain, dap_chain_hash_fast dap_chain_addr_t *a_addr_to, dap_cert_t **a_certs, size_t a_certs_count, const char *a_hash_out_type) { - char *l_gdb_group_mempool_base_tx = dap_chain_net_get_gdb_group_mempool_new(a_chain); // create first transaction (with tx_token) dap_chain_datum_tx_t *l_tx = DAP_NEW_Z_SIZE(dap_chain_datum_tx_t, sizeof(dap_chain_datum_tx_t)); l_tx->header.ts_created = time(NULL); @@ -782,7 +781,7 @@ dap_chain_datum_token_emission_t *dap_chain_mempool_datum_emission_extract(dap_c return NULL; if (l_token->type != DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL) return NULL; - int l_signs_valid = 0; + /*int l_signs_valid = 0; dap_sign_t *l_ems_sign = (dap_sign_t *)(l_emission->tsd_n_signs + l_emission->data.type_auth.tsd_total_size); for (int i = 0; i < l_emission->data.type_auth.signs_count; i++) { uint32_t l_ems_pkey_size = l_ems_sign->header.sign_pkey_size; @@ -798,7 +797,7 @@ dap_chain_datum_token_emission_t *dap_chain_mempool_datum_emission_extract(dap_c l_ems_sign = (dap_sign_t *)((byte_t *)l_ems_sign + dap_sign_get_size(l_ems_sign)); } if (l_signs_valid != l_emission->data.type_auth.signs_count) - return NULL; + return NULL;*/ return DAP_DUP_SIZE(l_emission, l_datum->header.data_size); } -- GitLab