diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user index 3d708f47ba113c67877250b5ab2dd289e3be9cf0..1a3295e2731d2ff1587db43601a33f08c1644366 100644 --- a/CMakeLists.txt.user +++ b/CMakeLists.txt.user @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE QtCreatorProject> -<!-- Written by QtCreator 4.11.2, 2020-04-24T10:38:37. --> +<!-- Written by QtCreator 4.11.2, 2020-04-25T15:27:51. --> <qtcreator> <data> <variable>EnvironmentId</variable> diff --git a/src/blowfish/bf_enc.c b/src/blowfish/bf_enc.c index 0d538d7e75e2600ecaf4b7f04fb0ce6f18ca3f3b..05576bf868ea6eaddaad0facfaf8740355384ebf 100644 --- a/src/blowfish/bf_enc.c +++ b/src/blowfish/bf_enc.c @@ -11,6 +11,7 @@ # error If you set BF_ROUNDS to some value other than 16 or 20, you will have \ to modify the code. #endif +//#include<stdio.h> void BF_encrypt(BF_LONG *data, const BF_KEY *key) { @@ -115,8 +116,24 @@ void BF_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, l2n(tout0, out); l2n(tout1, out); } - if (l != -8) { - n2ln(in, tin0, tin1, l + 8); + if (1||l != -8) { + unsigned char tmpin[16]; + unsigned char *ptmpin = tmpin; + memcpy(tmpin, in, l + 8); + memcpy(tmpin + l + 8, &length, 4); + int pad_length = (8-(l + 8 + 4 + 1)%8)%8; + for(int i = 0; i < pad_length; ++i) + { + tmpin[l+8+4+i]=16;//prng better + } + tmpin[l+8+4+pad_length]=pad_length; +// for(int i = 0; i < l + 8 + 4 +1 +pad_length; ++i) +// { +// printf("%.2x ", tmpin[i]); +// } +// printf("\n");fflush(stdout); + n2l(ptmpin, tin0); + n2l(ptmpin, tin1); tin0 ^= tout0; tin1 ^= tout1; tin[0] = tin0; @@ -126,6 +143,32 @@ void BF_cbc_encrypt(const unsigned char *in, unsigned char *out, long length, tout1 = tin[1]; l2n(tout0, out); l2n(tout1, out); + if(l+8+4+pad_length + 1 == 16) + { + n2l(ptmpin, tin0); + n2l(ptmpin, tin1); + tin0 ^= tout0; + tin1 ^= tout1; + tin[0] = tin0; + tin[1] = tin1; + BF_encrypt(tin, schedule); + tout0 = tin[0]; + tout1 = tin[1]; + l2n(tout0, out); + l2n(tout1, out); + } + + +// n2ln(in, tin0, tin1, l + 8); +// tin0 ^= tout0; +// tin1 ^= tout1; +// tin[0] = tin0; +// tin[1] = tin1; +// BF_encrypt(tin, schedule); +// tout0 = tin[0]; +// tout1 = tin[1]; +// l2n(tout0, out); +// l2n(tout1, out); } l2n(tout0, ivec); l2n(tout1, ivec); diff --git a/src/dap_enc_bf_cbc.c b/src/dap_enc_bf_cbc.c index 481dbcc4ec0b27d3b10d870e58bd7d4e4f9e369a..287718265511459bbde8244565b78cd5beb1d265 100644 --- a/src/dap_enc_bf_cbc.c +++ b/src/dap_enc_bf_cbc.c @@ -17,13 +17,25 @@ 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]; //BF_KEY *key=a_key->priv_key_data; + if(a_in_size <= 8 || 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); BF_cbc_encrypt((unsigned char *)(a_in + 8), *a_out, a_in_size - 8, a_key->priv_key_data, iv, BF_DECRYPT); - size_t a_out_size = a_in_size - 8; + int bf_cbc_padding_length = *(uint8_t*)(*a_out + a_in_size - 8 - 1); + +// for(int i=0;i < bf_cbc_padding_length + 4 + 1; ++i) +// printf("%.2x ", *(uint8_t*)(*a_out + a_in_size - 8 - 1 - bf_cbc_padding_length - 4 + i)); +// for(int i=0;i < a_in_size - 8; ++i) +// printf("%.2x ", *(uint8_t*)(*a_out + i)); +// printf("\n"); +// fflush(stdout); + size_t a_out_size = *(uint32_t*)(*a_out + a_in_size - 8 - 1 - bf_cbc_padding_length - 4); return a_out_size; } @@ -35,37 +47,52 @@ size_t dap_enc_bf_cbc_encrypt(struct dap_enc_key * a_key, const void * a_in, siz 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; + } + // BF_KEY *key = a_key->priv_key_data; - *a_out = DAP_NEW_SIZE(uint8_t, a_in_size + 8); + size_t a_out_size = (a_in_size + 4 + 1 + 7)/8*8 + 8; + *a_out = DAP_NEW_SIZE(uint8_t, a_out_size); memcpy(*a_out, iv, 8); BF_cbc_encrypt((unsigned char *)(a_in), *a_out + 8, a_in_size, a_key->priv_key_data, iv, BF_ENCRYPT); - size_t a_out_size = a_in_size + 8; return a_out_size; } size_t dap_enc_bf_cbc_calc_encode_size(const size_t size_in) { - return size_in + 8; + return (size_in + 4 + 1 + 7)/8*8 + 8; } size_t dap_enc_bf_cbc_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; + } return size_in - 8; } size_t dap_enc_bf_cbc_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) { + size_t a_in_size, void * a_out, size_t buf_out_size) { + if(a_in_size - 8 > buf_out_size || a_in_size %8) { + 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); BF_cbc_encrypt((unsigned char *)(a_in + 8), a_out, a_in_size - 8, a_key->priv_key_data, iv, BF_DECRYPT); - size_t a_out_size = a_in_size - 8; + + int bf_cbc_padding_length = *(uint8_t*)(a_out + a_in_size - 8 - 1); + + size_t a_out_size = *(uint32_t*)(a_out + a_in_size - 8 - 1 - bf_cbc_padding_length - 4); return a_out_size; } @@ -74,6 +101,12 @@ 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 * 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 + 4 + 1 + 7)/8*8 + 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); @@ -83,7 +116,6 @@ size_t dap_enc_bf_cbc_encrypt_fast(struct dap_enc_key * a_key, const void * a_in memcpy(a_out, iv, 8); BF_cbc_encrypt((unsigned char *)(a_in), a_out + 8, a_in_size, a_key->priv_key_data, iv, BF_ENCRYPT); - size_t a_out_size = a_in_size + 8; return a_out_size; } @@ -95,8 +127,8 @@ void dap_enc_bf_cbc_key_new(struct dap_enc_key * a_key) a_key->type = DAP_ENC_KEY_TYPE_BF_CBC; a_key->enc = dap_enc_bf_cbc_encrypt; a_key->dec = dap_enc_bf_cbc_decrypt; - a_key->enc_na = dap_enc_bf_cbc_encrypt_fast;//maybe exclude it - a_key->dec_na = dap_enc_bf_cbc_decrypt_fast;//maybe exclude it + a_key->enc_na = dap_enc_bf_cbc_encrypt_fast; + 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, @@ -127,43 +159,3 @@ void dap_enc_bf_cbc_key_delete(struct dap_enc_key *a_key) } a_key->priv_key_data_size = 0; } - -#ifdef NOT_REVISED_YET - - - - - - - -// Writes result ( out ) in already allocated buffer -size_t dap_enc_bf_cbc_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) -{ - OAES_CTX *ctx = get_bf_cbc_ctx(a_key); - if(!ctx) - return 0; - - OAES_RET ret = bf_cbc_decrypt(ctx, a_in, a_in_size, buf_out, &buf_out_size); - if(ret != OAES_RET_SUCCESS) { - buf_out_size = 0; - } - return buf_out_size; -} - -// Writes result ( out ) in already allocated buffer -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) -{ - OAES_CTX *ctx = get_bf_cbc_ctx(a_key); - if(!ctx) - return 0; - - OAES_RET ret = bf_cbc_encrypt(ctx, a_in, a_in_size, buf_out, &buf_out_size); - if(ret != OAES_RET_SUCCESS) { - buf_out_size = 0; - } - return buf_out_size; -} - -#endif diff --git a/src/rand/dap_rand.c b/src/rand/dap_rand.c index cbdddadcb39c550c52b07ebad9b6d045f2439d9a..e730ee27d76c4c879cb7bf4740f696cf0d71def5 100755 --- a/src/rand/dap_rand.c +++ b/src/rand/dap_rand.c @@ -28,10 +28,13 @@ uint32_t random_uint32_t(const uint32_t MAX_NUMBER) int randombase64(void*random_array, unsigned int size) { - int off = size - (size*6)/8; - int odd_signs = size - ((size*6)/8)*8; - randombytes(random_array + off, (size*6)/8); - dap_enc_base64_encode(random_array + off, (size*6)/8,random_array,DAP_ENC_DATA_TYPE_B64); + int off = size - (size*8/32)*24; + int odd_signs = size - ((size*8/32)*24)*32; + 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); + } if(odd_signs) { uint8_t tmpv[7]; diff --git a/test/crypto/dap_enc_bf_cbc_test.c b/test/crypto/dap_enc_bf_cbc_test.c index 66b78e41d16a51fabea23cfd31cdaaa1745369a5..63d62a4ce9e5c9d93d8041d79f58ecd66ac13751 100644 --- a/test/crypto/dap_enc_bf_cbc_test.c +++ b/test/crypto/dap_enc_bf_cbc_test.c @@ -8,8 +8,8 @@ static void test_encode_decode(int count_steps) size_t source_size = 0; for(int i = 0; i < count_steps; i++) { - source_size = 1 + random_uint32_t(20); - + source_size = 1 + random_uint32_t(20000); +// printf("src_size = %d\n", source_size);fflush(stdout); const size_t seed_size = 16; uint8_t seed[seed_size]; @@ -21,22 +21,35 @@ static void test_encode_decode(int count_steps) dap_enc_key_t* key = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_BF_CBC, kex, kex_size, seed, seed_size, 32); - uint8_t *source = DAP_NEW_SIZE(uint8_t, source_size + 1); + 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) +// printf("%.2x ", source[i]); +// printf("\n");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); size_t result_size = key->dec(key, buf_encrypted, encrypted_size, (void**) &buf_decrypted); + // DAP_DELETE(source); -// printf("pt_size = %d, decr_size = %d\n", source_size, result_size); +// 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); +// //printf("pt = %s\n", source); // fflush(stdout); -// printf("pt2 = %s\n", buf_decrypted); +// // printf("pt2 = %s\n", buf_decrypted); // fflush(stdout); dap_assert_PIF(source_size == result_size, "Check result decode size"); @@ -44,7 +57,6 @@ static void test_encode_decode(int count_steps) 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); @@ -74,15 +86,15 @@ static void test_encode_decode_fast(int count_steps) size_t source_size = 0; for(int i = 0; i < count_steps; i++) { - source_size = 1 + random_uint32_t(20); + source_size = 1 + random_uint32_t(2000); - uint8_t *source = DAP_NEW_SIZE(uint8_t,source_size + 1); + uint8_t *source = DAP_NEW_SIZE(uint8_t,source_size + 0); randombase64(source, source_size); - size_t encrypted_size = key->enc_na(key, source, source_size, buf_encrypt_out, source_size + 8); + size_t encrypted_size = key->enc_na(key, source, source_size, buf_encrypt_out, buf_size); - size_t result_size = key->dec_na(key, buf_encrypt_out, encrypted_size, buf_decrypt_out, encrypted_size - 8); + size_t result_size = key->dec_na(key, buf_encrypt_out, encrypted_size, buf_decrypt_out, buf_size); @@ -113,7 +125,7 @@ void dap_enc_bf_cbc_tests_run() dap_print_module_name("dap_enc_bf_cbc"); init_test_case(); - test_encode_decode(50); + test_encode_decode(100); test_encode_decode_fast(100); cleanup_test_case(); diff --git a/test/crypto/main.c b/test/crypto/main.c index 71f0368ab27b1df1c3b5a55aeaf2cc8d0aa3a73d..436ef8f547fa341de9c5fe328cef87c75619e57a 100755 --- a/test/crypto/main.c +++ b/test/crypto/main.c @@ -20,6 +20,8 @@ int main(void) { // switch off debug info from library dap_log_level_set(L_CRITICAL); + // + dap_enc_bf_cbc_tests_run(); //dap_enc_ringct20_tests_run(100); return 0; @@ -28,6 +30,7 @@ int main(void) dap_enc_dilithium_tests_run(); dap_enc_aes_tests_run(); dap_enc_oaes_tests_run(); + dap_enc_base64_tests_run(); dap_enc_base58_tests_run(); dap_enc_msrln_tests_run();