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