diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user index d1ad6664b6cc9507c4e397109eb62f1646ea7811..82fe0bb1172c4d372887e194a384ea4dc35889fe 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-26T22:56:12. --> +<!-- Written by QtCreator 4.11.2, 2020-04-29T10:52:27. --> <qtcreator> <data> <variable>EnvironmentId</variable> @@ -329,7 +329,7 @@ <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> <value type="QString" key="RunConfiguration.WorkingDirectory"></value> - <value type="QString" key="RunConfiguration.WorkingDirectory.default">C:/qt_proj/build-libdap-crypto_new-Desktop_Qt_5_14_2_MinGW_32_bit-Debug/test/crypto</value> + <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value> </valuemap> <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1"> <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value> @@ -404,7 +404,7 @@ <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> <value type="QString" key="RunConfiguration.WorkingDirectory"></value> - <value type="QString" key="RunConfiguration.WorkingDirectory.default">C:/qt_proj/build-libdap-crypto_new-Desktop_Qt_5_14_2_MinGW_32_bit-Debug/test/cert</value> + <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value> </valuemap> <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">2</value> </valuemap> diff --git a/include/dap_enc_GOST.h b/include/dap_enc_GOST.h index ba36ccb0b2527cf2ef14c560a03a9b0676c72cb6..9ba75cc899ec35c2ed59927b9bb556dee1a01bae 100644 --- a/include/dap_enc_GOST.h +++ b/include/dap_enc_GOST.h @@ -26,6 +26,21 @@ size_t dap_enc_gost_ofb_decrypt_fast(struct dap_enc_key * a_key, const void * a_ // Writes result ( out ) in already allocated buffer size_t dap_enc_gost_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); +//------KUZNECHIK_OFB-------------- +void dap_enc_kuzn_ofb_key_new(struct dap_enc_key * a_key); + +size_t dap_enc_kuzn_ofb_calc_decode_size(const size_t size_in); +size_t dap_enc_kuzn_ofb_calc_encode_size(const size_t size_in); + +size_t dap_enc_kuzn_ofb_decrypt(struct dap_enc_key * a_key, const void * a_in, size_t a_in_size, void ** a_out); +size_t dap_enc_kuzn_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_kuzn_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_kuzn_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 } diff --git a/src/GOST/block_chipher.c b/src/GOST/block_chipher.c index 68b64bab746622b36bcbb7b42adf99b470e7c273..0bd604f81b6af07ba539daeef362e65b6157ac09 100644 --- a/src/GOST/block_chipher.c +++ b/src/GOST/block_chipher.c @@ -997,7 +997,7 @@ void DLL_IMPORT free_imit(void* ctx) } -int DLL_IMPORT encrypt_ecb(void *ctx, unsigned char *indata, unsigned char *outdata, size_t length) +int DLL_IMPORT encrypt_ecb(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t length) { Context_ecb* context; unsigned char* block; @@ -1021,7 +1021,7 @@ int DLL_IMPORT encrypt_ecb(void *ctx, unsigned char *indata, unsigned char *outd return 0; } -int DLL_IMPORT decrypt_ecb(void *ctx, unsigned char *indata, unsigned char *outdata, size_t length) +int DLL_IMPORT decrypt_ecb(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t length) { Context_ecb* context; size_t i; @@ -1049,7 +1049,7 @@ static void PackBlock(unsigned char* a, size_t aLen, unsigned char* b, unsigned memcpy(r + aLen, b, rLen - aLen); } -int DLL_IMPORT encrypt_cbc(void *ctx, unsigned char *indata, unsigned char *outdata, size_t length) +int DLL_IMPORT encrypt_cbc(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t length) { Context_cbc* context; size_t i, j; @@ -1082,7 +1082,7 @@ int DLL_IMPORT encrypt_cbc(void *ctx, unsigned char *indata, unsigned char *outd return 0; } -int DLL_IMPORT decrypt_cbc(void *ctx, unsigned char *indata, unsigned char *outdata, size_t length) +int DLL_IMPORT decrypt_cbc(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t length) { Context_cbc* context; size_t i, j; @@ -1137,7 +1137,7 @@ static void IncrementModulo(unsigned char* value, size_t size) } } -int DLL_IMPORT crypt_ctr(void *ctx, unsigned char *indata, unsigned char *outdata, size_t length) +int DLL_IMPORT crypt_ctr(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t length) { Context_ctr* context; size_t i; @@ -1178,7 +1178,7 @@ int DLL_IMPORT crypt_ctr(void *ctx, unsigned char *indata, unsigned char *outdat return 0; } -int DLL_IMPORT crypt_ofb(void *ctx, unsigned char *indata, unsigned char *outdata, size_t length) +int DLL_IMPORT crypt_ofb(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t length) { Context_ofb* context; size_t i, j; @@ -1220,17 +1220,17 @@ int DLL_IMPORT crypt_ofb(void *ctx, unsigned char *indata, unsigned char *outdat return 0; } -int DLL_IMPORT encrypt_ofb(void *ctx, unsigned char *indata, unsigned char *outdata, size_t length) +int DLL_IMPORT encrypt_ofb(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t length) { return crypt_ofb(ctx, indata, outdata, length); } -int DLL_IMPORT decrypt_ofb(void *ctx, unsigned char *indata, unsigned char *outdata, size_t length) +int DLL_IMPORT decrypt_ofb(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t length) { return crypt_ofb(ctx, indata, outdata, length); } -int DLL_IMPORT encrypt_cfb(void *ctx, unsigned char *indata, unsigned char *outdata, size_t length) +int DLL_IMPORT encrypt_cfb(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t length) { Context_cfb* context; size_t i, j; @@ -1273,7 +1273,7 @@ int DLL_IMPORT encrypt_cfb(void *ctx, unsigned char *indata, unsigned char *outd return 0; } -int DLL_IMPORT decrypt_cfb(void *ctx, unsigned char *indata, unsigned char *outdata, size_t length) +int DLL_IMPORT decrypt_cfb(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t length) { Context_cfb* context; size_t i, j; diff --git a/src/GOST/block_chipher.h b/src/GOST/block_chipher.h index 029201d798e6c9a3bcc65f962839e7d12ec0ef2f..6dd6f1234898f69072995870a6f88de4471591da 100644 --- a/src/GOST/block_chipher.h +++ b/src/GOST/block_chipher.h @@ -52,6 +52,9 @@ /** @brief Размер блока алгоритма 28147-89 */ #define kBlockLen89 8 +/** @brief Размер ключа алгоритма "кузнечик" */ +#define kKeyLen14 32 + /** @brief Размер ключа алгоритма 28147-89 */ #define kKeyLen89 32 @@ -275,7 +278,7 @@ void DLL_IMPORT free_imit(void* ctx); * @return 0 если все преобразование прошло успешно * @return -1 если произошла ошибка */ -int DLL_IMPORT encrypt_ecb(void *ctx, unsigned char *indata, unsigned char *outdata, size_t length); +int DLL_IMPORT encrypt_ecb(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t length); /** @brief Выполнение расшифрования информации в режиме простой замены для данных кратных размеру блока * @@ -286,7 +289,7 @@ int DLL_IMPORT encrypt_ecb(void *ctx, unsigned char *indata, unsigned char *outd * @return 0 если все преобразование прошло успешно * @return -1 если произошла ошибка */ -int DLL_IMPORT decrypt_ecb(void *ctx, unsigned char *indata, unsigned char *outdata, size_t length); +int DLL_IMPORT decrypt_ecb(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t length); /** @brief Выполнение зашифрования информации в режиме простой замены с зацеплением для данных кратных размеру блока * @@ -297,7 +300,7 @@ int DLL_IMPORT decrypt_ecb(void *ctx, unsigned char *indata, unsigned char *outd * @return 0 если все преобразование прошло успешно * @return -1 если произошла ошибка */ -int DLL_IMPORT encrypt_cbc(void *ctx, unsigned char *indata, unsigned char *outdata, size_t length); +int DLL_IMPORT encrypt_cbc(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t length); /** @brief Выполнение рсшифрования информации в режиме простой замены с зацеплением для данных кратных размеру блока * @@ -308,7 +311,7 @@ int DLL_IMPORT encrypt_cbc(void *ctx, unsigned char *indata, unsigned char *outd * @return 0 если все преобразование прошло успешно * @return -1 если произошла ошибка */ -int DLL_IMPORT decrypt_cbc(void *ctx, unsigned char *indata, unsigned char *outdata, size_t length); +int DLL_IMPORT decrypt_cbc(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t length); /** @brief Выполнение шифрования (зашифрования или расшифрования) в режиме гаммирования * @details неполным блоком может быть только последний блок, при попытке шифрования после передачи неполного блока возвращается ошибка @@ -320,7 +323,7 @@ int DLL_IMPORT decrypt_cbc(void *ctx, unsigned char *indata, unsigned char *outd * @return 0 если все преобразование прошло успешно * @return -1 если произошла ошибка */ -int DLL_IMPORT crypt_ctr(void *ctx, unsigned char *indata, unsigned char *outdata, size_t length); +int DLL_IMPORT crypt_ctr(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t length); /** @brief Выполнение шаговой шифрования информации в режиме гаммирования с обратной связью * @details неполным блоком может быть только последний блок, при попытке шифрования после передачи неполного блока возвращается ошибка @@ -332,7 +335,7 @@ int DLL_IMPORT crypt_ctr(void *ctx, unsigned char *indata, unsigned char *outdat * @return 0 если все преобразование прошло успешно * @return -1 если произошла ошибка */ -int DLL_IMPORT crypt_ofb(void *ctx, unsigned char *indata, unsigned char *outdata, size_t inlength); +int DLL_IMPORT crypt_ofb(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t inlength); /** @brief Выполнение зашифрования информации в режиме гаммирования с обратной связью * @@ -343,7 +346,7 @@ int DLL_IMPORT crypt_ofb(void *ctx, unsigned char *indata, unsigned char *outdat * @return 0 если все преобразование прошло успешно * @return -1 если произошла ошибка */ -int DLL_IMPORT encrypt_ofb(void *ctx, unsigned char *indata, unsigned char *outdata, size_t inlength); +int DLL_IMPORT encrypt_ofb(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t inlength); /** @brief Выполнение расшифрования информации в режиме гаммирования с обратной связью * @@ -354,7 +357,7 @@ int DLL_IMPORT encrypt_ofb(void *ctx, unsigned char *indata, unsigned char *outd * @return 0 если все преобразование прошло успешно * @return -1 если произошла ошибка */ -int DLL_IMPORT decrypt_ofb(void *ctx, unsigned char *indata, unsigned char *outdata, size_t inlength); +int DLL_IMPORT decrypt_ofb(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t inlength); /** @brief Выполнение зашифрования информации в режиме гаммирования с обратной связью по шифртексту * @details неполным блоком может быть только последний блок, при попытке шифрования после передачи неполного блока возвращается ошибка @@ -366,7 +369,7 @@ int DLL_IMPORT decrypt_ofb(void *ctx, unsigned char *indata, unsigned char *outd * @return 0 если все преобразование прошло успешно * @return -1 если произошла ошибка */ -int DLL_IMPORT encrypt_cfb(void *ctx, unsigned char *indata, unsigned char *outdata, size_t inlength); +int DLL_IMPORT encrypt_cfb(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t inlength); /** @brief Выполнение расшифрования информации в режиме гаммирования с обратной связью по шифртексту * @details неполным блоком может быть только последний блок, при попытке шифрования после передачи неполного блока возвращается ошибка @@ -378,7 +381,7 @@ int DLL_IMPORT encrypt_cfb(void *ctx, unsigned char *indata, unsigned char *outd * @return 0 если все преобразование прошло успешно * @return -1 если произошла ошибка */ -int DLL_IMPORT decrypt_cfb(void *ctx, unsigned char *indata, unsigned char *outdata, size_t inlength); +int DLL_IMPORT decrypt_cfb(void *ctx, const unsigned char *indata, unsigned char *outdata, size_t inlength); /** @brief Выполнение вычисления имитовставки по данным кратным размеру блока * diff --git a/src/dap_enc_GOST.c b/src/dap_enc_GOST.c index 59d320bea159500d411324832f31c9f21efaf785..29a4d65bcb05fb97a26b5b420e1167c60cd611e0 100644 --- a/src/dap_enc_GOST.c +++ b/src/dap_enc_GOST.c @@ -16,7 +16,7 @@ void dap_enc_gost_key_generate(struct dap_enc_key * a_key, const void *kex_buf, { if(key_size < 32) { - log_it(L_ERROR, "Gost key cannot be less than 32 bytes."); + log_it(L_ERROR, "GOST key cannot be less than 32 bytes."); } a_key->last_used_timestamp = time(NULL); @@ -25,13 +25,23 @@ void dap_enc_gost_key_generate(struct dap_enc_key * a_key, const void *kex_buf, a_key->priv_key_data = DAP_NEW_SIZE(uint8_t, key_size); Keccak_HashInstance Keccak_ctx; - Keccak_HashInitialize(&Keccak_ctx, 1088, 512, key_size*8, 0x06); + Keccak_HashInitialize(&Keccak_ctx, 1088, 512, 32*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, a_key->priv_key_data); } +void dap_enc_gost_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; +} +//------GOST_OFB----------- void dap_enc_gost_ofb_key_new(struct dap_enc_key * a_key) { a_key->_inheritor = NULL; @@ -43,141 +53,218 @@ void dap_enc_gost_ofb_key_new(struct dap_enc_key * a_key) a_key->dec_na = dap_enc_gost_ofb_decrypt_fast; } -void dap_enc_gost_key_delete(struct dap_enc_key *a_key) + +size_t dap_enc_gost_ofb_decrypt(struct dap_enc_key *a_key, const void * a_in, size_t a_in_size, void ** a_out) { - 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); + size_t a_out_size = a_in_size - kBlockLen89; + if(a_out_size <= 0) { + log_it(L_ERROR, "gost_ofb decryption ct with iv must be more than kBlockLen89 bytes"); + return 0; } - a_key->priv_key_data_size = 0; + *a_out = DAP_NEW_SIZE(uint8_t, a_in_size - kBlockLen89); + a_out_size = dap_enc_gost_ofb_decrypt_fast(a_key, a_in, a_in_size, *a_out, a_out_size); + if(a_out_size == 0) + DAP_DEL_Z(*a_out); + return a_out_size; } -//------GOST_OFB----------- -size_t dap_enc_gost_ofb_decrypt(struct dap_enc_key *a_key, const void * a_in, - size_t a_in_size, void ** a_out) { +size_t dap_enc_gost_ofb_encrypt(struct dap_enc_key * a_key, const void * a_in, size_t a_in_size, void ** a_out) +{ + if(a_in_size <= 0) { + log_it(L_ERROR, "gost ofb encryption pt cannot be 0 bytes"); + return 0; + } + size_t a_out_size = a_in_size + kBlockLen89; + *a_out = DAP_NEW_SIZE(uint8_t, a_out_size); + a_out_size = dap_enc_gost_ofb_encrypt_fast(a_key, a_in, a_in_size, *a_out, a_out_size); + if(a_out_size == 0) + DAP_DEL_Z(*a_out); + return a_out_size; +} + +size_t dap_enc_gost_ofb_calc_encode_size(const size_t size_in) +{ + return size_in + kBlockLen89; +} - if(a_in_size <= 8) { - log_it(L_ERROR, "gost_ofb decryption ct with iv must be more than 8 bytes"); +size_t dap_enc_gost_ofb_calc_decode_size(const size_t size_in) +{ + if(size_in <= kBlockLen89) { + log_it(L_ERROR, "gost_ofb decryption size_in ct with iv must be more than kBlockLen89 bytes"); return 0; } + return size_in - kBlockLen89; +} +size_t dap_enc_gost_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) { + size_t a_out_size = a_in_size - kBlockLen89; + if(a_out_size > buf_out_size) { + log_it(L_ERROR, "gost_ofb fast_decryption too small buf_out_size"); + return 0; + } + uint8_t iv[kBlockLen89]; - uint8_t iv[8]; - memcpy(iv, a_in, 8); + memcpy(iv, a_in, kBlockLen89); - *a_out = DAP_NEW_SIZE(uint8_t, a_in_size - 8); unsigned char ctx[kOfb89ContextLen]; - if(init_ofb_89(a_key->priv_key_data, ctx, kBlockLen89, iv, 8,NULL, NULL))//, print_array, print_uint_array)) + if(init_ofb_89(a_key->priv_key_data, ctx, kBlockLen89, iv, kBlockLen89,NULL, NULL))//, print_array, print_uint_array)) { return 0; } - if(crypt_ofb(ctx, a_in + 8, *a_out, a_in_size - 8)) + if(crypt_ofb(ctx, a_in + kBlockLen89, a_out, a_in_size - kBlockLen89)) { return 0; } free_ofb(ctx); - size_t a_out_size = a_in_size - 8; return a_out_size; } -size_t dap_enc_gost_ofb_encrypt(struct dap_enc_key * a_key, const void * a_in, size_t a_in_size, void ** a_out) +size_t dap_enc_gost_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 - uint8_t iv[8]; - - if(a_in_size <= 0) { - log_it(L_ERROR, "gost ofb encryption pt cannot be 0 bytes"); + size_t a_out_size = a_in_size + kBlockLen89; + if(a_out_size > buf_out_size) { + log_it(L_ERROR, "gost_ofb fast_encryption too small buf_out_size"); return 0; } - if(randombytes(iv, 8) == 1) + + uint8_t iv[kBlockLen89]; + if(randombytes(iv, kBlockLen89) == 1) { - log_it(L_ERROR, "failed to get 8 bytes iv gost ofb"); + log_it(L_ERROR, "failed to get kBlockLen89 bytes iv gost ofb"); return 0; } - size_t a_out_size = a_in_size + 8; - *a_out = DAP_NEW_SIZE(uint8_t, a_out_size); - memcpy(*a_out, iv, 8); + memcpy(a_out, iv, kBlockLen89); unsigned char ctx[kOfb89ContextLen]; - if(init_ofb_89(a_key->priv_key_data, ctx, kBlockLen89, iv, 8,NULL, NULL))//, print_array, print_uint_array)) + if(init_ofb_89(a_key->priv_key_data, ctx, kBlockLen89, iv, kBlockLen89,NULL, NULL))//, print_array, print_uint_array)) { return 0; } - if(crypt_ofb(ctx, a_in, *a_out + 8, a_in_size)) + if(crypt_ofb(ctx, a_in, a_out + kBlockLen89, a_in_size)) { return 0; } free_ofb(ctx); return a_out_size; + } + +//------KUZN_OFB----------- +void dap_enc_kuzn_ofb_key_new(struct dap_enc_key * a_key) +{ + a_key->_inheritor = NULL; + a_key->_inheritor_size = 0; + a_key->type = DAP_ENC_KEY_TYPE_GOST_OFB; + a_key->enc = dap_enc_kuzn_ofb_encrypt; + a_key->dec = dap_enc_kuzn_ofb_decrypt; + a_key->enc_na = dap_enc_kuzn_ofb_encrypt_fast; + a_key->dec_na = dap_enc_kuzn_ofb_decrypt_fast; } -size_t dap_enc_gost_ofb_calc_encode_size(const size_t size_in) + + +size_t dap_enc_kuzn_ofb_calc_encode_size(const size_t size_in) { - return size_in + 8; + return size_in + kBlockLen14; } -size_t dap_enc_gost_ofb_calc_decode_size(const size_t size_in) +size_t dap_enc_kuzn_ofb_calc_decode_size(const size_t size_in) { - if(size_in <= 8) { - log_it(L_ERROR, "gost_ofb decryption size_in ct with iv must be more than 8 bytes"); + if(size_in <= kBlockLen14) { + log_it(L_ERROR, "gost_ofb decryption size_in ct with iv must be more than kBlockLen14 bytes"); return 0; } - return size_in - 8; + return size_in - kBlockLen14; } -size_t dap_enc_gost_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) { - size_t a_out_size = a_in_size - 8; +size_t dap_enc_kuzn_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 + kBlockLen14; + if(a_in_size <= 0) { + log_it(L_ERROR, "kuzn_ofb fast_encryption too small a_in_size"); + return 0; + } if(a_out_size > buf_out_size) { - log_it(L_ERROR, "gost_ofb fast_decryption too small buf_out_size"); + log_it(L_ERROR, "kuzn_ofb fast_encryption too small buf_out_size"); return 0; } - uint8_t iv[8]; - - memcpy(iv, a_in, 8); - unsigned char ctx[kOfb89ContextLen]; - if(init_ofb_89(a_key->priv_key_data, ctx, kBlockLen89, iv, 8,NULL, NULL))//, print_array, print_uint_array)) + if(randombytes(a_out, kBlockLen14) == 1)//iv { - return 0; - } - if(crypt_ofb(ctx, a_in + 8, a_out, a_in_size - 8)) - { - return 0; + log_it(L_ERROR, "failed to get kBlockLen14 bytes iv gost ofb"); + return 0; } - free_ofb(ctx); - return a_out_size; -} + unsigned char ctx[kOfb14ContextLen]; -size_t dap_enc_gost_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) + + if(init_ofb_14(a_key->priv_key_data, ctx, kBlockLen14, a_out, kBlockLen14, NULL,NULL)) + return -1; + + if(crypt_ofb(ctx, a_in, a_out + kBlockLen14, a_in_size)) + return -1; + + free_ofb(ctx); + return a_out_size; + } + +size_t dap_enc_kuzn_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) { - //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"); + size_t a_out_size = a_in_size - kBlockLen14; + if(a_out_size <= 0) { + log_it(L_ERROR, "kuzn_ofb fast_decryption too small a_in_size"); return 0; } - uint8_t iv[8]; - if(randombytes(iv, 8) == 1) - { - log_it(L_ERROR, "failed to get 8 bytes iv gost ofb"); + if(a_out_size > buf_out_size) { + log_it(L_ERROR, "kuzn_ofb fast_decryption too small buf_out_size"); return 0; } - memcpy(a_out, iv, 8); - unsigned char ctx[kOfb89ContextLen]; - if(init_ofb_89(a_key->priv_key_data, ctx, kBlockLen89, iv, 8,NULL, NULL))//, print_array, print_uint_array)) - { + unsigned char ctx[kOfb14ContextLen]; + //iv first kBlockLen14 a_in bytes + + if(init_ofb_14(a_key->priv_key_data, ctx, kBlockLen14, a_in, kBlockLen14, NULL, NULL)) + return -1; + + if(decrypt_ofb(ctx, a_in + kBlockLen14, a_out, a_out_size)) + return -1; + + free_ofb(ctx); + return a_out_size; +} +size_t dap_enc_kuzn_ofb_decrypt(struct dap_enc_key *a_key, const void * a_in, + size_t a_in_size, void ** a_out) { + + size_t a_out_size = a_in_size - kBlockLen14; + if(a_out_size <= 0) { + log_it(L_ERROR, "kuzn_ofb decryption too small a_in_size"); return 0; } - if(crypt_ofb(ctx, a_in, a_out + 8, a_in_size)) - { + + *a_out = DAP_NEW_SIZE(uint8_t, a_out_size); + a_out_size = dap_enc_kuzn_ofb_decrypt_fast(a_key, a_in, a_in_size, *a_out, a_out_size); + if(!a_out_size) + DAP_DEL_Z(*a_out); + return a_out_size; +} + +size_t dap_enc_kuzn_ofb_encrypt(struct dap_enc_key * a_key, const void * a_in, size_t a_in_size, void ** a_out) +{ + //generate iv and put it in *a_out first bytes + if(a_in_size <= 0) { + log_it(L_ERROR, "kuzn fast_encryption too small a_in_size"); return 0; } - free_ofb(ctx); + size_t a_out_size = a_in_size + kBlockLen14; + *a_out = DAP_NEW_SIZE(uint8_t, a_out_size); + + a_out_size = dap_enc_kuzn_ofb_encrypt_fast(a_key, a_in, a_in_size, *a_out, a_out_size); + if(!a_out_size) + DAP_DEL_Z(*a_out); return a_out_size; - } +} diff --git a/src/dap_enc_key.c b/src/dap_enc_key.c index 198a851c2bb391664f8a99c5b1e849c21d4f0aeb..4352ecb65601feb4b42dcddbc9c3b8e7da7c3186 100755 --- a/src/dap_enc_key.c +++ b/src/dap_enc_key.c @@ -149,6 +149,22 @@ struct dap_enc_key_callbacks{ .sign_get = NULL, .sign_verify = NULL }, + [DAP_ENC_KEY_TYPE_KUZN_OFB]={ + .name = "KUZN_OFB", + .enc = dap_enc_kuzn_ofb_encrypt, + .enc_na = dap_enc_kuzn_ofb_encrypt_fast , + .dec = dap_enc_kuzn_ofb_decrypt, + .dec_na = dap_enc_kuzn_ofb_decrypt_fast , + .new_callback = dap_enc_kuzn_ofb_key_new, + .delete_callback = dap_enc_gost_key_delete, + .new_generate_callback = dap_enc_gost_key_generate, + .gen_key_public = NULL, + .gen_key_public_size = NULL, + .enc_out_size = dap_enc_kuzn_ofb_calc_encode_size, + .dec_out_size = dap_enc_kuzn_ofb_calc_decode_size, + .sign_get = NULL, + .sign_verify = NULL + }, [DAP_ENC_KEY_TYPE_MSRLN] = { .name = "MSRLN", .enc = NULL, diff --git a/test/crypto/dap_enc_test.c b/test/crypto/dap_enc_test.c index 94b09beaa439a6848ed70c806e6ba61b60cb0d79..024f96bddc6c0b7f69ab684dece354884cbfd229 100755 --- a/test/crypto/dap_enc_test.c +++ b/test/crypto/dap_enc_test.c @@ -77,6 +77,7 @@ void test_encypt_decrypt(int count_steps, const dap_enc_key_type_t key_type, con void test_encypt_decrypt_fast(int count_steps, const dap_enc_key_type_t key_type, const int cipher_key_size) { + dap_print_module_name(dap_enc_get_type_name(key_type)); const size_t buf_size = 4096; char buf_encrypt_out[buf_size]; char buf_decrypt_out[buf_size]; diff --git a/test/crypto/main.c b/test/crypto/main.c index 208592653d7d8ad09be2b01d819bd71e4a4ce865..dc0d5420314c0d0ccea789117b410929a1352d50 100755 --- a/test/crypto/main.c +++ b/test/crypto/main.c @@ -18,15 +18,18 @@ int main(void) // switch off debug info from library dap_log_level_set(L_CRITICAL); - dap_enc_ringct20_tests_run(10);return 0; + test_encypt_decrypt (1000, DAP_ENC_KEY_TYPE_GOST_OFB, 32); + test_encypt_decrypt_fast (1000, DAP_ENC_KEY_TYPE_GOST_OFB, 32); + test_encypt_decrypt (1000, DAP_ENC_KEY_TYPE_KUZN_OFB, 32); + test_encypt_decrypt_fast (1000, DAP_ENC_KEY_TYPE_KUZN_OFB, 32); + return 0; + dap_enc_ringct20_tests_run(10); dap_enc_tests_run(); test_encypt_decrypt (1000, DAP_ENC_KEY_TYPE_BF_CBC, 0); test_encypt_decrypt_fast (1000, DAP_ENC_KEY_TYPE_BF_CBC, 0); test_encypt_decrypt (1000, DAP_ENC_KEY_TYPE_BF_OFB, 0); test_encypt_decrypt_fast (1000, DAP_ENC_KEY_TYPE_BF_OFB, 0); - test_encypt_decrypt (1000, DAP_ENC_KEY_TYPE_GOST_OFB, 32); - test_encypt_decrypt_fast (1000, DAP_ENC_KEY_TYPE_GOST_OFB, 32); test_encypt_decrypt (1000, DAP_ENC_KEY_TYPE_IAES, 32); test_encypt_decrypt_fast (1000, DAP_ENC_KEY_TYPE_IAES, 32); test_encypt_decrypt (1000, DAP_ENC_KEY_TYPE_OAES, 32);