diff --git a/crypto/dap_enc.c b/crypto/dap_enc.c index 12cd24001b238e38679252a03e422de8f6c92884..1c101ff0474eabd809e37ab6644ed571267eaf27 100644 --- a/crypto/dap_enc.c +++ b/crypto/dap_enc.c @@ -27,6 +27,7 @@ #include <stdint.h> #include <string.h> #include <time.h> +#include <assert.h> #include "dap_enc.h" #include "dap_enc_base64.h" #include "dap_enc_key.h" @@ -52,36 +53,84 @@ void dap_enc_deinit() } +/** + * @brief dap_enc_code_out_size + * @param a_key + * @param a_buf_in_size + * @return min buffer size for input in encode function + */ +size_t dap_enc_code_out_size(dap_enc_key_t* a_key, const size_t a_buf_in_size, dap_enc_data_type_t type) +{ + size_t raw_encode_data_size = dap_enc_key_get_enc_size(a_key, a_buf_in_size); + if(raw_encode_data_size == 0) { + log_it(L_ERROR, "dap_enc_key_get_enc_size return 0"); + return 0; + } + if(type != DAP_ENC_DATA_TYPE_RAW) { + return (size_t)DAP_ENC_BASE64_ENCODE_SIZE(raw_encode_data_size); + } + return raw_encode_data_size; +} + +/** + * @brief dap_enc_decode_out_size + * @param a_key + * @param a_buf_in_size + * @return min buffer size for input in decode function + */ +size_t dap_enc_decode_out_size(dap_enc_key_t* a_key, const size_t a_buf_in_size, dap_enc_data_type_t type) +{ + size_t raw_decode_data_size = dap_enc_key_get_dec_size(a_key, a_buf_in_size); + if(raw_decode_data_size == 0) { + log_it(L_ERROR, "dap_enc_key_get_enc_size return 0"); + return 0; + } + + if(type != DAP_ENC_DATA_TYPE_RAW) { + return (size_t)DAP_ENC_BASE64_ENCODE_SIZE(raw_decode_data_size); + } + return dap_enc_decode_out_size; +} + + /** * @brief dap_enc_code Encode data with key - * @param key_private Private key - * @param buf Input buffer - * @param buf_size Input buffer size - * @param buf_out Output buffer + * @param a_key Private key + * @param a_buf Input buffer + * @param a_buf_size Input buffer size + * @param a_buf_out Output buffer + * @param a_buf_out_size_max * @return bytes actualy written in the output buffer */ -size_t dap_enc_code(struct dap_enc_key * key,const void * buf,const size_t buf_size, - void ** buf_out, dap_enc_data_type_t data_type_out) +size_t dap_enc_code(struct dap_enc_key * a_key,const void * a_buf_in,const size_t a_buf_size, + void * a_buf_out, const size_t a_buf_out_size_max, dap_enc_data_type_t a_data_type_out) { - if(key->enc) { - if(data_type_out == DAP_ENC_DATA_TYPE_RAW) { - return key->enc(key, buf, buf_size, buf_out); - } - - void *proc_buf; - size_t ret = key->enc(key, buf, buf_size, &proc_buf); - if(data_type_out == DAP_ENC_DATA_TYPE_B64 || data_type_out == DAP_ENC_DATA_TYPE_B64_URLSAFE) { - *buf_out = malloc(DAP_ENC_BASE64_ENCODE_SIZE(ret)); - ret=dap_enc_base64_encode(proc_buf, ret, *buf_out, data_type_out); - free(proc_buf); - } else { - log_it(L_ERROR, "Unknown dap_enc_data_type"); - return 0; + if(a_key->enc_na) { + if(a_data_type_out == DAP_ENC_DATA_TYPE_RAW) { + return a_key->enc_na(a_key, a_buf_in, a_buf_size, a_buf_out, a_buf_out_size_max); + }else{ + void *l_proc_buf; + l_proc_buf = DAP_NEW_SIZE (void, a_buf_out_size_max ); + size_t l_proc_buf_size = a_key->enc_na(a_key, a_buf_in, a_buf_size, l_proc_buf,a_buf_out_size_max); + if(a_data_type_out == DAP_ENC_DATA_TYPE_B64 || a_data_type_out == DAP_ENC_DATA_TYPE_B64_URLSAFE) { + if(DAP_ENC_BASE64_ENCODE_SIZE(l_proc_buf_size) <= a_buf_out_size_max) { + size_t l_buf_out_size=dap_enc_base64_encode(l_proc_buf, l_proc_buf_size, a_buf_out, a_data_type_out); + DAP_DELETE(l_proc_buf); + return l_buf_out_size; + } else { + DAP_DELETE(l_proc_buf); + log_it(L_ERROR, "a_buf_out_size_max less than result size"); + return 0; + } + } else { + log_it(L_ERROR, "Unknown dap_enc_data_type"); + DAP_DELETE(l_proc_buf); + return 0; + } } - return ret; } else { - log_it(L_ERROR, "key->enc is NULL"); + log_it(L_ERROR, "key->enc_na is NULL"); return 0; } } @@ -95,39 +144,39 @@ size_t dap_enc_code(struct dap_enc_key * key,const void * buf,const size_t buf_s * @param buf_out_max Maximum size of output buffer * @return bytes actualy written in the output buffer */ -size_t dap_enc_decode(struct dap_enc_key * key,const void * buf, const size_t buf_size, - void ** buf_out, dap_enc_data_type_t data_type_in) +size_t dap_enc_decode(struct dap_enc_key * a_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, dap_enc_data_type_t a_data_type_in) { - void *proc_buf = NULL; - const void *proc_buf_const = NULL; - size_t proc_buf_size = 0; - switch(data_type_in){ + void *l_proc_buf = NULL; + const void *l_proc_buf_const = NULL; + size_t l_proc_buf_size = 0; + switch(a_data_type_in){ case DAP_ENC_DATA_TYPE_B64: case DAP_ENC_DATA_TYPE_B64_URLSAFE: - proc_buf=calloc(1,DAP_ENC_BASE64_ENCODE_SIZE(buf_size)); - proc_buf_size= dap_enc_base64_decode((const char*) buf,buf_size,proc_buf,data_type_in); - proc_buf_const=proc_buf; + l_proc_buf=DAP_NEW_SIZE(void,DAP_ENC_BASE64_ENCODE_SIZE(a_buf_in_size)); + l_proc_buf_size= dap_enc_base64_decode((const char*) a_buf_in,a_buf_in_size,l_proc_buf,a_data_type_in); + l_proc_buf_const=l_proc_buf; break; case DAP_ENC_DATA_TYPE_RAW:{ - proc_buf_const=buf; - proc_buf_size=buf_size; + l_proc_buf_const=a_buf_in; + l_proc_buf_size=a_buf_in_size; }break; } - if(key->dec) { - if(proc_buf_size == 0) { + if(a_key->dec_na) { + if(l_proc_buf_size == 0) { log_it(L_ERROR, "Buf is null. dap_enc_base64_decode is failed"); return 0; } - size_t ret = key->dec(key,proc_buf_const,proc_buf_size, buf_out); + size_t ret = a_key->dec_na(a_key,l_proc_buf_const,l_proc_buf_size, a_buf_out,a_buf_out_size_max); - if(data_type_in==DAP_ENC_DATA_TYPE_B64 || data_type_in == DAP_ENC_DATA_TYPE_B64_URLSAFE) - free(proc_buf); + if(a_data_type_in==DAP_ENC_DATA_TYPE_B64 || a_data_type_in == DAP_ENC_DATA_TYPE_B64_URLSAFE) + free(l_proc_buf); return ret; } else { - log_it(L_WARNING, "key->dec is NULL"); - if(proc_buf_size) - free(proc_buf); + log_it(L_WARNING, "key->dec_na is NULL"); + if(l_proc_buf_size) + free(l_proc_buf); return 0; } } diff --git a/crypto/dap_enc.h b/crypto/dap_enc.h index 6449fac62698f75f98d0de5f7c4bb73dcdf21628..2e996330b9acd500f5bce18ce6a1892a851da49d 100644 --- a/crypto/dap_enc.h +++ b/crypto/dap_enc.h @@ -32,10 +32,15 @@ extern "C" { int dap_enc_init(void); void dap_enc_deinit(void); -size_t dap_enc_code(struct dap_enc_key * key, const void * buf, const size_t buf_size, void ** buf_out, - dap_enc_data_type_t data_type_out); -size_t dap_enc_decode(struct dap_enc_key * key, const void * buf, const size_t buf_size, void ** buf_out, - dap_enc_data_type_t data_type_in); +// if include_base64 == true. Calc out size with base64 encoding +size_t dap_enc_code_out_size(dap_enc_key_t* a_key, const size_t a_buf_in_size, dap_enc_data_type_t type); +size_t dap_enc_decode_out_size(dap_enc_key_t* a_key, const size_t a_buf_in_size, dap_enc_data_type_t type); + +size_t dap_enc_code(struct dap_enc_key * a_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, + dap_enc_data_type_t a_data_type_out); + +size_t dap_enc_decode(struct dap_enc_key * a_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, + dap_enc_data_type_t a_data_type_in); #ifdef __cplusplus } diff --git a/crypto/dap_enc_base64.c b/crypto/dap_enc_base64.c index f9c878d69954b656e1f7e729808f10a4606e9c95..90fad177c813ecf62f919800cdb89a325a430828 100755 --- a/crypto/dap_enc_base64.c +++ b/crypto/dap_enc_base64.c @@ -266,7 +266,6 @@ size_t dap_enc_base64_encode(const void * a_in, size_t a_in_size, char * a_out, a_out[size++] = '='; } } - return size; } diff --git a/crypto/dap_enc_iaes.c b/crypto/dap_enc_iaes.c index 637a8859c026dda4de5d7dd0902a4bc90bd86e26..df5332fd6c2e10006c93c4c4abcc1a77b867114c 100644 --- a/crypto/dap_enc_iaes.c +++ b/crypto/dap_enc_iaes.c @@ -33,6 +33,8 @@ void dap_enc_aes_key_new(struct dap_enc_key * a_key) a_key->type = DAP_ENC_KEY_TYPE_IAES; a_key->enc = dap_enc_iaes256_cbc_encrypt; a_key->dec = dap_enc_iaes256_cbc_decrypt; + a_key->enc_na = dap_enc_iaes256_cbc_encrypt_fast; + a_key->dec_na = dap_enc_iaes256_cbc_decrypt_fast; //a_key->delete_callback = dap_enc_aes_key_delete; a_key->priv_key_data = (uint8_t *)malloc(IAES_KEYSIZE); @@ -107,6 +109,15 @@ size_t dap_enc_iaes256_cbc_encrypt(struct dap_enc_key * a_key, const void * a_in return length_data_new; } +size_t dap_enc_iaes256_calc_encode_size(const size_t size_in) +{ + return iaes_calc_block128_size(size_in); +} + +size_t dap_enc_iaes256_calc_decode_size(const size_t size_in) +{ + return size_in; +} size_t dap_enc_iaes256_cbc_encrypt_fast(struct dap_enc_key * a_key, const void * a_in, size_t a_in_size, void * buf_out, size_t buf_out_size) diff --git a/crypto/dap_enc_iaes.h b/crypto/dap_enc_iaes.h index 25d48fbe2c3ffa60f2b99ef9f48e4d392d8cb49e..8472dede0cf3699dee5e1b5b2a17aac1c9293afc 100644 --- a/crypto/dap_enc_iaes.h +++ b/crypto/dap_enc_iaes.h @@ -17,6 +17,9 @@ void dap_enc_aes_key_delete(struct dap_enc_key *a_key); void dap_enc_aes_key_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); +size_t dap_enc_iaes256_calc_decode_size(const size_t size_in); +size_t dap_enc_iaes256_calc_encode_size(const size_t size_in); + size_t dap_enc_iaes256_cbc_decrypt(struct dap_enc_key * a_key, const void * a_in, size_t a_in_size, void ** a_out); size_t dap_enc_iaes256_cbc_encrypt(struct dap_enc_key * a_key, const void * a_in, size_t a_in_size, void ** a_out); diff --git a/crypto/dap_enc_key.c b/crypto/dap_enc_key.c index b4abaaa1e9acfc4554d0f5c29f5f5bf9531bcf95..6ea65ef1c1339de9810f28fc4ec2c6813dc49fc0 100644 --- a/crypto/dap_enc_key.c +++ b/crypto/dap_enc_key.c @@ -40,6 +40,8 @@ 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_calc_out_size enc_out_size; + dap_enc_callback_calc_out_size dec_out_size; dap_enc_gen_bob_shared_key gen_bob_shared_key; dap_enc_gen_alice_shared_key gen_alice_shared_key; @@ -54,10 +56,14 @@ struct dap_enc_key_callbacks{ [DAP_ENC_KEY_TYPE_IAES]={ .name = "IAES", .enc = dap_enc_iaes256_cbc_encrypt, + .enc_na = dap_enc_iaes256_cbc_encrypt_fast , .dec = dap_enc_iaes256_cbc_decrypt, + .dec_na = dap_enc_iaes256_cbc_decrypt_fast , .new_callback = dap_enc_aes_key_new, .delete_callback = dap_enc_aes_key_delete, .new_generate_callback = dap_enc_aes_key_generate, + .enc_out_size = dap_enc_iaes256_calc_encode_size, + .dec_out_size = dap_enc_iaes256_calc_decode_size, }, [DAP_ENC_KEY_TYPE_MSRLN] = { .name = "MSRLN", @@ -68,7 +74,9 @@ 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, - .new_from_data_public_callback = dap_enc_msrln_key_new_from_data_public + .new_from_data_public_callback = dap_enc_msrln_key_new_from_data_public, + .enc_out_size = NULL, + .dec_out_size = NULL }, [DAP_ENC_KEY_TYPE_DEFEO]={ .name = "DEFEO", @@ -79,6 +87,8 @@ struct dap_enc_key_callbacks{ .new_callback = dap_enc_defeo_key_new, .delete_callback = dap_enc_defeo_key_delete, .new_generate_callback = dap_enc_defeo_key_new_generate, + .enc_out_size = NULL, + .dec_out_size = NULL }, [DAP_ENC_KEY_TYPE_SIG_PICNIC]={ .name = "PICNIC", @@ -89,6 +99,8 @@ struct dap_enc_key_callbacks{ .new_callback = dap_enc_defeo_key_new, .delete_callback = dap_enc_defeo_key_delete, .new_generate_callback = dap_enc_defeo_key_new_generate, + .enc_out_size = NULL, + .dec_out_size = NULL }, [DAP_ENC_KEY_TYPE_SIG_BLISS]={ @@ -102,6 +114,8 @@ 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, + .enc_out_size = NULL, + .dec_out_size = NULL } }; @@ -232,3 +246,21 @@ void dap_enc_key_delete(dap_enc_key_t * a_key) free(a_key->priv_key_data); free(a_key); } + +size_t dap_enc_key_get_enc_size(dap_enc_key_t * a_key, const size_t buf_in_size) +{ + if(s_callbacks[a_key->type].enc_out_size) { + return s_callbacks[a_key->type].enc_out_size(buf_in_size); + } + log_it(L_ERROR, "enc_out_size not realize for current key type"); + return 0; +} + +size_t dap_enc_key_get_dec_size(dap_enc_key_t * a_key, const size_t buf_in_size) +{ + if(s_callbacks[a_key->type].dec_out_size) { + return s_callbacks[a_key->type].dec_out_size(buf_in_size); + } + log_it(L_ERROR, "dec_out_size not realize for current key type"); + return 0; +} diff --git a/crypto/dap_enc_key.h b/crypto/dap_enc_key.h index a24d5a3dfba2e6e5859f38a64b63f06944554030..47db5f3fb4d1394a013586bb1af712904c2bdfb1 100644 --- a/crypto/dap_enc_key.h +++ b/crypto/dap_enc_key.h @@ -152,6 +152,7 @@ typedef void (*dap_enc_callback_data_t)(struct dap_enc_key *, const void * , siz typedef void (*dap_enc_callback_size_t)(struct dap_enc_key *, size_t); typedef void (*dap_enc_callback_str_t)(struct dap_enc_key *, const char*); typedef char* (*dap_enc_callback_r_str_t)(struct dap_enc_key *); +typedef size_t (*dap_enc_callback_calc_out_size)(const size_t); typedef struct dap_enc_key { size_t priv_key_data_size; @@ -166,8 +167,8 @@ typedef struct dap_enc_key { dap_enc_key_type_t type; dap_enc_callback_dataop_t enc; dap_enc_callback_dataop_t dec; - dap_enc_callback_dataop_t enc_na; - dap_enc_callback_dataop_t dec_na; + dap_enc_callback_dataop_na_t enc_na; + dap_enc_callback_dataop_na_t dec_na; dap_enc_gen_alice_shared_key gen_alice_shared_key; dap_enc_gen_bob_shared_key gen_bob_shared_key; @@ -196,6 +197,9 @@ int dap_enc_key_init(void); void dap_enc_key_deinit(void); +size_t dap_enc_key_get_enc_size(dap_enc_key_t * a_key, const size_t buf_in_size); +size_t dap_enc_key_get_dec_size(dap_enc_key_t * a_key, const size_t buf_in_size); + dap_enc_key_serealize_t* dap_enc_key_serealize(dap_enc_key_t * key); dap_enc_key_t* dap_enc_key_deserealize(void *buf, size_t buf_size); diff --git a/test/crypto/dap_enc_base64_test.c b/test/crypto/dap_enc_base64_test.c index 274e21530a36e5358de8aa2b2ab5c35957d2b6c2..8a172361f3c4b5c1af3b341319c358d688822e3b 100644 --- a/test/crypto/dap_enc_base64_test.c +++ b/test/crypto/dap_enc_base64_test.c @@ -1,4 +1,5 @@ #include "dap_enc_base64_test.h" +#include "dap_common.h" void test_encode_decode_base64(int count_steps, dap_enc_data_type_t standard) { diff --git a/test/crypto/dap_enc_msrln_test.c b/test/crypto/dap_enc_msrln_test.c index 0020d50540883c2bc92518b1c47d4dad139ab10f..1bf814f7cbd2fedde84f95fd0e2f00611c769dc1 100644 --- a/test/crypto/dap_enc_msrln_test.c +++ b/test/crypto/dap_enc_msrln_test.c @@ -15,7 +15,7 @@ static void key_transfer_simulation_test() alice_msg = alice_key->pub_key_data; alice_msg_len = alice_key->pub_key_data_size; -// /* generate Bob's response */ + /* generate Bob's response */ dap_enc_key_t* bob_key = dap_enc_key_new(DAP_ENC_KEY_TYPE_MSRLN); bob_key->gen_bob_shared_key(bob_key, alice_msg, alice_msg_len, (void**)&bob_key->pub_key_data); bob_msg = bob_key->pub_key_data; @@ -38,6 +38,4 @@ void dap_enc_msrln_tests_run(void) dap_print_module_name("dap_enc_msrln_test"); key_transfer_simulation_test(); - // return rc; - } diff --git a/test/crypto/dap_enc_test.c b/test/crypto/dap_enc_test.c index 2c47dc6a234b1a7de458fd3acf8aaa8c8b02f28a..dbc57c44e2e84e6b2ebf18f32803fc7823eba9a1 100644 --- a/test/crypto/dap_enc_test.c +++ b/test/crypto/dap_enc_test.c @@ -26,29 +26,32 @@ static void _encrypt_decrypt(enum dap_enc_key_type key_type, dap_enc_key_t* key = dap_enc_key_new_generate(key_type, kex_data, kex_size, seed, seed_size, 0); + uint8_t source[source_size]; - uint8_t *decode_result; - uint8_t *encrypt_result; + size_t encrypt_buff_size = dap_enc_code_out_size(key, source_size, data_type); + uint8_t encrypt_result[encrypt_buff_size]; generate_random_byte_array(source, source_size); size_t encrypted_size = dap_enc_code(key, source, source_size, - (void**)&encrypt_result, + encrypt_result, + encrypt_buff_size, data_type); + size_t min_decode_buff_size = dap_enc_decode_out_size(key, encrypt_buff_size, data_type); + uint8_t decode_result[min_decode_buff_size]; size_t out_size = dap_enc_decode(key, encrypt_result, encrypted_size, - (void**)&decode_result, + decode_result, + min_decode_buff_size, data_type); dap_assert_PIF(source_size == out_size, "Check result decode size"); dap_assert_PIF(memcmp(source, decode_result, source_size) == 0, "Check source and encode->decode data"); - free(encrypt_result); - free(decode_result); dap_enc_key_delete(key); } } @@ -88,7 +91,7 @@ void test_key_transfer_msrln() /* generate Bob's response */ dap_enc_key_t* bob_key = dap_enc_key_new(DAP_ENC_KEY_TYPE_MSRLN); bob_key->gen_bob_shared_key(bob_key, (unsigned char *) alice_msg, alice_msg_len, - (void **) &bob_key->pub_key_data); + (void **) &bob_key->pub_key_data); bob_msg = bob_key->pub_key_data; bob_msg_len = bob_key->pub_key_data_size; @@ -170,27 +173,31 @@ static void test_serealize_deserealize() const char* source = "simple test"; size_t source_size = strlen(source); - uint8_t * encrypt_result = NULL; - uint8_t * decode_result = NULL; + size_t encrypt_size = dap_enc_code_out_size(key, source_size, DAP_ENC_DATA_TYPE_RAW); + uint8_t encrypt_result[encrypt_size]; + size_t encrypted_size = dap_enc_code(key2, source, source_size, - (void**)&encrypt_result, + encrypt_result, + encrypt_size, DAP_ENC_DATA_TYPE_RAW); + size_t min_decode_size = dap_enc_decode_out_size(key, encrypt_size, DAP_ENC_DATA_TYPE_RAW); + + uint8_t decode_result[min_decode_size]; size_t decode_size = dap_enc_decode(key, - encrypt_result, - encrypted_size, - (void**)&decode_result, - DAP_ENC_DATA_TYPE_RAW); + encrypt_result, + encrypted_size, + decode_result, + min_decode_size, + DAP_ENC_DATA_TYPE_RAW); dap_assert_PIF(source_size == decode_size, "Check result decode size"); dap_assert_PIF(memcmp(source, decode_result, source_size) == 0, "Check source and encode->decode data"); - free(encrypt_result); - free(decode_result); free(serealize_key); free(deserealize_key); dap_enc_key_delete(key); diff --git a/test/libdap-test b/test/libdap-test index 982e8d9e7726918ce622b42b5335f324e738c6dc..269a48d990a010dc778067fa88a7c2b793eec647 160000 --- a/test/libdap-test +++ b/test/libdap-test @@ -1 +1 @@ -Subproject commit 982e8d9e7726918ce622b42b5335f324e738c6dc +Subproject commit 269a48d990a010dc778067fa88a7c2b793eec647