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/include/dap_enc_key.h b/include/dap_enc_key.h index 0d47a9aa4a87cc005c7e83e99210e86ac33e62c0..145fb27d64abb454a66a4864932fe50028bd0a56 100755 --- a/include/dap_enc_key.h +++ b/include/dap_enc_key.h @@ -53,6 +53,8 @@ typedef enum dap_enc_key_type{ DAP_ENC_KEY_TYPE_GOST_OFB,//GOST28147_89 DAP_ENC_KEY_TYPE_KUZN_OFB,//GOST28147_14 + DAP_ENC_KEY_TYPE_SALSA2012,//SALSA2012//http://www.ecrypt.eu.org/stream/salsa20pf.html//https://ianix.com/pub/salsa20-deployment.html + DAP_ENC_KEY_TYPE_RLWE_NEWHOPE, // "NewHope": key exchange from the ring learning with errors problem // (Alkim, Ducas, PГ¶ppelmann, Schwabe, USENIX Security 2016 ) // Using the reference C implementation of NewHope @@ -173,7 +175,7 @@ typedef size_t (*dap_enc_gen_bob_shared_key) (struct dap_enc_key *b_key, const v 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); -typedef int (*dap_enc_callback_gen_key_public_t ) (struct dap_enc_key *l_key, void * l_output); +typedef int (*dap_enc_callback_gen_key_public_t ) (struct dap_enc_key *a_key, void * a_output); typedef void (*dap_enc_callback_ptr_t)(struct dap_enc_key *, void *); typedef size_t (*dap_enc_callback_pptr_r_size_t)(struct dap_enc_key *, void **); @@ -182,7 +184,7 @@ 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 size_t (*dap_enc_get_allpbkList) (struct dap_enc_key *b_key, const void *allpbkList, const int allpbknum); +typedef size_t (*dap_enc_get_allpbk_list) (struct dap_enc_key *a_key, const void *allpbk_list, const int allpbk_num); typedef struct dap_enc_key { size_t priv_key_data_size; @@ -209,7 +211,7 @@ typedef struct dap_enc_key { void *pbkListdata; size_t pbkListsize; - dap_enc_get_allpbkList getallpbkList; + dap_enc_get_allpbk_list getallpbkList; void * _inheritor; // WARNING! Inheritor must have only serealizeble/deserializeble data (copy) diff --git a/include/dap_enc_ringct20.h b/include/dap_enc_ringct20.h index 39cfef2e1b879742fce114dd6ed72fd8bfbfbedc..3ee3ccb5d6dfbcace6006333e10dcabba3588391 100644 --- a/include/dap_enc_ringct20.h +++ b/include/dap_enc_ringct20.h @@ -15,9 +15,9 @@ void dap_enc_sig_ringct20_key_new_generate(struct dap_enc_key * key, const void size_t kex_size, const void * seed, size_t seed_size, size_t key_size); -size_t dap_enc_sig_ringct20_get_sign_with_pbkList(struct dap_enc_key * key, const void * msg, +size_t dap_enc_sig_ringct20_get_sign_with_pb_list(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_ringct20_verify_sign_with_pbkList(struct dap_enc_key * key, const void * msg, +size_t dap_enc_sig_ringct20_verify_sign_with_pbk_list(struct dap_enc_key * key, const void * msg, const size_t msg_size, void * signature, const size_t signature_size, const void *pbkList_buf, const int wpbkList); size_t dap_enc_sig_ringct20_get_sign(struct dap_enc_key * key,const void * msg, 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..22c7fb98b2925802db533cfa7615179ce3fa96c8 100644 --- a/src/dap_enc_GOST.c +++ b/src/dap_enc_GOST.c @@ -16,22 +16,32 @@ 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); - a_key->priv_key_data_size = key_size; + a_key->priv_key_data_size = 32; 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..55258d7d61454410f2c3edbb122a918588bb296e 100755 --- a/src/dap_enc_key.c +++ b/src/dap_enc_key.c @@ -27,6 +27,7 @@ #include "dap_enc_oaes.h" #include "dap_enc_bf.h" #include "dap_enc_GOST.h" +#include "dap_enc_salsa2012.h" #include "dap_enc_msrln.h" #include "dap_enc_defeo.h" @@ -149,6 +150,23 @@ 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, @@ -259,9 +277,9 @@ struct dap_enc_key_callbacks{ .name = "SIG_RINGCT20", .enc = NULL, .dec = NULL, - .enc_na = dap_enc_sig_ringct20_get_sign_with_pbkList,//dap_enc_sig_ringct20_get_sign, + .enc_na = dap_enc_sig_ringct20_get_sign_with_pb_list,//dap_enc_sig_ringct20_get_sign, .dec_na = dap_enc_sig_ringct20_verify_sign, - .dec_na_ext = dap_enc_sig_ringct20_verify_sign_with_pbkList, + .dec_na_ext = dap_enc_sig_ringct20_verify_sign_with_pbk_list, .gen_key_public = NULL, .gen_key_public_size = NULL, .gen_bob_shared_key = NULL, diff --git a/src/dap_enc_ringct20.c b/src/dap_enc_ringct20.c index ffaca3c5f32efecc1ceb61f7b5c621969bd9c286..61ea4278a438138a239cfe66772b756c58c39a09 100644 --- a/src/dap_enc_ringct20.c +++ b/src/dap_enc_ringct20.c @@ -541,7 +541,6 @@ int32_t ringct20_private_and_public_keys_init(ringct20_private_key_t *private_ke f = calloc(p->RINGCT20_PBK_SIZE, sizeof(char)); if (f == NULL) { free(f); -// free(g); return -1; } public_key->kind = p->kind; @@ -569,24 +568,24 @@ void dap_enc_sig_ringct20_key_new(struct dap_enc_key *key) { key->type = DAP_ENC_KEY_TYPE_SIG_RINGCT20; key->enc = NULL; - key->enc_na = (dap_enc_callback_dataop_na_t) dap_enc_sig_ringct20_get_sign_with_pbkList;//dap_enc_sig_ringct20_get_sign; + key->enc_na = (dap_enc_callback_dataop_na_t) dap_enc_sig_ringct20_get_sign_with_pb_list;//dap_enc_sig_ringct20_get_sign; key->dec_na = (dap_enc_callback_dataop_na_t) dap_enc_sig_ringct20_verify_sign; - key->dec_na_ext = (dap_enc_callback_dataop_na_ext_t) dap_enc_sig_ringct20_verify_sign_with_pbkList;//dap_enc_sig_ringct20_verify_sign; - key->getallpbkList = (dap_enc_get_allpbkList) dap_enc_sig_ringct20_getallpbk; + key->dec_na_ext = (dap_enc_callback_dataop_na_ext_t) dap_enc_sig_ringct20_verify_sign_with_pbk_list;//dap_enc_sig_ringct20_verify_sign; + key->getallpbkList = (dap_enc_get_allpbk_list) dap_enc_sig_ringct20_getallpbk; key->pbkListsize = 0; key->pbkListdata = NULL; } -size_t dap_enc_sig_ringct20_getallpbk(dap_enc_key_t *key, const void *allpbkList, const int allpbkListsize) +size_t dap_enc_sig_ringct20_getallpbk(dap_enc_key_t *key, const void *allpbk_list, const int allpbk_list_size) { - key->pbkListdata = DAP_NEW_SIZE(uint8_t, allpbkListsize); - memcpy(key->pbkListdata, allpbkList, allpbkListsize); - key->pbkListsize= allpbkListsize; + key->pbkListdata = DAP_NEW_SIZE(uint8_t, allpbk_list_size); + memcpy(key->pbkListdata, allpbk_list, allpbk_list_size); + key->pbkListsize= allpbk_list_size; return 0; } -void dap_enc_sig_ringct20_key_new_generate(struct dap_enc_key * key, const void *kex_buf, +void dap_enc_sig_ringct20_key_new_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) { @@ -597,22 +596,22 @@ void dap_enc_sig_ringct20_key_new_generate(struct dap_enc_key * key, const void dap_enc_sig_ringct20_set_type(ringct20_type); - key->priv_key_data_size = sizeof(ringct20_private_key_t); - key->pub_key_data_size = sizeof(ringct20_public_key_t); - key->priv_key_data = malloc(key->priv_key_data_size); - key->pub_key_data = malloc(key->pub_key_data_size); + a_key->priv_key_data_size = sizeof(ringct20_private_key_t); + a_key->pub_key_data_size = sizeof(ringct20_public_key_t); + a_key->priv_key_data = malloc(a_key->priv_key_data_size); + a_key->pub_key_data = malloc(a_key->pub_key_data_size); - retcode = ringct20_crypto_sign_keypair((ringct20_public_key_t *) key->pub_key_data, - (ringct20_private_key_t *) key->priv_key_data, _ringct20_type); + retcode = ringct20_crypto_sign_keypair((ringct20_public_key_t *) a_key->pub_key_data, + (ringct20_private_key_t *) a_key->priv_key_data, _ringct20_type); if(retcode != 0) { - ringct20_private_and_public_keys_delete((ringct20_private_key_t *) key->pub_key_data, - (ringct20_public_key_t *) key->pub_key_data); + ringct20_private_and_public_keys_delete((ringct20_private_key_t *) a_key->pub_key_data, + (ringct20_public_key_t *) a_key->pub_key_data); log_it(L_CRITICAL, "Error"); return; } } -int ringct20_crypto_sign_with_pbkList( ringct20_signature_t *sig, const unsigned char *m, +int ringct20_crypto_sign_with_pbk_list( ringct20_signature_t *sig, const unsigned char *m, unsigned long long mlen, const ringct20_private_key_t *private_key, const void *allpbk_buf, const int allpbk_size) { @@ -699,7 +698,7 @@ int ringct20_crypto_sign_with_pbkList( ringct20_signature_t *sig, const unsigned return 0; } -size_t dap_enc_sig_ringct20_get_sign_with_pbkList(struct dap_enc_key * key, const void * msg, +size_t dap_enc_sig_ringct20_get_sign_with_pb_list(struct dap_enc_key * a_key, const void * msg, const size_t msg_size, void * signature, const size_t signature_size) { if(signature_size < sizeof(ringct20_signature_t)) { @@ -707,14 +706,14 @@ size_t dap_enc_sig_ringct20_get_sign_with_pbkList(struct dap_enc_key * key, cons return 0; } - if(!ringct20_crypto_sign_with_pbkList((ringct20_signature_t *) signature, (const unsigned char *) msg, msg_size, key->priv_key_data, key->pbkListdata, key->pbkListsize)) + if(!ringct20_crypto_sign_with_pbk_list((ringct20_signature_t *) signature, (const unsigned char *) msg, msg_size, a_key->priv_key_data, a_key->pbkListdata, a_key->pbkListsize)) return signature_size; else return 0; } -size_t dap_enc_sig_ringct20_get_sign(struct dap_enc_key * key, const void * msg, +size_t dap_enc_sig_ringct20_get_sign(struct dap_enc_key * a_key, const void * msg, const size_t msg_size, void * signature, const size_t signature_size) { if(signature_size < sizeof(ringct20_signature_t)) { @@ -722,13 +721,13 @@ size_t dap_enc_sig_ringct20_get_sign(struct dap_enc_key * key, const void * msg, return 0; } - if(!ringct20_crypto_sign((ringct20_signature_t *) signature, (const unsigned char *) msg, msg_size, key->priv_key_data)) + if(!ringct20_crypto_sign((ringct20_signature_t *) signature, (const unsigned char *) msg, msg_size, a_key->priv_key_data)) return signature_size; else return 0; } -size_t dap_enc_sig_ringct20_verify_sign(struct dap_enc_key * key, const void * msg, +size_t dap_enc_sig_ringct20_verify_sign(struct dap_enc_key * a_key, const void * msg, const size_t msg_size, void * signature, const size_t signature_size) { if(signature_size < sizeof(ringct20_signature_t)) { @@ -736,10 +735,10 @@ size_t dap_enc_sig_ringct20_verify_sign(struct dap_enc_key * key, const void * m return 1; } - return (ringct20_crypto_sign_open( (unsigned char *) msg, msg_size, (ringct20_signature_t *) signature, key->pub_key_data)); + return (ringct20_crypto_sign_open( (unsigned char *) msg, msg_size, (ringct20_signature_t *) signature, a_key->pub_key_data)); } -size_t dap_enc_sig_ringct20_verify_sign_with_pbkList(struct dap_enc_key * key, const void * msg, +size_t dap_enc_sig_ringct20_verify_sign_with_pbk_list(struct dap_enc_key * a_key, const void * msg, const size_t msg_size, void * signature, const size_t signature_size, const void *pbkList_buf, const int wpbkList) { if(signature_size < sizeof(ringct20_signature_t)) { @@ -750,15 +749,15 @@ size_t dap_enc_sig_ringct20_verify_sign_with_pbkList(struct dap_enc_key * key, c return ringct20_crypto_sign_open_with_pbkList( (unsigned char *) msg, msg_size, (ringct20_signature_t *) signature, pbkList_buf, wpbkList); } -void dap_enc_sig_ringct20_key_delete(struct dap_enc_key * key) +void dap_enc_sig_ringct20_key_delete(struct dap_enc_key * a_key) { - if(key->pbkListsize) + if(a_key->pbkListsize) { - DAP_DELETE(key->pbkListdata); - key->pbkListsize = 0; + DAP_DELETE(a_key->pbkListdata); + a_key->pbkListsize = 0; } - ringct20_private_and_public_keys_delete((ringct20_private_key_t *) key->priv_key_data, - (ringct20_public_key_t *) key->pub_key_data); + ringct20_private_and_public_keys_delete((ringct20_private_key_t *) a_key->priv_key_data, + (ringct20_public_key_t *) a_key->pub_key_data); } size_t dap_enc_ringct20_calc_signature_size(void) diff --git a/test/crypto/dap_enc_ringct20_test.c b/test/crypto/dap_enc_ringct20_test.c index 24d7b6cfc37df06b66564c99f03823bdf92b521e..0633dafed0d468e4344fb4dc611c35b05c30ed8b 100644 --- a/test/crypto/dap_enc_ringct20_test.c +++ b/test/crypto/dap_enc_ringct20_test.c @@ -107,7 +107,7 @@ static void test_signing_verifying2(void) dap_enc_key_delete(key); } -//DEBUG TO USE IT get back:dap_enc_sig_ringct20_get_sign_with_pbkList,//dap_enc_sig_ringct20_get_sign, +//DEBUG TO USE IT get back:dap_enc_sig_ringct20_get_sign_with_pb_list,//dap_enc_sig_ringct20_get_sign, static void test_signing_verifying(void) { 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);