From e4c976bc48cc7739655172ba3a9dcba4ac5f9d37 Mon Sep 17 00:00:00 2001 From: "pavel.uhanov" <pavel.uhanov@demlabs.net> Date: Fri, 28 Feb 2025 14:30:43 +0300 Subject: [PATCH 1/3] [*] add pkey arg to sign verify --- crypto/include/dap_sign.h | 53 ++++++++++++++++++++++++++------------- crypto/src/dap_sign.c | 25 +++++------------- 2 files changed, 42 insertions(+), 36 deletions(-) diff --git a/crypto/include/dap_sign.h b/crypto/include/dap_sign.h index 36142a9d0..2e20ce1ae 100755 --- a/crypto/include/dap_sign.h +++ b/crypto/include/dap_sign.h @@ -58,7 +58,7 @@ typedef uint32_t dap_sign_type_enum_t; #define DAP_SIGN_HASH_TYPE_SIGN 0x0e #define DAP_SIGN_HASH_TYPE_DEFAULT 0x0f // not transferred in network, first try use sign hash, if false, use s_sign_hash_type_default -#define DAP_SIGN_PKEY_HASHING_FLAG ((uint32_t)1 << 7) +#define DAP_SIGN_PKEY_HASHING_FLAG BIT(7) #define DAP_SIGN_ADD_PKEY_HASHING_FLAG(a) ((a) | DAP_SIGN_PKEY_HASHING_FLAG) #define DAP_SIGN_REMOVE_PKEY_HASHING_FLAG(a) ((a) & ~DAP_SIGN_PKEY_HASHING_FLAG) #define DAP_SIGN_GET_PKEY_HASHING_FLAG(a) ((a) & DAP_SIGN_PKEY_HASHING_FLAG) @@ -96,19 +96,23 @@ extern "C" { int dap_sign_init(uint8_t a_sign_hash_type_default); uint64_t dap_sign_get_size(dap_sign_t * a_chain_sign); - -int dap_sign_verify (dap_sign_t * a_chain_sign, const void * a_data, const size_t a_data_size); -bool dap_sign_verify_size(dap_sign_t *a_sign, size_t a_max_sign_size); +int dap_sign_verify_by_pkey(dap_sign_t *a_chain_sign, const void *a_data, const size_t a_data_size, dap_pkey_t *a_pkey); +DAP_STATIC_INLINE int dap_sign_verify (dap_sign_t *a_chain_sign, const void *a_data, const size_t a_data_size) +{ + return dap_sign_verify_by_pkey(a_chain_sign, a_data, a_data_size, NULL); +} /** - * @brief dap_sign_verify_data - * @param a_chain_sign - * @param a_data - * @param a_data_size - * @return + * @brief verify, if a_sign->header.sign_pkey_size and a_sign->header.sign_size bigger, then a_max_key_size + * @param a_sign signed data object + * @param a_max_sign_size max size of signature + * @return 0 if pass, otjer if not */ -static inline bool dap_sign_verify_data (dap_sign_t * a_chain_sign, const void * a_data, const size_t a_data_size){ - return !dap_sign_verify(a_chain_sign, a_data, a_data_size); +DAP_STATIC_INLINE int dap_sign_verify_size(dap_sign_t *a_sign, size_t a_max_sign_size) +{ + return !(a_sign && (a_max_sign_size > sizeof(dap_sign_t)) && (a_sign->header.sign_size) && + (a_sign->header.sign_pkey_size) && (a_sign->header.type.type != SIG_TYPE_NULL) && + ((uint64_t)a_sign->header.sign_size + a_sign->header.sign_pkey_size + sizeof(dap_sign_t) <= (uint64_t)a_max_sign_size)); } /** @@ -119,13 +123,11 @@ static inline bool dap_sign_verify_data (dap_sign_t * a_chain_sign, const void * * @param a_data_size * @return */ -static inline int dap_sign_verify_all(dap_sign_t * a_sign, const size_t a_sign_size_max, const void * a_data, const size_t a_data_size) +DAP_STATIC_INLINE int dap_sign_verify_all(dap_sign_t *a_sign, const size_t a_sign_size_max, const void * a_data, const size_t a_data_size) { - if( a_sign_size_max < sizeof(dap_sign_t)){ - return -3; - }else if ( ! dap_sign_verify_size(a_sign,a_sign_size_max) ){ + if ( dap_sign_verify_size(a_sign,a_sign_size_max) ) { return -2; - }else if (! dap_sign_verify_data(a_sign,a_data, a_data_size) ){ + } else if ( dap_sign_verify(a_sign,a_data, a_data_size) ) { return -1; } return 0; @@ -155,7 +157,14 @@ uint8_t* dap_sign_get_pkey(dap_sign_t *a_sign, size_t *a_pub_key_out); bool dap_sign_get_pkey_hash(dap_sign_t *a_sign, dap_chain_hash_fast_t *a_sign_hash); bool dap_sign_compare_pkeys(dap_sign_t *l_sign1, dap_sign_t *l_sign2); -dap_enc_key_t *dap_sign_to_enc_key(dap_sign_t * a_chain_sign); +dap_enc_key_t *dap_sign_to_enc_key_by_pkey(dap_sign_t *a_chain_sign, dap_pkey_t *a_pkey); +DAP_STATIC_INLINE dap_enc_key_t *dap_sign_to_enc_key(dap_sign_t * a_chain_sign) +{ + return dap_sign_to_enc_key_by_pkey(a_chain_sign, NULL); +} + + + const char * dap_sign_type_to_str(dap_sign_type_t a_chain_sign_type); dap_sign_type_t dap_sign_type_from_str(const char * a_type_str); bool dap_sign_type_is_depricated(dap_sign_type_t a_sign_type); @@ -166,6 +175,16 @@ void dap_sign_get_information_json(json_object* a_json_arr_reply, dap_sign_t* a_ int dap_sign_set_pkey_by_hash_callback (dap_sign_callback_t a_callback); +/** + * @brief get SHA3 hash of buffer (a_sign), storing in output buffer a_sign_hash + * @param a_sign to check + * @return true or false + */ +DAP_STATIC_INLINE bool dap_sign_is_use_pkey_hash(dap_sign_t *a_sign) +{ + return a_sign && DAP_SIGN_GET_PKEY_HASHING_FLAG(a_sign->header.hash_type); +} + #ifdef __cplusplus } #endif diff --git a/crypto/src/dap_sign.c b/crypto/src/dap_sign.c index 33b95feca..693344cae 100755 --- a/crypto/src/dap_sign.c +++ b/crypto/src/dap_sign.c @@ -405,34 +405,20 @@ bool dap_sign_compare_pkeys(dap_sign_t *l_sign1, dap_sign_t *l_sign2) return (l_pkey_ser_size1 == l_pkey_ser_size2) && !memcmp(l_pkey_ser1, l_pkey_ser2, l_pkey_ser_size1); } -/** - * @brief verify, if a_sign->header.sign_pkey_size and a_sign->header.sign_size bigger, then a_max_key_size - * - * @param a_sign signed data object - * @param a_max_sign_size max size of signature - * @return true - * @return false - */ -bool dap_sign_verify_size(dap_sign_t *a_sign, size_t a_max_sign_size) -{ - return (a_max_sign_size > sizeof(dap_sign_t)) && (a_sign->header.sign_size) && - (a_sign->header.sign_pkey_size) && (a_sign->header.type.type != SIG_TYPE_NULL) && - ((uint64_t)a_sign->header.sign_size + a_sign->header.sign_pkey_size + sizeof(dap_sign_t) <= (uint64_t)a_max_sign_size); -} /** * @brief get deserialized pub key from dap_sign_t - * * @param a_chain_sign dap_sign_t object + * @param a_pkey * @return dap_enc_key_t* */ -dap_enc_key_t *dap_sign_to_enc_key(dap_sign_t * a_chain_sign) +dap_enc_key_t *dap_sign_to_enc_key_by_pkey(dap_sign_t *a_chain_sign, dap_pkey_t *a_pkey) { dap_enc_key_type_t l_type = dap_sign_type_to_key_type(a_chain_sign->header.type); dap_return_val_if_pass(l_type == DAP_ENC_KEY_TYPE_INVALID, NULL); size_t l_pkey_size = 0; - uint8_t *l_pkey = dap_sign_get_pkey(a_chain_sign, &l_pkey_size); + uint8_t *l_pkey = a_pkey ? a_pkey->pkey : dap_sign_get_pkey(a_chain_sign, &l_pkey_size); dap_enc_key_t * l_ret = dap_enc_key_new(l_type); // deserialize public key if (dap_enc_key_deserialize_pub_key(l_ret, l_pkey, l_pkey_size)) { @@ -447,13 +433,14 @@ dap_enc_key_t *dap_sign_to_enc_key(dap_sign_t * a_chain_sign) * @param a_chain_sign dap_sign_t a_chain_sign object * @param a_data const void * buffer with data * @param a_data_size const size_t buffer size + * @param a_pkey pkey to verofy sign * @return 0 valid signature, else invalid signature with error code */ -int dap_sign_verify(dap_sign_t *a_chain_sign, const void *a_data, const size_t a_data_size) +int dap_sign_verify_by_pkey(dap_sign_t *a_chain_sign, const void *a_data, const size_t a_data_size, dap_pkey_t *a_pkey) { dap_return_val_if_pass(!a_chain_sign || !a_data, -2); - dap_enc_key_t *l_key = dap_sign_to_enc_key(a_chain_sign); + dap_enc_key_t *l_key = dap_sign_to_enc_key_by_pkey(a_chain_sign, a_pkey); if ( !l_key ){ log_it(L_WARNING,"Incorrect signature, can't extract key"); return -3; -- GitLab From 61aa8efc286894ed62da252a436bf2862fe3cc66 Mon Sep 17 00:00:00 2001 From: "pavel.uhanov" <pavel.uhanov@demlabs.net> Date: Fri, 7 Mar 2025 08:00:58 +0000 Subject: [PATCH 2/3] [*] remove s_get_pkey_by_hash_callback using --- crypto/src/dap_sign.c | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/crypto/src/dap_sign.c b/crypto/src/dap_sign.c index 693344cae..12c1370c1 100755 --- a/crypto/src/dap_sign.c +++ b/crypto/src/dap_sign.c @@ -345,24 +345,9 @@ uint8_t* dap_sign_get_sign(dap_sign_t *a_sign, size_t *a_sign_size) * @param a_pub_key_out [option] output pointer to a_sign->header.sign_pkey_size * @return uint8_t* */ -uint8_t* dap_sign_get_pkey(dap_sign_t *a_sign, size_t *a_pub_key_out) +uint8_t *dap_sign_get_pkey(dap_sign_t *a_sign, size_t *a_pub_key_out) { dap_return_val_if_pass(!a_sign, NULL); - bool l_use_pkey_hash = DAP_SIGN_GET_PKEY_HASHING_FLAG(a_sign->header.hash_type); - if (l_use_pkey_hash) { - if (!s_get_pkey_by_hash_callback) { - log_it(L_ERROR, "Can't get pkey by hash, callback s_get_pkey_by_hash_callback not inited"); - return NULL; - } - dap_pkey_t *l_pkey = s_get_pkey_by_hash_callback(a_sign->pkey_n_sign); - if (!l_pkey) { - log_it(L_ERROR, "Can't get pkey by hash %s", dap_hash_fast_to_str_static((dap_hash_fast_t *)a_sign->pkey_n_sign)); - return NULL; - } - if (a_pub_key_out) - *a_pub_key_out = l_pkey->header.size; - return l_pkey->pkey; - } if (a_pub_key_out) *a_pub_key_out = a_sign->header.sign_pkey_size; return a_sign->pkey_n_sign; @@ -417,7 +402,7 @@ dap_enc_key_t *dap_sign_to_enc_key_by_pkey(dap_sign_t *a_chain_sign, dap_pkey_t dap_enc_key_type_t l_type = dap_sign_type_to_key_type(a_chain_sign->header.type); dap_return_val_if_pass(l_type == DAP_ENC_KEY_TYPE_INVALID, NULL); - size_t l_pkey_size = 0; + size_t l_pkey_size = a_pkey ? a_pkey->header.size : 0; uint8_t *l_pkey = a_pkey ? a_pkey->pkey : dap_sign_get_pkey(a_chain_sign, &l_pkey_size); dap_enc_key_t * l_ret = dap_enc_key_new(l_type); // deserialize public key -- GitLab From c68d541df022ed50c0daef6367ba6b10e1408c90 Mon Sep 17 00:00:00 2001 From: "pavel.uhanov" <pavel.uhanov@demlabs.net> Date: Fri, 7 Mar 2025 13:11:55 +0300 Subject: [PATCH 3/3] [*] fix tests --- crypto/test/crypto/dap_enc_benchmark_test.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/crypto/test/crypto/dap_enc_benchmark_test.c b/crypto/test/crypto/dap_enc_benchmark_test.c index e70c2623f..6ef80da7a 100644 --- a/crypto/test/crypto/dap_enc_benchmark_test.c +++ b/crypto/test/crypto/dap_enc_benchmark_test.c @@ -208,12 +208,24 @@ static void s_sign_verify_ser_test(dap_enc_key_type_t a_key_type, int a_times, i l_t1 = get_cur_time_msec(); for(int i = 0; i < a_times; ++i) { int l_verified = 0; - if (dap_sign_type_to_key_type(l_signs[i]->header.type) == DAP_ENC_KEY_TYPE_SIG_ECDSA) - l_verified = dap_sign_verify(l_signs[i], l_source[i], l_source_size[i]); - else { + if (dap_sign_type_to_key_type(l_signs[i]->header.type) == DAP_ENC_KEY_TYPE_SIG_ECDSA) { + if (dap_sign_is_use_pkey_hash(l_signs[i])) { + dap_hash_fast_t l_sign_pkey_hash = {}; + dap_sign_get_pkey_hash(l_signs[i], &l_sign_pkey_hash); + l_verified = dap_sign_verify_by_pkey(l_signs[i], l_source[i], l_source_size[i], s_get_pkey_by_hash_callback( (const uint8_t *)&l_sign_pkey_hash)); + } else { + l_verified = dap_sign_verify(l_signs[i], l_source[i], l_source_size[i]); + } + } else { dap_chain_hash_fast_t l_hash; dap_hash_fast(l_source[i], l_source_size[i], &l_hash); - l_verified = dap_sign_verify(l_signs[i], &l_hash, sizeof(l_hash)); + if (dap_sign_is_use_pkey_hash(l_signs[i])) { + dap_hash_fast_t l_sign_pkey_hash = {}; + dap_sign_get_pkey_hash(l_signs[i], &l_sign_pkey_hash); + l_verified = dap_sign_verify_by_pkey(l_signs[i], &l_hash, sizeof(l_hash), s_get_pkey_by_hash_callback( (const uint8_t *)&l_sign_pkey_hash)); + } else { + l_verified = dap_sign_verify(l_signs[i], &l_hash, sizeof(l_hash)); + } } dap_assert_PIF(!l_verified, "Deserialize and verifying signature"); } -- GitLab