diff --git a/crypto/dap_enc_key.h b/crypto/dap_enc_key.h index bb208aa29718fc9d392e51bd1ed81038d4f3fc58..99f8fb41c117b898c19d8fb7061e82177a9d8f6f 100644 --- a/crypto/dap_enc_key.h +++ b/crypto/dap_enc_key.h @@ -30,7 +30,7 @@ typedef enum dap_enc_data_type{DAP_ENC_DATA_TYPE_RAW, } dap_enc_data_type_t; -} dap_enc_data_type_t; +//} dap_enc_data_type_t; typedef enum dap_enc_key_type{ DAP_ENC_KEY_TYPE_AES, // Symmetric AES @@ -46,7 +46,8 @@ typedef enum dap_enc_key_type{ DAP_ENC_KEY_TYPE_AES, // Symmetric AES // from https://github.com/tpoeppelmann/newhop // https://eprint.iacr.org/2015/1092 - DAP_ENC_KEY_TYPE_RLWE_MSRLN16, // Microsoft Research implementation of Peikert's ring-LWE key exchange + DAP_ENC_KEY_TYPE_RLWE_MSRLN16, + //DAP_ENC_KEY_TYPE_RLWE_MSRLN16, // Microsoft Research implementation of Peikert's ring-LWE key exchange // (Longa, Naehrig, CANS 2016, https://eprint.iacr.org/2016/504) // based on the implementation of Alkim, Ducas, Pöppelmann, and Schwabe, // with improvements from Longa and Naehrig, @@ -87,7 +88,7 @@ typedef enum dap_enc_key_type{ DAP_ENC_KEY_TYPE_AES, // Symmetric AES // https://eprint.iacr.org/2017/279.pdf), using the optimized implemenation // from https://github.com/IAIK/Picnic DAP_ENC_KEY_TYPE_FNAM2 //ХЗ ЧТО, ДОБÐВИЛ ЧТОБЫ БЫЛО И ÐРМЕÐЯ КОМПИЛЯТОРÐЕ РУГÐЛСЯ:( - } dap_enc_key_type_t; + } dap_enc_key_type_t; struct dap_enc_key; diff --git a/crypto/dap_enc_msrln16.c b/crypto/dap_enc_msrln16.c index f9f83424654bc8855b5391b019b01f4242868eff..c3850af31f47bf9d5177640c65a904594df052b0 100644 --- a/crypto/dap_enc_msrln16.c +++ b/crypto/dap_enc_msrln16.c @@ -1,28 +1,137 @@ #include "dap_common.h" #include "dap_enc_msrln16.h" +#include "liboqs/crypto/rand/rand.h" #include "liboqs/kex_rlwe_msrln16/kex_rlwe_msrln16.h" +#include "liboqs/kex/kex.h" #define LOG_TAG "dap_enc_msrln16" +OQS_KEX *kex = NULL; + +void *alignce_priv = NULL; +uint8_t *alice_msg = NULL; +size_t alice_msg_len; +uint8_t *alice_key = NULL; +size_t alice_key_len; + +uint8_t *bob_msg = NULL; +size_t bob_msg_len; +uint8_t *bob_key = NULL; +size_t bob_key_len; + +/*struct dap_enc_param{ + enum OQS_KEX_alg_name alg_name; + char *named_parameters; + char *id; +}; + +typedef struct dap_enc_sidh16_key{ +} dap_enc_sidh16_key_t;*/ + +#define PRINT_HEX_STRING(label, str, len) \ + { size_t i; \ + printf("%-20s (%4zu bytes): ", (label), (size_t)(len)); \ + for (i = 0; i < (len); i++) { \ + printf("%02X", ((unsigned char *) (str))[i]); \ + } \ + printf("\n"); \ + } + + /** * @brief dap_enc_msrln16_key_new_generate - * @param a_key - * @param a_size + * @param rand + * @return */ -void dap_enc_msrln16_key_new_generate(dap_enc_key_t * a_key, size_t a_size) + +dap_enc_key_t* dap_enc_msrln16_key_new_generate(struct dap_enc_key* a_key, size_t a_size)//(OQS_RAND* rand) +//void dap_enc_msrln16_key_new_generate(OQS_RAND *rand) { + dap_enc_key_t *k = DAP_NEW(dap_enc_key_t); + dap_enc_msrln16_key_t *msrln16_a_key = DAP_ENC_KEY_TYPE_RLWE_MSRLN16(a_key); //DAP_ENC_SIDH16_KEY(a_key); + // OQS_KEX *k = malloc(sizeof(OQS_KEX)); + if (k == NULL) { + return NULL; + } + + k->data; + k->data_size; + k->type = DAP_ENC_KEY_TYPE_RLWE_MSRLN16; + k->last_used_timestamp; + k->enc = &dap_enc_msrln16_encode; + k->dec = &dap_enc_msrln16_decode; + k->delete_callback = &dap_enc_msrln16_key_delete; + + msrln16_a_key->rand; + + /* k->ctx = NULL; + k->method_name = strdup("RLWE MSR LN16"); + k->estimated_classical_security = 128; + k->estimated_quantum_security = 128; + k->seed = NULL; + k->seed_len = 0; + k->named_parameters = NULL; + k->rand = rand; + k->params = NULL; + k->alice_0 = &OQS_KEX_rlwe_msrln16_alice_0; + k->bob = &OQS_KEX_rlwe_msrln16_bob; + k->alice_1 = &OQS_KEX_rlwe_msrln16_alice_1; + k->alice_priv_free = &OQS_KEX_rlwe_msrln16_alice_priv_free; + k->free = &OQS_KEX_rlwe_msrln16_free;*/ + + dap_enc_key_t* key; + + + return k; +//dap_enc_key_t *k = DAP_NEW(dap_enc_key_t); + //rand = OQS_RAND_new(OQS_RAND_alg_default); + /* kex = OQS_KEX_rlwe_msrln16_new(rand); + if(kex == NULL) { + printf("Ð½Ð¾Ð²Ð°Ñ Ð¿Ð°Ñ€Ð° не Ñгенерирована \n"); + //gen = 0; + } + printf("раÑчёт Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° ключами методом %s\n", kex->method_name);*/ } /** * @brief dap_enc_msrln16_key_new_from_data - * @param a_key - * @param a_in - * @param a_in_size + * @param k + * @param alice_priv + * @param bob_msg + * @param bob_msg_len + * @param key + * @param key_len */ -void dap_enc_msrln16_key_new_from_data(dap_enc_key_t * a_key, const void * a_in, size_t a_in_size) + +void dap_enc_msrln16_key_new_from_data(OQS_KEX *k, const void * alice_priv, const uint8_t *bob_msg, const size_t bob_msg_len, uint8_t **key, size_t *key_len) { + /*gen = OQS_KEX_rlwe_msrln16_alice_1(k, alice_priv, bob_msg, bob_msg_len, &alice_key, &alice_key_len); + if(gen != 1) { + printf("OQS_KEX_rlwe_msrln16_alice_1 lose..\n"); + gen = 0; + } + PRINT_HEX_STRING("Alice session key", alice_key, alice_key_len); + + if(alice_key_len != bob_key_len) { + printf("ERROR: Alice's session key and Bob's session key are different lengths (%zu vs %zu)\n", alice_key_len, bob_key_len); + gen = 0; + } + gen = memcmp(alice_key, bob_key, alice_key_len); + if(gen != 0){ + printf("ERROR: Alice's session key and Bob's session key are not equal\n"); + PRINT_HEX_STRING("Alice session key", alice_key, alice_key_len); + PRINT_HEX_STRING("Bob session key", bob_key, bob_key_len); + + // здеÑÑŒ Ñделать запиÑÑŒ ключа в файл???? + + gen = 0; + } + printf("Alice and Bob's session keys match.\n"); + printf("\n\n"); + + gen = 1;*/ } @@ -41,9 +150,34 @@ void dap_enc_msrln16_key_new_from_data_public(dap_enc_key_t * a_key, const void * @brief dap_enc_msrln16_key_delete * @param a_key */ -void dap_enc_msrln16_key_delete(dap_enc_key_t *a_key) +void dap_enc_msrln16_key_delete(struct dap_enc_key* a_key) { - + //dap_enc_sidh16_key_t *sidh_a_key = DAP_ENC_SIDH16_KEY(a_key); + dap_enc_msrln16_key_t* msrln_a_key = DAP_ENC_KEY_TYPE_RLWE_MSRLN16(a_key); + (void) a_key; + if(!a_key){ + return; + } + /* oqs_sidh_cln16_curve_free((PCurveIsogenyStruct)sidh_a_key->user_curveIsogeny); + sidh_a_key->user_curveIsogeny = NULL;*/ + DAP_DELETE(a_key); + // free(); + /*free(alice_msg); + free(alice_key); + free(bob_msg); + free(bob_key);*/ + /*if (alice_priv) {*/ + //free(alice_priv); + /*}*/ + //OQS_KEX k = a_key-> +// if (!k) { +// return; +// } +// free(k->method_name); +// k->method_name = NULL; +// free(k); +// /*OQS_KEX_rlwe_msrln16_alice_priv_free(kex, alignce_priv); + /* OQS_KEX_rlwe_msrln16_free(kex);*/ } /** @@ -69,26 +203,45 @@ size_t dap_enc_msrln16_key_public_raw(dap_enc_key_t *a_key, void ** a_key_public /** * @brief dap_enc_msrln16_decode - * @param a_key - * @param a_in - * @param a_in_size - * @param a_out + * @param k + * @param alice_msg + * @param alice_msg_len + * @param bob_msg + * @param bob_msg_len + * @param key + * @param key_len * @return */ -size_t dap_enc_msrln16_decode(dap_enc_key_t* a_key, const void * a_in, size_t a_in_size,void * a_out) +//Боб отвечает на приветÑтвие +size_t dap_enc_msrln16_decode(OQS_KEX *k, const uint8_t *alice_msg, const size_t alice_msg_len, uint8_t **bob_msg, size_t *bob_msg_len, uint8_t **key, size_t *key_len) { + /*gen=OQS_KEX_rlwe_msrln16_bob(k, alice_msg, alice_msg_len, &bob_msg, &bob_msg_len, &bob_key, &bob_key_len); + if (gen!=1){ + //потерÑли от боба + } + + + PRINT_HEX_STRING("Bob message", bob_msg, bob_msg_len); + PRINT_HEX_STRING("Bob session key", bob_key, bob_key_len);*/ } /** * @brief dap_enc_msrln16_encode - * @param a_key - * @param a_in - * @param a_in_size - * @param a_out + * @param k + * @param alice_priv + * @param alice_msg + * @param alice_msg_len * @return */ -size_t dap_enc_msrln16_encode(dap_enc_key_t* a_key, const void * a_in, size_t a_in_size,void * a_out) -{ + +//ÐлиÑа приветÑтвует +size_t dap_enc_msrln16_encode(OQS_KEX *k, void **alice_priv, uint8_t **alice_msg, size_t *alice_msg_len) +{ + /*gen=OQS_KEX_rlwe_msrln16_alice_0(k ,alice_priv, alice_msg, alice_msg_len); + if (gen!=1){ + //потерÑли от алиÑÑ‹ + } + PRINT_HEX_STRING("Alice message", alice_msg, alice_msg_len);*/ } diff --git a/crypto/dap_enc_msrln16.h b/crypto/dap_enc_msrln16.h index a694505eb28311411ed92e8ec1bba9572e3356ec..94a9adaca80d2f752a2920e40e548793052b7f41 100644 --- a/crypto/dap_enc_msrln16.h +++ b/crypto/dap_enc_msrln16.h @@ -2,18 +2,45 @@ #define _DAP_ENC_MSRLN16_H_ #include <stddef.h> +#include "liboqs/crypto/rand/rand.h" +#include "liboqs/kex/kex.h" +#include "dap_enc_key.h" -typedef struct dap_enc_key dap_enc_key_t; +//typedef struct dap_enc_key dap_enc_key_t; -void dap_enc_msrln16_key_new_generate(dap_enc_key_t * a_key, size_t a_size); -void dap_enc_msrln16_key_new_from_data(dap_enc_key_t * a_key, const void * a_in, size_t a_in_size); +typedef struct dap_enc_msrln16_key{ + OQS_RAND* rand; + + unsigned int alice_msg_len; + unsigned int bob_msg_len; + unsigned int key_len; + uint16_t estimated_classical_security; + uint16_t estimated_quantum_security; + OQS_KEX* k; +} dap_enc_msrln16_key_t; + +#define DAP_ENC_KEY_TYPE_RLWE_MSRLN16(a) ((dap_enc_msrln16_key_t *)((a)->_inheritor)) + + +//void dap_enc_msrln16_key_new_generate(OQS_RAND *rand); +//dap_enc_key_t* dap_enc_msrln16_key_new_generate(struct dap_enc_key* a_key, size_t a_size); +dap_enc_key_t* dap_enc_msrln16_key_new_generate(struct dap_enc_key* a_key, size_t a_size);//(OQS_RAND* rand); +// OQS_KEX_rlwe_msrln16_alice_1 +void dap_enc_msrln16_key_new_from_data(OQS_KEX *k, const void *alice_priv, const uint8_t *bob_msg, const size_t bob_msg_len, uint8_t **key, size_t *key_len); +//void dap_enc_msrln16_key_new_from_data(dap_enc_key_t * a_key, const void * a_in, size_t a_in_size); void dap_enc_msrln16_key_new_from_data_public(dap_enc_key_t* a_key, const void * a_in, size_t a_in_size); -void dap_enc_msrln16_key_delete(dap_enc_key_t *a_key); -size_t dap_enc_msrln16_key_public_raw(dap_enc_key_t *a_key, void ** a_key_public); +// OQS_KEX_rlwe_msrln16_alice_priv_free +// OQS_KEX_rlwe_msrln16_free +void dap_enc_msrln16_key_delete(struct dap_enc_key* a_key); +//void dap_enc_msrln16_key_delete(); + +/*?*/size_t dap_enc_msrln16_key_public_raw(dap_enc_key_t *a_key, void ** a_key_public); -size_t dap_enc_msrln16_decode(dap_enc_key_t* a_key, const void * a_in, size_t a_in_size,void * a_out); -size_t dap_enc_msrln16_encode(dap_enc_key_t* a_key, const void * a_in, size_t a_in_size,void * a_out); +//size_t dap_enc_msrln16_decode(dap_enc_key_t* a_key, const void * a_in, size_t a_in_size,void * a_out); +size_t dap_enc_msrln16_decode(OQS_KEX *k, const uint8_t *alice_msg, const size_t alice_msg_len, uint8_t **bob_msg, size_t *bob_msg_len, uint8_t **key, size_t *key_len); +size_t dap_enc_msrln16_encode(OQS_KEX *k, void **alice_priv, uint8_t **alice_msg, size_t *alice_msg_len); +//size_t dap_enc_msrln16_encode(dap_enc_key_t* a_key, const void * a_in, size_t a_in_size,void * a_out); #endif diff --git a/crypto/dap_enc_sidh16.c b/crypto/dap_enc_sidh16.c index e9f56af21cff59372e40c291a161ae747e15391a..efa298b9eaffec71013aa015358519f01e05d68a 100644 --- a/crypto/dap_enc_sidh16.c +++ b/crypto/dap_enc_sidh16.c @@ -22,6 +22,7 @@ static int isCompressed(void *_inheritor) { return 0; } + extern bool dap_sidh16_CurveIsogenyStruct_isnull(PCurveIsogenyStruct pCurveIsogeny); dap_enc_key_t *dap_enc_sidh16_key_new_generate(struct dap_enc_key *a_key, size_t a_size) { @@ -37,7 +38,7 @@ dap_enc_key_t *dap_enc_sidh16_key_new_generate(struct dap_enc_key *a_key, size_t oqs_sidh_cln16_curve_free(curveIsogeny); return NULL; } - // Инициализировать изогенную Ñтруктуру кривой pCurveIsogeny Ñо ÑтатичеÑкими данными, извлеченными из pCurveIsogenyData. + // Инициализировать изогенную Ñтруктуру кривой pCurveIsogeny Ñо ÑтатичеÑкими данными, извлеченными из pCurveIsogenyData. // Ðто нужно вызвать поÑле Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти Ð´Ð»Ñ pCurveIsogeny Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ SIDH_curve_allocate() if(oqs_sidh_cln16_curve_initialize(curveIsogeny, &CurveIsogeny_SIDHp751) != SIDH_CRYPTO_SUCCESS) { DAP_DELETE(k); @@ -60,7 +61,8 @@ dap_enc_key_t *dap_enc_sidh16_key_new_generate(struct dap_enc_key *a_key, size_t void dap_enc_sidh16_key_new_from_data(struct dap_enc_key *a_key, const void *a_in, size_t a_in_size) { - + + } void dap_enc_sidh16_key_delete(struct dap_enc_key *a_key) { @@ -334,38 +336,3 @@ cleanup: } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -