From 7716e11a14e690e3d167731ed6eacbb410fc28c1 Mon Sep 17 00:00:00 2001 From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net> Date: Tue, 22 Jan 2019 20:12:43 +0700 Subject: [PATCH] [*] Fixed pub and private key size in bliss [+] New callback for public key extract operation --- CMakeLists.txt | 1 - core/unix/CMakeLists.txt | 1 + crypto/CMakeLists.txt | 2 ++ crypto/dap_enc_bliss.c | 58 +++++++++++++++++++++++++++++++--------- crypto/dap_enc_bliss.h | 2 ++ crypto/dap_enc_key.c | 39 ++++++++++++++++++++++++++- crypto/dap_enc_key.h | 9 ++++++- 7 files changed, 97 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e83538a..fae4546 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,4 +17,3 @@ endif() add_subdirectory(core) add_subdirectory(crypto) - diff --git a/core/unix/CMakeLists.txt b/core/unix/CMakeLists.txt index 7679c21..da6eb03 100644 --- a/core/unix/CMakeLists.txt +++ b/core/unix/CMakeLists.txt @@ -20,3 +20,4 @@ target_include_directories(dap_core_unix INTERFACE .) if(LINUX) target_include_directories(dap_core_unix INTERFACE ./linux) endif() + diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index daeb534..9388ac5 100755 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -14,3 +14,5 @@ target_include_directories(dap_crypto PRIVATE rand iaes oaes sha3 msrln defeo_sc target_include_directories(dap_crypto INTERFACE . sha3) target_link_libraries(dap_crypto dap_core m) + + diff --git a/crypto/dap_enc_bliss.c b/crypto/dap_enc_bliss.c index 4610d36..29d6f60 100644 --- a/crypto/dap_enc_bliss.c +++ b/crypto/dap_enc_bliss.c @@ -22,13 +22,43 @@ void dap_enc_sig_bliss_key_new(struct dap_enc_key *key) { key->gen_alice_shared_key = (dap_enc_gen_alice_shared_key) dap_enc_sig_bliss_verify_sign; } +/** + * @brief dap_enc_sig_bliss_key_pub_output_size + * @param l_key + * @return + */ +size_t dap_enc_sig_bliss_key_pub_output_size(struct dap_enc_key *l_key) +{ + (void) l_key; + return sizeof(bliss_public_key_t); // Always same, right? +} + +/** + * @brief dap_enc_sig_bliss_key_pub_output + * @param l_key + * @param l_output + * @return + */ +int dap_enc_sig_bliss_key_pub_output(struct dap_enc_key *l_key, void * l_output) +{ + int32_t retcode; + + retcode = bliss_b_public_key_extract( (bliss_public_key_t *) l_output, + (const bliss_private_key_t *) l_key->priv_key_data); + if (retcode != BLISS_B_NO_ERROR) { + log_it(L_CRITICAL, "Can't extract public key from the private one"); + return -1; + } + return 0; +} + // generation key pair for sign Alice // OUTPUT: // a_key->data --- Alice's public key // alice_priv --- Alice's private key // alice_msg_len --- Alice's private key length -void dap_enc_sig_bliss_key_new_generate(struct dap_enc_key * key, const void *kex_buf, +void dap_enc_sig_bliss_key_new_generate(struct dap_enc_key * a_key, const void *kex_buf, size_t kex_size, const void * seed, size_t seed_size, size_t key_size) { @@ -36,9 +66,9 @@ void dap_enc_sig_bliss_key_new_generate(struct dap_enc_key * key, const void *ke (void) seed; (void) seed_size; (void)key_size; - int32_t retcode; + int32_t l_retcode; - dap_enc_sig_bliss_key_new(key); + dap_enc_sig_bliss_key_new(a_key); uint8_t seed_tmp[SHA3_512_DIGEST_LENGTH]; entropy_t entropy; @@ -53,19 +83,23 @@ void dap_enc_sig_bliss_key_new_generate(struct dap_enc_key * key, const void *ke * type = 4 - max securiry (192 bits) */ //int32_t type = 4; - key->priv_key_data = malloc(sizeof(bliss_private_key_t)); - retcode = bliss_b_private_key_gen((bliss_private_key_t *) key->priv_key_data, _bliss_type, &entropy); - if (retcode != BLISS_B_NO_ERROR) { - bliss_b_private_key_delete(key->priv_key_data); + a_key->priv_key_data_size = sizeof(bliss_private_key_t); + a_key->priv_key_data = DAP_NEW_SIZE(void,a_key->priv_key_data_size); + l_retcode = bliss_b_private_key_gen((bliss_private_key_t *) a_key->priv_key_data, _bliss_type, &entropy); + if (l_retcode != BLISS_B_NO_ERROR) { + bliss_b_private_key_delete(a_key->priv_key_data); + a_key->priv_key_data = NULL; + a_key->priv_key_data_size = 0; log_it(L_CRITICAL, "Error"); return; } - key->pub_key_data = malloc(sizeof(bliss_public_key_t)); - retcode = bliss_b_public_key_extract( (bliss_public_key_t *) key->pub_key_data, (const bliss_private_key_t *) key->priv_key_data); - if (retcode != BLISS_B_NO_ERROR) { - bliss_b_private_key_delete(key->priv_key_data); - bliss_b_public_key_delete(key->pub_key_data); + a_key->pub_key_data_size = sizeof(bliss_public_key_t); + a_key->pub_key_data = DAP_NEW_SIZE(void,a_key->pub_key_data_size ); + l_retcode = bliss_b_public_key_extract( (bliss_public_key_t *) a_key->pub_key_data, (const bliss_private_key_t *) a_key->priv_key_data); + if (l_retcode != BLISS_B_NO_ERROR) { + bliss_b_private_key_delete(a_key->priv_key_data); + bliss_b_public_key_delete(a_key->pub_key_data); log_it(L_CRITICAL, "Error"); return; } diff --git a/crypto/dap_enc_bliss.h b/crypto/dap_enc_bliss.h index 73f2f25..3d7620b 100644 --- a/crypto/dap_enc_bliss.h +++ b/crypto/dap_enc_bliss.h @@ -23,4 +23,6 @@ size_t dap_enc_sig_bliss_verify_sign(struct dap_enc_key * key,const void * msg, const size_t msg_size, void * signature, const size_t signature_size); void dap_enc_sig_bliss_key_delete(struct dap_enc_key *key); +size_t dap_enc_sig_bliss_key_pub_output_size(struct dap_enc_key *l_key); +int dap_enc_sig_bliss_key_pub_output(struct dap_enc_key *l_key, void * l_output); diff --git a/crypto/dap_enc_key.c b/crypto/dap_enc_key.c index 06650d2..e56694a 100755 --- a/crypto/dap_enc_key.c +++ b/crypto/dap_enc_key.c @@ -43,6 +43,9 @@ struct dap_enc_key_callbacks{ dap_enc_callback_dataop_t dec; dap_enc_callback_dataop_na_t enc_na; dap_enc_callback_dataop_na_t dec_na; + dap_enc_callback_gen_key_public_t gen_key_public; + dap_enc_callback_key_size_t gen_key_public_size; + dap_enc_callback_calc_out_size enc_out_size; dap_enc_callback_calc_out_size dec_out_size; @@ -52,7 +55,6 @@ struct dap_enc_key_callbacks{ dap_enc_callback_new new_callback; dap_enc_callback_data_t new_from_data_public_callback; dap_enc_callback_new_generate new_generate_callback; - dap_enc_callback_delete delete_callback; } s_callbacks[]={ // AES @@ -65,6 +67,8 @@ struct dap_enc_key_callbacks{ .new_callback = dap_enc_aes_key_new, .delete_callback = dap_enc_aes_key_delete, .new_generate_callback = dap_enc_aes_key_generate, + .gen_key_public = NULL, + .gen_key_public_size = NULL, .enc_out_size = dap_enc_iaes256_calc_encode_size, .dec_out_size = dap_enc_iaes256_calc_decode_size, }, @@ -78,6 +82,8 @@ struct dap_enc_key_callbacks{ .new_callback = dap_enc_oaes_key_new, .delete_callback = dap_enc_oaes_key_delete, .new_generate_callback = dap_enc_oaes_key_generate, + .gen_key_public = NULL, + .gen_key_public_size = NULL, .enc_out_size = dap_enc_oaes_calc_encode_size, .dec_out_size = dap_enc_oaes_calc_decode_size, }, @@ -90,6 +96,8 @@ struct dap_enc_key_callbacks{ .new_generate_callback = dap_enc_msrln_key_generate, .gen_bob_shared_key = dap_enc_msrln_gen_bob_shared_key, .gen_alice_shared_key = dap_enc_msrln_gen_alice_shared_key, + .gen_key_public = NULL, + .gen_key_public_size = NULL, .new_from_data_public_callback = dap_enc_msrln_key_new_from_data_public, .enc_out_size = NULL, .dec_out_size = NULL @@ -98,6 +106,8 @@ struct dap_enc_key_callbacks{ .name = "DEFEO", .enc = NULL, .dec = NULL, + .gen_key_public = NULL, + .gen_key_public_size = NULL, .gen_bob_shared_key = dap_enc_defeo_gen_bob_shared_key, .gen_alice_shared_key = dap_enc_defeo_gen_alice_shared_key, .new_callback = dap_enc_defeo_key_new, @@ -115,6 +125,8 @@ struct dap_enc_key_callbacks{ .gen_bob_shared_key = NULL, .gen_alice_shared_key = NULL, .new_callback = dap_enc_sig_picnic_key_new, + .gen_key_public = NULL, + .gen_key_public_size = NULL, .delete_callback = dap_enc_sig_picnic_key_delete, .new_generate_callback = dap_enc_sig_picnic_key_new_generate, .enc_out_size = NULL, @@ -131,6 +143,9 @@ struct dap_enc_key_callbacks{ .new_callback = dap_enc_sig_bliss_key_new, .delete_callback = dap_enc_sig_bliss_key_delete, .new_generate_callback = dap_enc_sig_bliss_key_new_generate, + .gen_key_public = dap_enc_sig_bliss_key_pub_output, + .gen_key_public_size = dap_enc_sig_bliss_key_pub_output_size, + .enc_out_size = NULL, .dec_out_size = NULL }, @@ -140,6 +155,8 @@ struct dap_enc_key_callbacks{ .dec = NULL, .enc_na = dap_enc_sig_tesla_get_sign, .dec_na = dap_enc_sig_tesla_verify_sign, + .gen_key_public = NULL, + .gen_key_public_size = NULL, .gen_bob_shared_key = NULL, .gen_alice_shared_key = NULL, .new_callback = dap_enc_sig_tesla_key_new, @@ -260,6 +277,26 @@ dap_enc_key_t *dap_enc_key_new_generate(dap_enc_key_type_t a_key_type, const voi } +size_t dap_enc_gen_key_public_size (dap_enc_key_t *a_key) +{ + if(s_callbacks[a_key->type].gen_key_public_size) { + return s_callbacks[a_key->type].gen_key_public_size(a_key); + } else { + log_it(L_ERROR, "No callback for key public size calculate"); + return 0; + } +} + +int dap_enc_gen_key_public (dap_enc_key_t *a_key, void * a_output) +{ + if(s_callbacks[a_key->type].gen_key_public) { + return s_callbacks[a_key->type].gen_key_public(a_key,a_output); + } else { + log_it(L_ERROR, "No callback for key public generate action"); + } + return -1; +} + /** * @brief dap_enc_key_delete * @param a_key diff --git a/crypto/dap_enc_key.h b/crypto/dap_enc_key.h index 0ced830..8bc6d7b 100755 --- a/crypto/dap_enc_key.h +++ b/crypto/dap_enc_key.h @@ -110,7 +110,8 @@ typedef enum dap_enc_key_type{ DAP_ENC_KEY_TYPE_IAES, // Symmetric AES DAP_ENC_KEY_TYPE_SIG_TESLA, // signature based on Ring_LWE problem with zero-knowledge proof as specified in // Post-Quantum Zero-Knowledge and Signatures from Symmetric-Key Primitives - DAP_ENC_KEY_TYPE_FNAM2 + DAP_ENC_KEY_TYPE_NULL = 0 + } dap_enc_key_type_t; struct dap_enc_key; @@ -125,6 +126,8 @@ typedef void (*dap_enc_callback_new_generate)(struct dap_enc_key* key, const voi // free memory typedef void (*dap_enc_callback_delete)(struct dap_enc_key*); +typedef size_t (*dap_enc_callback_key_size_t)(struct dap_enc_key*); + // encrypt and decrypt functions. Allocates Memory for out typedef size_t (*dap_enc_callback_dataop_t)(struct dap_enc_key *key, const void *in, const size_t in_size,void ** out); @@ -155,6 +158,7 @@ typedef size_t (*dap_enc_gen_bob_shared_key) (struct dap_enc_key *b_key, const v typedef size_t (*dap_enc_gen_alice_shared_key) (struct dap_enc_key *a_key, const void *a_priv, size_t b_pub_size, unsigned char *b_pub); +typedef int (*dap_enc_callback_gen_key_public_t ) (struct dap_enc_key *l_key, void * l_output); typedef void (*dap_enc_callback_ptr_t)(struct dap_enc_key *, void *); typedef size_t (*dap_enc_callback_pptr_r_size_t)(struct dap_enc_key *, void **); @@ -225,6 +229,9 @@ dap_enc_key_t *dap_enc_key_new_generate(dap_enc_key_type_t key_type, const void dap_enc_key_t *dap_enc_gen_pub_key_from_priv(struct dap_enc_key *a_key, void **priv_key, size_t *alice_msg_len); +size_t dap_enc_gen_key_public_size (dap_enc_key_t *a_key); +int dap_enc_gen_key_public (dap_enc_key_t *a_key, void * a_output); + void dap_enc_key_delete(dap_enc_key_t * a_key); #ifdef __cplusplus -- GitLab