diff --git a/crypto/dap_enc_bliss.c b/crypto/dap_enc_bliss.c index 557e2ae7b00f5c16660a2e20e03014198ad8cd0f..e7a1e0cad0053585db72a97c5bfd2fc4b25eadcc 100644 --- a/crypto/dap_enc_bliss.c +++ b/crypto/dap_enc_bliss.c @@ -6,6 +6,12 @@ #include "dap_common.h" #include "dap_rand.h" +static enum DAP_BLISS_SIGN_SECURITY _bliss_type = MAX_SECURITY; // by default + +void dap_enc_sig_bliss_set_type(enum DAP_BLISS_SIGN_SECURITY type) +{ + _bliss_type = type; +} void dap_enc_sig_bliss_key_new(struct dap_enc_key *key) { @@ -45,39 +51,53 @@ void dap_enc_sig_bliss_key_new_generate(struct dap_enc_key * key, const void *ke * type = 3 - good speed and good security (160 bits) * type = 4 - max securiry (192 bits) */ - int32_t type = 4; + //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), type, &entropy); + 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)); + bliss_b_private_key_delete(key->priv_key_data); 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), (bliss_public_key_t *) &(*key->priv_key_data)); + 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)); + bliss_b_private_key_delete(key->priv_key_data); + bliss_b_public_key_delete(key->pub_key_data); log_it(L_CRITICAL, "Error"); return; } } -size_t dap_enc_sig_bliss_get_sign(struct dap_enc_key * key, const void * msg, size_t msg_size, void ** signature) +size_t dap_enc_sig_bliss_get_sign(struct dap_enc_key * key,const void * msg, + const size_t msg_size, void * signature, const size_t signature_size) { + if(signature_size < sizeof (bliss_signature_t)) { + log_it(L_ERROR, "bad signature size"); + return 0; + } uint8_t seed_tmp[SHA3_512_DIGEST_LENGTH]; entropy_t entropy; - randombytes( &seed_tmp, 64); - entropy_init( &entropy, seed_tmp); - - return bliss_b_sign( &(*signature), &(*key->priv_key_data), msg, msg_size, &entropy); + randombytes(&seed_tmp, 64); + entropy_init(&entropy, seed_tmp); + + return bliss_b_sign((bliss_signature_t *)signature, + (const bliss_private_key_t *)key->priv_key_data, + (const uint8_t *)msg, + msg_size, + &entropy); } -size_t dap_enc_sig_bliss_verify_sign(struct dap_enc_key * key, const void * msg, size_t msg_size, void ** signature) +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) { - return bliss_b_verify( &(*signature), &(*key->pub_key_data), msg, msg_size); + if(signature_size < sizeof (bliss_signature_t)) { + log_it(L_ERROR, "bad signature size"); + return 0; + } + return bliss_b_verify(signature, key->pub_key_data, msg, msg_size); } void dap_enc_sig_bliss_key_delete(struct dap_enc_key *key) diff --git a/crypto/dap_enc_bliss.h b/crypto/dap_enc_bliss.h index 31e16ba36c1ed00ace7a02bc5fc4c61c32a48535..9b4d0317629860862e492bdf50140e024a13bbad 100644 --- a/crypto/dap_enc_bliss.h +++ b/crypto/dap_enc_bliss.h @@ -5,17 +5,26 @@ #include "sig_bliss/bliss_b_params.h" #include "dap_enc_key.h" +#undef LOG_TAG #define LOG_TAG "dap_enc_sig_bliss" +enum DAP_BLISS_SIGN_SECURITY { + TOY = 0, MAX_SPEED, MIN_SIZE, SPEED_AND_SECURITY, MAX_SECURITY +}; + +void dap_enc_sig_bliss_set_type(enum DAP_BLISS_SIGN_SECURITY type); + void dap_enc_sig_bliss_key_new(struct dap_enc_key *key); void dap_enc_sig_bliss_key_new_generate(struct dap_enc_key * key, const void *kex_buf, size_t kex_size, const void * seed, size_t seed_size, size_t key_size); -size_t dap_enc_sig_bliss_get_sign(struct dap_enc_key * key, const void * msg, size_t msg_size, void ** signature); +size_t dap_enc_sig_bliss_get_sign(struct dap_enc_key * key,const void * msg, + const size_t msg_size, void * signature, const size_t signature_size); -size_t dap_enc_sig_bliss_verify_sign(struct dap_enc_key * key, const void * msg, size_t msg_size, void ** signature); +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); diff --git a/crypto/dap_enc_key.c b/crypto/dap_enc_key.c index a6834fe695df9f087c4d26a5cc0cbcf0b3463b29..b4abaaa1e9acfc4554d0f5c29f5f5bf9531bcf95 100644 --- a/crypto/dap_enc_key.c +++ b/crypto/dap_enc_key.c @@ -66,16 +66,16 @@ struct dap_enc_key_callbacks{ .new_callback = dap_enc_msrln_key_new, .delete_callback = dap_enc_msrln_key_delete, .new_generate_callback = dap_enc_msrln_key_generate, - .gen_bob_shared_key = (dap_enc_gen_bob_shared_key) dap_enc_msrln_gen_bob_shared_key, - .gen_alice_shared_key = (dap_enc_gen_alice_shared_key) dap_enc_msrln_gen_alice_shared_key, + .gen_bob_shared_key = dap_enc_msrln_gen_bob_shared_key, + .gen_alice_shared_key = dap_enc_msrln_gen_alice_shared_key, .new_from_data_public_callback = dap_enc_msrln_key_new_from_data_public }, [DAP_ENC_KEY_TYPE_DEFEO]={ .name = "DEFEO", .enc = NULL, .dec = NULL, - .gen_bob_shared_key = (dap_enc_gen_bob_shared_key) dap_enc_defeo_gen_bob_shared_key, - .gen_alice_shared_key = (dap_enc_gen_alice_shared_key) dap_enc_defeo_gen_alice_shared_key, + .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, .delete_callback = dap_enc_defeo_key_delete, .new_generate_callback = dap_enc_defeo_key_new_generate, @@ -95,8 +95,10 @@ struct dap_enc_key_callbacks{ .name = "SIG_BLISS", .enc = NULL, .dec = NULL, - .gen_bob_shared_key = dap_enc_sig_bliss_get_sign, - .gen_alice_shared_key = dap_enc_sig_bliss_verify_sign, + .enc_na = dap_enc_sig_bliss_get_sign, + .dec_na = dap_enc_sig_bliss_verify_sign, + .gen_bob_shared_key = NULL, + .gen_alice_shared_key = NULL, .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, diff --git a/crypto/dap_enc_key.h b/crypto/dap_enc_key.h index a75785eaf3b715353db3f22c985b40401bb037f5..a24d5a3dfba2e6e5859f38a64b63f06944554030 100644 --- a/crypto/dap_enc_key.h +++ b/crypto/dap_enc_key.h @@ -130,7 +130,7 @@ typedef size_t (*dap_enc_callback_dataop_na_t)(struct dap_enc_key *key, const vo // b_pub --- Bob's public key // b_key->priv_key_data --- shared key // b_key->priv_key_data_size --- shared key length -typedef int (*dap_enc_gen_bob_shared_key) (struct dap_enc_key *b_key, const void *a_pub, +typedef size_t (*dap_enc_gen_bob_shared_key) (struct dap_enc_key *b_key, const void *a_pub, size_t a_pub_size, void ** b_pub); // generation of shared key at Alice's side @@ -142,7 +142,7 @@ typedef int (*dap_enc_gen_bob_shared_key) (struct dap_enc_key *b_key, const void // OUTPUT: // a_key->priv_key_data --- shared key // a_key->priv_key_data_size --- shared key length -typedef int (*dap_enc_gen_alice_shared_key) (struct dap_enc_key *a_key, const void *a_priv, +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); diff --git a/crypto/dap_enc_picnic.c b/crypto/dap_enc_picnic.c index d09772cdd0a876015c3095cfb2097c3fa87b03ce..9e7aaf1d7cc83e36332ac6603fb204d8c12d3f13 100644 --- a/crypto/dap_enc_picnic.c +++ b/crypto/dap_enc_picnic.c @@ -15,7 +15,10 @@ size_t dap_enc_picnic_enc_na(dap_enc_key_t* b_key, const void *a_buf_in, const size_t a_buf_in_size, void * a_buf_out, const size_t a_buf_out_size_max) { - + (void)b_key; (void)a_buf_in; + (void)a_buf_in_size; (void)a_buf_out; + (void)a_buf_out_size_max; + return 0; } /** @@ -30,7 +33,10 @@ size_t dap_enc_picnic_enc_na(dap_enc_key_t* b_key, const void *a_buf_in, const s size_t dap_enc_picnic_dec_na(dap_enc_key_t* b_key, const void *a_buf_in, const size_t a_buf_in_size, void * a_buf_out, const size_t a_buf_out_size_max) { - + (void)b_key; (void)a_buf_in; + (void)a_buf_in_size; (void)a_buf_out; + (void)a_buf_out_size_max; + return 0; } /** @@ -39,7 +45,7 @@ size_t dap_enc_picnic_dec_na(dap_enc_key_t* b_key, const void *a_buf_in, const s */ void dap_enc_picnic_key_new(dap_enc_key_t* a_key) { - + (void)a_key; } /** @@ -51,7 +57,8 @@ void dap_enc_picnic_key_new(dap_enc_key_t* a_key) void dap_enc_picnic_key_generate(dap_enc_key_t * a_key, const void* a_seed, size_t a_seed_size, size_t a_key_size) { - + (void)a_key; (void)a_seed; + (void)a_seed_size; (void)a_key_size; } /** @@ -62,7 +69,8 @@ void dap_enc_picnic_key_generate(dap_enc_key_t * a_key, const void* a_seed, size */ void dap_enc_picnic_key_new_from_raw_public(dap_enc_key_t* a_key, const void * a_in, size_t a_in_size) { - + (void)a_key; (void)a_in; + (void)a_in_size; } /** @@ -73,7 +81,8 @@ void dap_enc_picnic_key_new_from_raw_public(dap_enc_key_t* a_key, const void * a */ void dap_enc_picnic_key_new_from_raw_private(dap_enc_key_t* a_key, const void * a_in, size_t a_in_size) { - + (void)a_key; (void)a_in; + (void)a_in_size; } /** @@ -82,5 +91,5 @@ void dap_enc_picnic_key_new_from_raw_private(dap_enc_key_t* a_key, const void * */ void dap_enc_picnic_key_delete(dap_enc_key_t * a_key) { - + (void)a_key; } diff --git a/crypto/rand/dap_rand.c b/crypto/rand/dap_rand.c index 1189a370bb0d4f3f78c129555e53da6d5e6ed70a..1bb7ec166d320b10a0655e73e7370f505e237b44 100644 --- a/crypto/rand/dap_rand.c +++ b/crypto/rand/dap_rand.c @@ -20,7 +20,7 @@ static __inline void delay(unsigned int count) } -int randombytes(unsigned char* random_array, unsigned int nbytes) +int randombytes(void* random_array, unsigned int nbytes) { // Generation of "nbytes" of random values #if defined(_WIN32) diff --git a/crypto/rand/dap_rand.h b/crypto/rand/dap_rand.h index 81d2ddbe4debebbe7ea4a867d277f9617600c33e..291839430dbc28de4e1b13093ae6b58f5ece540b 100644 --- a/crypto/rand/dap_rand.h +++ b/crypto/rand/dap_rand.h @@ -2,6 +2,6 @@ #define __DAP_RAND_H__ // Generate random bytes and output the result to random_array -int randombytes(unsigned char* random_array, unsigned int nbytes); +int randombytes(void* random_array, unsigned int nbytes); #endif diff --git a/crypto/sig_bliss/bliss_b_keys.c b/crypto/sig_bliss/bliss_b_keys.c index 3f1a0b9ca588f5202e81d299660a137fe241a9a5..4a4347cede1e2e7d0c7fec1c16eb45bdeb8e5680 100644 --- a/crypto/sig_bliss/bliss_b_keys.c +++ b/crypto/sig_bliss/bliss_b_keys.c @@ -150,9 +150,9 @@ static int32_t bliss_b_private_key_init(bliss_private_key_t *private_key, bliss_ /* Bliss-b public and sign key generation sign key is f, g small and f invertible * public key is a_q = -(2g-1)/f mod q = (2g'+1)/f */ -int32_t bliss_b_private_key_gen(bliss_private_key_t *private_key, bliss_kind_t kind, entropy_t *entropy){ +int32_t bliss_b_private_key_gen(bliss_private_key_t *private_key, bliss_kind_t kind, entropy_t *entropy) { int32_t retcode; - int32_t i, j; + uint32_t i, j; int32_t *t = NULL, *u = NULL; ntt_state_t state; bliss_param_t p; @@ -237,6 +237,8 @@ int32_t bliss_b_private_key_gen(bliss_private_key_t *private_key, bliss_kind_t k delete_ntt_state(state); return BLISS_B_NO_ERROR; } + + return retcode; } void bliss_b_private_key_delete(bliss_private_key_t *private_key){ diff --git a/crypto/sig_bliss/bliss_b_signatures.c b/crypto/sig_bliss/bliss_b_signatures.c index d2ea344c0961710140df2f91f0e45a936b92fdff..bdbe0b841bbe1ed13925620e9f4e1168a3674319 100644 --- a/crypto/sig_bliss/bliss_b_signatures.c +++ b/crypto/sig_bliss/bliss_b_signatures.c @@ -623,18 +623,18 @@ int32_t bliss_b_sign(bliss_signature_t *signature, const bliss_private_key_t *p } /* 8: Also need to check norms akin to what happens in the entry to verify for BLISS-0, BLISS-3 and BLISS-4 */ - if (vector_max_norm(z1, n) > p.b_inf) { + if (vector_max_norm(z1, n) > (int32_t)p.b_inf) { if(VERBOSE_RESTARTS){ fprintf(stdout, "--> norm z1 too high\n"); } //goto restart; continue; } mul2d(y2, z2, n, p.d); - if (vector_max_norm(y2, n) > p.b_inf) { + if (vector_max_norm(y2, n) > (int32_t) p.b_inf) { if(VERBOSE_RESTARTS){ fprintf(stdout, "--> norm z2*2^d too high\n"); } //goto restart; continue; } - if (vector_norm2(z1, n) + vector_norm2(y2, n) > p.b_l2){ + if (vector_norm2(z1, n) + vector_norm2(y2, n) > (int32_t) p.b_l2){ if(VERBOSE_RESTARTS){ fprintf(stdout, "--> euclidean norm too high\n"); } //goto restart; continue; @@ -734,7 +734,7 @@ int32_t bliss_b_verify(const bliss_signature_t *signature, const bliss_public_k } /* first check the norms */ - if (vector_max_norm(z1, n) > p.b_inf){ + if (vector_max_norm(z1, n) > (int32_t)p.b_inf){ retval = BLISS_B_BAD_DATA; delete_ntt_state(state); free(tz2); @@ -750,7 +750,7 @@ int32_t bliss_b_verify(const bliss_signature_t *signature, const bliss_public_k mul2d(tz2, z2, n, p.d); - if(vector_max_norm(tz2, n) > p.b_inf){ + if(vector_max_norm(tz2, n) > (int32_t) p.b_inf){ retval = BLISS_B_BAD_DATA; delete_ntt_state(state); free(tz2); @@ -764,7 +764,7 @@ int32_t bliss_b_verify(const bliss_signature_t *signature, const bliss_public_k return retval; } - if (vector_norm2(z1, n) + vector_norm2(tz2, n) > p.b_l2){ + if (vector_norm2(z1, n) + vector_norm2(tz2, n) > (int32_t)p.b_l2){ retval = BLISS_B_BAD_DATA; delete_ntt_state(state); free(tz2); diff --git a/test/crypto/dap_enc_iaes_test.c b/test/crypto/dap_enc_iaes_test.c index 9609faec71afa40a84ea31e28d8395b09025c767..9167a786d99c7843196b829e497becaeea804cc7 100644 --- a/test/crypto/dap_enc_iaes_test.c +++ b/test/crypto/dap_enc_iaes_test.c @@ -59,7 +59,7 @@ void test_encode_decode_fast(size_t count_steps) dap_enc_key_t* key = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_IAES, kex_data, kex_size, seed, seed_size, 0); - for(int i = 1; i <= count_steps; i++) { + for(size_t i = 1; i <= count_steps; i++) { int step = 1; source_size += (size_t)step; diff --git a/test/crypto/dap_enc_sig_bliss_test.c b/test/crypto/dap_enc_sig_bliss_test.c index 1f0634e49b5489908f437d64fd161bfbc8c16ae0..8066302df856f06211ea7ce14cc01e2f72ace091 100644 --- a/test/crypto/dap_enc_sig_bliss_test.c +++ b/test/crypto/dap_enc_sig_bliss_test.c @@ -10,10 +10,10 @@ static void message_signature_simulation_test() uint8_t* msg = (uint8_t*)text; size_t msg_size = strlen(text); - dap_assert(dap_enc_sig_bliss_get_sign( key, msg, msg_size, &signature) == BLISS_B_NO_ERROR, + dap_assert(dap_enc_sig_bliss_get_sign( key, msg, msg_size, &signature, sizeof(signature)) == BLISS_B_NO_ERROR, "Sign msg"); - dap_assert(dap_enc_sig_bliss_verify_sign( key, msg, msg_size, &signature) == BLISS_B_NO_ERROR, + dap_assert(dap_enc_sig_bliss_verify_sign( key, msg, msg_size, &signature, sizeof(signature)) == BLISS_B_NO_ERROR, "Verify msg") bliss_signature_delete(&signature);