diff --git a/include/dap_enc_bf_cbc.h b/include/dap_enc_bf.h similarity index 52% rename from include/dap_enc_bf_cbc.h rename to include/dap_enc_bf.h index 2bf8826a4508dc7d5046f7087641fa82471058c2..cfc314a62b377d1925c9a6d26de6c16fcaf80911 100644 --- a/include/dap_enc_bf_cbc.h +++ b/include/dap_enc_bf.h @@ -8,11 +8,11 @@ #ifdef __cplusplus extern "C" { #endif - -void dap_enc_bf_cbc_key_new(struct dap_enc_key * a_key); -void dap_enc_bf_cbc_key_delete(struct dap_enc_key *a_key); -void dap_enc_bf_cbc_key_generate(struct dap_enc_key * a_key, const void *kex_buf, +void dap_enc_bf_key_delete(struct dap_enc_key *a_key); +void dap_enc_bf_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); +//-----CBC---------- +void dap_enc_bf_cbc_key_new(struct dap_enc_key * a_key); size_t dap_enc_bf_cbc_calc_decode_size(const size_t size_in); size_t dap_enc_bf_cbc_calc_encode_size(const size_t size_in); @@ -27,6 +27,22 @@ size_t dap_enc_bf_cbc_decrypt_fast(struct dap_enc_key * a_key, const void * a_in size_t dap_enc_bf_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); +//------OFB--------- +void dap_enc_bf_ofb_key_new(struct dap_enc_key * a_key); + +size_t dap_enc_bf_ofb_calc_decode_size(const size_t size_in); +size_t dap_enc_bf_ofb_calc_encode_size(const size_t size_in); + +size_t dap_enc_bf_ofb_decrypt(struct dap_enc_key * a_key, const void * a_in, size_t a_in_size, void ** a_out); +size_t dap_enc_bf_ofb_encrypt(struct dap_enc_key * a_key, const void * a_in, size_t a_in_size, void ** a_out); + +// Writes result ( out ) in already allocated buffer +size_t dap_enc_bf_ofb_decrypt_fast(struct dap_enc_key * a_key, const void * a_in, + size_t a_in_size, void * buf_out, size_t buf_out_size); +// Writes result ( out ) in already allocated buffer +size_t dap_enc_bf_ofb_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); + #ifdef __cplusplus } #endif diff --git a/include/dap_enc_key.h b/include/dap_enc_key.h index 873c82c8d13d181612f9ed3efb739a7b0228bac5..138a7d5af2e3dd95349332723a7854c2304c3ac9 100755 --- a/include/dap_enc_key.h +++ b/include/dap_enc_key.h @@ -44,11 +44,16 @@ typedef enum dap_enc_data_type{DAP_ENC_DATA_TYPE_RAW, -typedef enum dap_enc_key_type{ DAP_ENC_KEY_TYPE_IAES, // Symmetric AES +typedef enum dap_enc_key_type{ + + DAP_ENC_KEY_TYPE_IAES, // Symmetric AES DAP_ENC_KEY_TYPE_OAES,// from https://github.com/monero-project/monero/tree/master/src/crypto DAP_ENC_KEY_TYPE_BF_CBC,// BlowFish CBCmode + DAP_ENC_KEY_TYPE_BF_OFB,//BlowFish OFBmode + + DAP_ENC_KEY_TYPE_RLWE_NEWHOPE, // "NewHope": key exchange from the ring learning with errors problem // (Alkim, Ducas, Pöppelmann, Schwabe, USENIX Security 2016 ) diff --git a/src/dap_enc_bf_cbc.c b/src/dap_enc_bf.c similarity index 58% rename from src/dap_enc_bf_cbc.c rename to src/dap_enc_bf.c index 287718265511459bbde8244565b78cd5beb1d265..704e5241fef6b9e924d8571cc67ed8509c5e27a6 100644 --- a/src/dap_enc_bf_cbc.c +++ b/src/dap_enc_bf.c @@ -4,15 +4,43 @@ #include <stddef.h> #include <string.h> -//#include "oaes_lib.h" -#include "dap_enc_bf_cbc.h" +#include "dap_enc_bf.h" #include "dap_common.h" #include "rand/dap_rand.h" #include"sha3/KeccakHash.h" #define LOG_TAG "dap_enc_bf_cbc" -//todo clear l/8 and iv things + +void dap_enc_bf_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) +{ + a_key->last_used_timestamp = time(NULL); + + + a_key->priv_key_data_size = sizeof(BF_KEY); + a_key->priv_key_data = DAP_NEW_SIZE(uint8_t, sizeof(BF_KEY)); + + uint8_t *tmp_buf = DAP_NEW_SIZE(uint8_t, (BF_ROUNDS + 2)*4); + Keccak_HashInstance Keccak_ctx; + Keccak_HashInitialize(&Keccak_ctx, 1088, 512, (BF_ROUNDS + 2)*4*8, 0x06); + Keccak_HashUpdate(&Keccak_ctx, kex_buf, kex_size*8); + if(seed_size) + Keccak_HashUpdate(&Keccak_ctx, seed, seed_size*8); + Keccak_HashFinal(&Keccak_ctx, tmp_buf); + + BF_set_key(a_key->priv_key_data, (BF_ROUNDS + 2)*4, tmp_buf); + } +void dap_enc_bf_key_delete(struct dap_enc_key *a_key) +{ + if(a_key->priv_key_data != NULL) + { + randombytes(a_key->priv_key_data,a_key->priv_key_data_size); + DAP_DELETE(a_key->priv_key_data); + } + a_key->priv_key_data_size = 0; +} +//------CBC----------- size_t dap_enc_bf_cbc_decrypt(struct dap_enc_key *a_key, const void * a_in, size_t a_in_size, void ** a_out) { uint8_t iv[8]; @@ -131,31 +159,114 @@ void dap_enc_bf_cbc_key_new(struct dap_enc_key * a_key) a_key->dec_na = dap_enc_bf_cbc_decrypt_fast; } -void dap_enc_bf_cbc_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) +//------OFB----------- + +size_t dap_enc_bf_ofb_decrypt(struct dap_enc_key *a_key, const void * a_in, + size_t a_in_size, void ** a_out) { + uint8_t iv[8]; + + if(a_in_size <= 8) { + log_it(L_ERROR, "blowfish_cbc decryption ct with iv must be more than 8 bytes and equal to 8*k"); + return 0; + } + + + *a_out = DAP_NEW_SIZE(uint8_t, a_in_size - 8); + memcpy(iv, a_in, 8); + int num = 0;//need for concatenate encryptions or decryptions + BF_ofb64_encrypt((unsigned char *)(a_in + 8), *a_out, a_in_size - 8, + a_key->priv_key_data, iv, &num); + size_t a_out_size = a_in_size - 8; + return a_out_size; +} + + + +size_t dap_enc_bf_ofb_encrypt(struct dap_enc_key * a_key, const void * a_in, size_t a_in_size, void ** a_out) { - a_key->last_used_timestamp = time(NULL); + //generate iv and put it in *a_out first bytes + uint8_t iv[8]; + randombytes(iv, 8); + if(a_in_size <= 0) { + log_it(L_ERROR, "blowfish_cbc encryption pt cannot be 0 bytes"); + return 0; + } - a_key->priv_key_data_size = sizeof(BF_KEY); - a_key->priv_key_data = DAP_NEW_SIZE(uint8_t, sizeof(BF_KEY)); - uint8_t *tmp_buf = DAP_NEW_SIZE(uint8_t, (BF_ROUNDS + 2)*4); - Keccak_HashInstance Keccak_ctx; - Keccak_HashInitialize(&Keccak_ctx, 1088, 512, (BF_ROUNDS + 2)*4*8, 0x06); - Keccak_HashUpdate(&Keccak_ctx, kex_buf, kex_size*8); - if(seed_size) - Keccak_HashUpdate(&Keccak_ctx, seed, seed_size*8); - Keccak_HashFinal(&Keccak_ctx, tmp_buf); - BF_set_key(a_key->priv_key_data, (BF_ROUNDS + 2)*4, tmp_buf); - } -void dap_enc_bf_cbc_key_delete(struct dap_enc_key *a_key) + + size_t a_out_size = a_in_size + 8; + *a_out = DAP_NEW_SIZE(uint8_t, a_out_size); + memcpy(*a_out, iv, 8); + int num = 0;//need for concatenate encryptions or decryptions + BF_ofb64_encrypt((unsigned char *)(a_in), *a_out + 8, a_in_size, + a_key->priv_key_data, iv, &num); + return a_out_size; +} + +size_t dap_enc_bf_ofb_calc_encode_size(const size_t size_in) { - if(a_key->priv_key_data != NULL) - { - randombytes(a_key->priv_key_data,a_key->priv_key_data_size); - DAP_DELETE(a_key->priv_key_data); + return size_in + 8; +} + +size_t dap_enc_bf_ofb_calc_decode_size(const size_t size_in) +{ + if(size_in <= 8) { + log_it(L_ERROR, "blowfish_cbc decryption size_in ct with iv must be more than 8 bytes"); + return 0; } - a_key->priv_key_data_size = 0; + return size_in - 8; +} + +size_t dap_enc_bf_ofb_decrypt_fast(struct dap_enc_key *a_key, const void * a_in, + size_t a_in_size, void * a_out, size_t buf_out_size) { + if(a_in_size - 8 > buf_out_size) { + log_it(L_ERROR, "blowfish_cbc fast_decryption too small buf_out_size or not 8*k"); + return 0; + } + uint8_t iv[8]; + //BF_KEY *key=a_key->priv_key_data; + + memcpy(iv, a_in, 8); + int num = 0;//need for concatenate encryptions or decryptions + + BF_ofb64_encrypt((unsigned char *)(a_in + 8), a_out, a_in_size - 8, + a_key->priv_key_data, iv, &num); + + size_t a_out_size = a_in_size - 8; + return a_out_size; } + + + +size_t dap_enc_bf_ofb_encrypt_fast(struct dap_enc_key * a_key, const void * a_in, size_t a_in_size, void * a_out,size_t buf_out_size) +{ + //generate iv and put it in *a_out first bytes + size_t a_out_size = a_in_size + 8; + if(a_out_size > buf_out_size) { + log_it(L_ERROR, "blowfish_cbc fast_encryption too small buf_out_size"); + return 0; + } + + uint8_t iv[8]; + randombytes(iv, 8); + + memcpy(a_out, iv, 8); + int num = 0;//need for concatenate encryptions or decryptions + BF_ofb64_encrypt((unsigned char *)(a_in), a_out + 8, a_in_size, + a_key->priv_key_data, iv, &num); + return a_out_size; + } +void dap_enc_bf_ofb_key_new(struct dap_enc_key * a_key) +{ + a_key->_inheritor = NULL;//(uint8_t *) bf_cbc_alloc(); + a_key->_inheritor_size = 0;//sizeof(bf_cbc_ctx); + a_key->type = DAP_ENC_KEY_TYPE_BF_OFB; + a_key->enc = dap_enc_bf_ofb_encrypt; + a_key->dec = dap_enc_bf_ofb_decrypt; + a_key->enc_na = dap_enc_bf_ofb_encrypt_fast; + a_key->dec_na = dap_enc_bf_ofb_decrypt_fast; +} + + diff --git a/src/dap_enc_key.c b/src/dap_enc_key.c index c90d8136810fb0ee3e73ab78d4ea208339170525..6298a516d6ccd68f27fff78dc93c5a39733c820b 100755 --- a/src/dap_enc_key.c +++ b/src/dap_enc_key.c @@ -25,7 +25,7 @@ #include "dap_enc_iaes.h" #include "dap_enc_oaes.h" -#include "dap_enc_bf_cbc.h" +#include "dap_enc_bf.h" #include "dap_enc_msrln.h" #include "dap_enc_defeo.h" #include "dap_enc_picnic.h" @@ -105,8 +105,8 @@ struct dap_enc_key_callbacks{ .dec = dap_enc_bf_cbc_decrypt, .dec_na = dap_enc_bf_cbc_decrypt_fast , .new_callback = dap_enc_bf_cbc_key_new, - .delete_callback = dap_enc_bf_cbc_key_delete, - .new_generate_callback = dap_enc_bf_cbc_key_generate, + .delete_callback = dap_enc_bf_key_delete, + .new_generate_callback = dap_enc_bf_key_generate, .gen_key_public = NULL, .gen_key_public_size = NULL, .enc_out_size = dap_enc_bf_cbc_calc_encode_size, @@ -114,6 +114,22 @@ struct dap_enc_key_callbacks{ .sign_get = NULL, .sign_verify = NULL }, + [DAP_ENC_KEY_TYPE_BF_OFB]={ + .name = "BF_OFB", + .enc = dap_enc_bf_ofb_encrypt, + .enc_na = dap_enc_bf_ofb_encrypt_fast , + .dec = dap_enc_bf_ofb_decrypt, + .dec_na = dap_enc_bf_ofb_decrypt_fast , + .new_callback = dap_enc_bf_ofb_key_new, + .delete_callback = dap_enc_bf_key_delete, + .new_generate_callback = dap_enc_bf_key_generate, + .gen_key_public = NULL, + .gen_key_public_size = NULL, + .enc_out_size = dap_enc_bf_ofb_calc_encode_size, + .dec_out_size = dap_enc_bf_ofb_calc_decode_size, + .sign_get = NULL, + .sign_verify = NULL + }, [DAP_ENC_KEY_TYPE_MSRLN] = { .name = "MSRLN", .enc = NULL, diff --git a/src/rand/dap_rand.c b/src/rand/dap_rand.c index e730ee27d76c4c879cb7bf4740f696cf0d71def5..145f1466e998af2caf3472fb1a6ccc3119e7f920 100755 --- a/src/rand/dap_rand.c +++ b/src/rand/dap_rand.c @@ -28,12 +28,12 @@ uint32_t random_uint32_t(const uint32_t MAX_NUMBER) int randombase64(void*random_array, unsigned int size) { - int off = size - (size*8/32)*24; - int odd_signs = size - ((size*8/32)*24)*32; + int off = size - (size/4)*3; + int odd_signs = size - ((size/4)*4); if(odd_signs < size) { - randombytes(random_array + off, (size*6)/8); - dap_enc_base64_encode(random_array + off, (size*6)/8,random_array,DAP_ENC_DATA_TYPE_B64); + randombytes(random_array + off, (size/4)*3); + dap_enc_base64_encode(random_array + off, (size/4)*3,random_array,DAP_ENC_DATA_TYPE_B64); } if(odd_signs) { diff --git a/test/crypto/dap_enc_bf_cbc_test.c b/test/crypto/dap_enc_bf_test.c similarity index 62% rename from test/crypto/dap_enc_bf_cbc_test.c rename to test/crypto/dap_enc_bf_test.c index 63d62a4ce9e5c9d93d8041d79f58ecd66ac13751..e4afad6f3ec2ac38e32e7eff6148380814fafa59 100644 --- a/test/crypto/dap_enc_bf_cbc_test.c +++ b/test/crypto/dap_enc_bf_test.c @@ -3,12 +3,12 @@ #include"dap_test.h" //#include"blowfish/blowfish.h" -static void test_encode_decode(int count_steps) +static void test_encode_decode(int count_steps, const dap_enc_key_type_t key_type) { size_t source_size = 0; for(int i = 0; i < count_steps; i++) { - source_size = 1 + random_uint32_t(20000); + source_size = 1 + random_uint32_t(10000); // printf("src_size = %d\n", source_size);fflush(stdout); const size_t seed_size = 16; uint8_t seed[seed_size]; @@ -19,44 +19,43 @@ static void test_encode_decode(int count_steps) randombytes(seed, seed_size); randombytes(kex, kex_size); - dap_enc_key_t* key = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_BF_CBC, kex, kex_size, seed, seed_size, 32); + dap_enc_key_t* key = dap_enc_key_new_generate(key_type, kex, kex_size, seed, seed_size, 32); + + const int verb = 0; + uint8_t *source = DAP_NEW_SIZE(uint8_t, source_size+verb); - uint8_t *source = DAP_NEW_SIZE(uint8_t, source_size+0); - memset(source, 0xff, source_size + 0); -// for(int i = 0; i < 16; ++i) -// printf("%.2x ", source[i]); -// printf("\n");fflush(stdout); randombase64(source, source_size); -// for(int i = 0; i < 16; ++i) +// for(int i = 0; i < source_size; ++i) // printf("%.2x ", source[i]); -// printf("\n");fflush(stdout); +// printf(" = len(%d)\n", source_size);fflush(stdout); uint8_t * buf_encrypted = NULL; uint8_t * buf_decrypted = NULL; size_t encrypted_size = key->enc(key, source, source_size, (void**) &buf_encrypted); -// for(int i = 0; i < 16; ++i) -// printf("%.2x ", source[i]); -// printf("\n");fflush(stdout); - //buf_encrypted[encrypted_size-1]=0; -// DAP_DELETE(source); - + if(verb) + { + for(int i = 0; i < 24; ++i) + printf("%.2x ", source[i]); + printf("\n");fflush(stdout); + } size_t result_size = key->dec(key, buf_encrypted, encrypted_size, (void**) &buf_decrypted); - // DAP_DELETE(source); - -// printf("pt_size = %d, decr_size = %d, encrypted_size = %d\n", source_size, result_size,encrypted_size); -// fflush(stdout); -// source[source_size] = 0; -// //printf("pt = %s\n", source); -// fflush(stdout); -// // printf("pt2 = %s\n", buf_decrypted); -// fflush(stdout); - + if(verb) + { + printf("pt_size = %d, decr_size = %d, encrypted_size = %d\n", source_size, result_size,encrypted_size); + fflush(stdout); + source[source_size] = 0; + printf("pt = %s\n", source); + fflush(stdout); + printf("pt2 = %s\n", buf_decrypted); + fflush(stdout); + } dap_assert_PIF(source_size == result_size, "Check result decode size"); dap_assert_PIF(memcmp(source, buf_decrypted, source_size) == 0, "Check source and encode->decode data"); + DAP_DELETE(source); free(buf_encrypted); free(buf_decrypted); dap_enc_key_delete(key); @@ -65,7 +64,7 @@ static void test_encode_decode(int count_steps) dap_pass_msg("Encode and decode"); } -static void test_encode_decode_fast(int count_steps) +static void test_encode_decode_fast(int count_steps, const dap_enc_key_type_t key_type) { const size_t buf_size = 4096; char buf_encrypt_out[buf_size]; @@ -81,7 +80,7 @@ static void test_encode_decode_fast(int count_steps) randombytes(seed, seed_size); randombytes(kex, kex_size); - dap_enc_key_t* key = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_BF_CBC, kex, kex_size, NULL, 0, 32); + dap_enc_key_t* key = dap_enc_key_new_generate(key_type, kex, kex_size, NULL, 0, 32); size_t source_size = 0; @@ -119,14 +118,20 @@ static void cleanup_test_case() { dap_enc_key_deinit(); } - -void dap_enc_bf_cbc_tests_run() +#include"blowfish/blowfish.h" +void dap_enc_bf_tests_run() { dap_print_module_name("dap_enc_bf_cbc"); init_test_case(); + test_encode_decode(100, DAP_ENC_KEY_TYPE_BF_CBC); + test_encode_decode_fast(100, DAP_ENC_KEY_TYPE_BF_CBC); + cleanup_test_case(); - test_encode_decode(100); - test_encode_decode_fast(100); - + dap_print_module_name("dap_enc_bf_ofb"); + init_test_case(); + test_encode_decode(100, DAP_ENC_KEY_TYPE_BF_OFB); + test_encode_decode_fast(100, DAP_ENC_KEY_TYPE_BF_OFB); cleanup_test_case(); + + } diff --git a/test/crypto/main.c b/test/crypto/main.c index 436ef8f547fa341de9c5fe328cef87c75619e57a..37a2c59d0972f456aa905fd83d095ae0b18bfe83 100755 --- a/test/crypto/main.c +++ b/test/crypto/main.c @@ -14,7 +14,7 @@ #include "rand/dap_rand.h" #include "dap_common.h" -void dap_enc_bf_cbc_tests_run(); +void dap_enc_bf_tests_run(); int main(void) { @@ -22,7 +22,7 @@ int main(void) dap_log_level_set(L_CRITICAL); // - dap_enc_bf_cbc_tests_run(); + dap_enc_bf_tests_run(); //dap_enc_ringct20_tests_run(100); return 0; dap_enc_picnic_tests_run();