diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c index c38d3e6d785749118f27a8c91c05fed5f84788df..4b10d01fd1c946098af9ba6885532a88abb98361 100644 --- a/modules/common/dap_chain_datum_token.c +++ b/modules/common/dap_chain_datum_token.c @@ -455,6 +455,39 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_ return l_ret; } +dap_chain_datum_token_emission_t *dap_chain_datum_emission_append_sign(dap_sign_t *a_sign, dap_chain_datum_token_emission_t *a_emission) +{ + if (!a_emission || a_emission->hdr.type != DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH) + return NULL; + + if (!a_sign) + return NULL; + + if (a_emission->data.type_auth.size > a_emission->data.type_auth.tsd_total_size) + { + dap_sign_t *l_sign = (dap_sign_t *)(a_emission->tsd_n_signs + a_emission->data.type_auth.tsd_total_size); + for (int i = 0; i < a_emission->data.type_auth.signs_count; i++) { + if (l_sign->header.sign_pkey_size == a_sign->header.sign_pkey_size && + !memcmp(l_sign->pkey_n_sign, a_sign->pkey_n_sign, l_sign->header.sign_pkey_size)) { + + log_it(L_ERROR, "such singature present"); + return a_emission; // this sign already exists + } + l_sign = (dap_sign_t *)((byte_t *)l_sign + dap_sign_get_size(l_sign)); + } + } + + 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(a_sign)); + size_t l_sign_size = dap_sign_get_size(a_sign); + memcpy(l_ret->tsd_n_signs + l_ret->data.type_auth.size, a_sign, l_sign_size); + + l_ret->data.type_auth.size += l_sign_size; + l_ret->data.type_auth.signs_count++; + return l_ret; +} + + 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!"); diff --git a/modules/common/include/dap_chain_datum_token.h b/modules/common/include/dap_chain_datum_token.h index 37210a4d2a5f88577c0aeedd8c4609e7eeb81740..2cd1b1060ba220353df0e5127ed9ed4b26d1910a 100644 --- a/modules/common/include/dap_chain_datum_token.h +++ b/modules/common/include/dap_chain_datum_token.h @@ -511,6 +511,8 @@ 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_chain_datum_token_emission_t *dap_chain_datum_emission_append_sign(dap_sign_t *a_sign, 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);