diff --git a/enc_server/dap_enc_http.c b/enc_server/dap_enc_http.c index 531073ccada899c417081f4bfd23ad942a964eda..cae922a1816d277d0a752b8000b37c899ffde52a 100644 --- a/enc_server/dap_enc_http.c +++ b/enc_server/dap_enc_http.c @@ -30,50 +30,24 @@ #include "dap_enc.h" #include "dap_enc_ks.h" #include "dap_enc_key.h" +#include "dap_enc_iaes.h" #include "dap_enc_http.h" #include "dap_enc_base64.h" -#include "dap_enc_msrln16.h" -//#include "liboqs/kex_rlwe_msrln16/kex_rlwe_msrln16.h" -#include "liboqs/kex_rlwe_msrln16/kex_rlwe_msrln16.h" -#include "liboqs/kex/kex.h" +#include "dap_enc_msrln.h" #define LOG_TAG "dap_enc_http" -#define RSA_KEY_LENGTH 4096 -#define AES_KEY_LENGTH 16 // 128 ??? int enc_http_init() { - /* BIO *bio = BIO_new(BIO_s_mem()); - BIO_write(bio, my_config.key_public, strlen(my_config.key_public)); - - PEM_read_bio_RSAPublicKey( bio, &public_key_server, NULL, NULL); - - BIO_free_all(bio); - - bio = BIO_new(BIO_s_mem()); - BIO_write(bio, my_config.key_private,strlen(my_config.key_private)); - - PEM_read_bio_RSAPrivateKey(bio, &private_key_server, NULL, NULL); - - BIO_free_all(bio); - - if(public_key_server && private_key_server) - return 0; - else - return -1;*/ return 0; - } void enc_http_deinit() { - /* if(public_key_server) - RSA_free(public_key_server); - if(private_key_server) - RSA_free(private_key_server);*/ } + /** * @brief enc_http_proc Enc http interface * @param cl_st HTTP Simple client instance @@ -83,100 +57,40 @@ void enc_http_proc(struct dap_http_simple *cl_st, void * arg) { log_it(L_DEBUG,"Proc enc http request"); bool * isOk= (bool*)arg; - if(strcmp(cl_st->http->url_path,"hsd9jslagd92abgjalp9h") == 0 ) - { - //Stage 1 : generate private key and alice message - OQS_RAND* rand = OQS_RAND_new(OQS_RAND_alg_urandom_chacha20); - dap_enc_key_t* key_session = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_RLWE_MSRLN16,16); - dap_enc_msrln16_key_t* msrln16_key = DAP_ENC_KEY_TYPE_RLWE_MSRLN16(key_session); - msrln16_key->kex = OQS_KEX_rlwe_msrln16_new(rand); - uint8_t* out_msg = NULL; - size_t out_msg_size = 0; - OQS_KEX_rlwe_msrln16_alice_0(msrln16_key->kex,&msrln16_key->private_key,&out_msg,&out_msg_size); - dap_enc_ks_key_t * key_ks = dap_enc_ks_add(key_session); - - char *sendMsg = malloc(out_msg_size * 2 + strlen(key_ks->id) * 2 + 1024); - char encrypt_id[strlen(key_ks->id) * 2]; - - dap_enc_base64_encode(key_ks->id,strlen(key_ks->id), encrypt_id,DAP_ENC_STANDARD_B64); - - char* encrypt_msg = malloc(out_msg_size * 2); - dap_enc_base64_encode(out_msg,out_msg_size, encrypt_msg,DAP_ENC_STANDARD_B64); - - strcpy(sendMsg,encrypt_id); - strcat(sendMsg," "); - strcat(sendMsg,encrypt_msg); - - - dap_http_simple_reply_f(cl_st,"%s",sendMsg); - free(encrypt_msg); - free(sendMsg); - - *isOk=true; - }else if(strcmp(cl_st->http->url_path,"gd4y5yh78w42aaagh")==0 ){ - if(cl_st->request == NULL) { - log_it(L_WARNING, "Received an empty request"); - *isOk = false; + + if(strcmp(cl_st->http->url_path,"gd4y5yh78w42aaagh") == 0 ) { + + uint8_t alice_msg[cl_st->request_size]; + size_t decode_len = dap_enc_base64_decode(cl_st->request, cl_st->request_size, alice_msg, DAP_ENC_DATA_TYPE_B64); + if(decode_len != MSRLN_PKA_BYTES) { + log_it(L_WARNING, "Wrong http_enc request. Key not equal MSRLN_PKA_BYTES"); + *isOk=false; return; } - //Stage 2 : generate bob public key and bob message - OQS_RAND* rand = OQS_RAND_new(OQS_RAND_alg_urandom_chacha20); - dap_enc_key_t* key_session = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_RLWE_MSRLN16,16); - dap_enc_msrln16_key_t* msrln16_key = DAP_ENC_KEY_TYPE_RLWE_MSRLN16(key_session); - msrln16_key->kex = OQS_KEX_rlwe_msrln16_new(rand); - dap_enc_ks_key_t * key_ks = dap_enc_ks_add(key_session); - - uint8_t* out_msg = NULL; - size_t out_msg_size = 0; - char *msg_index = strchr(cl_st->request,' '); - int key_size = (void*)msg_index - cl_st->request; - int msg_size = cl_st->request_size - key_size - 1; - uint8_t *encoded_msg = malloc(cl_st->request_size); - dap_enc_base64_decode(cl_st->request,cl_st->request_size,encoded_msg,DAP_ENC_STANDARD_B64); - - - OQS_KEX_rlwe_msrln16_bob(msrln16_key->kex,encoded_msg,1824,&out_msg,&out_msg_size,&msrln16_key->public_key,&msrln16_key->public_length); - aes_key_from_msrln_pub(key_ks->key); - - char encrypt_id[strlen(key_ks->id) * 2]; - dap_enc_base64_encode(key_ks->id,strlen(key_ks->id), encrypt_id,DAP_ENC_STANDARD_B64); - - char* encrypt_msg = malloc(out_msg_size * 2); - dap_enc_base64_encode(out_msg,out_msg_size, encrypt_msg,DAP_ENC_STANDARD_B64); - - char *sendMsg = malloc(out_msg_size * 2 + strlen(key_ks->id) * 2 + 1024); - strcpy(sendMsg,encrypt_id); - strcat(sendMsg," "); - strcat(sendMsg,encrypt_msg); - - dap_http_simple_reply_f(cl_st,"%s",sendMsg); - free(encrypt_msg); - free(sendMsg); - free(encoded_msg); - - *isOk=true; - }else if(strcmp(cl_st->http->url_path,"klfdgki45b4jbnjdf5")==0 ){ - //Stage 3 : generate alice public key - uint8_t* out_msg = NULL; - size_t out_msg_size = 0; - char *msg_index = strchr(cl_st->request,' '); - int key_size = (void*)msg_index - cl_st->request; - int msg_size = cl_st->request_size - key_size - 1; - char* encoded_key = malloc(key_size); - memset(encoded_key,0,key_size); - uint8_t *encoded_msg = malloc(msg_size); - dap_enc_base64_decode(cl_st->request,key_size,encoded_key,DAP_ENC_STANDARD_B64); - dap_enc_base64_decode(msg_index+1,msg_size,encoded_msg,DAP_ENC_STANDARD_B64); - dap_enc_ks_key_t *ks_key = dap_enc_ks_find(encoded_key); - dap_enc_msrln16_key_t* msrln16_key = DAP_ENC_KEY_TYPE_RLWE_MSRLN16(ks_key->key); - OQS_KEX_rlwe_msrln16_alice_1(msrln16_key->kex, msrln16_key->private_key, encoded_msg, 2048,&msrln16_key->public_key,&msrln16_key->public_length); - aes_key_from_msrln_pub(ks_key->key); - free(encoded_key); - free(encoded_msg); - - *isOk=true; - }else{ + dap_enc_key_t* msrln_key = dap_enc_key_new(DAP_ENC_KEY_TYPE_MSRLN); + + msrln_key->gen_bob_shared_key(msrln_key, alice_msg, MSRLN_PKA_BYTES, (void**)&msrln_key->pub_key_data); + + dap_enc_ks_key_t * key_ks = dap_enc_ks_add(NULL); + + char encrypt_msg[DAP_ENC_BASE64_ENCODE_SIZE(msrln_key->pub_key_data_size)]; + + dap_enc_base64_encode(msrln_key->pub_key_data, msrln_key->pub_key_data_size, encrypt_msg, DAP_ENC_DATA_TYPE_B64); + + key_ks->key = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_IAES, + msrln_key->priv_key_data, // shared key + msrln_key->priv_key_data_size, + key_ks->id, DAP_ENC_KS_KEY_ID_SIZE, 0); + + char encrypt_id[DAP_ENC_BASE64_ENCODE_SIZE(DAP_ENC_KS_KEY_ID_SIZE)]; + + dap_enc_base64_encode(key_ks->id, DAP_ENC_KS_KEY_ID_SIZE, encrypt_id, DAP_ENC_DATA_TYPE_B64); + + dap_http_simple_reply_f(cl_st, "%s %s", encrypt_id, encrypt_msg); + + dap_enc_key_delete(msrln_key); + } else{ log_it(L_ERROR,"Wrong path '%s' in the request to enc_http module",cl_st->http->url_path); *isOk=false; } @@ -207,11 +121,11 @@ enc_http_delegate_t *enc_http_request_decode(struct dap_http_simple *cl_st) dg->cookie=strdup(cl_st->http->in_cookie); if(cl_st->request_size){ - dg->request=calloc(1,cl_st->request_size+1); - dg->request_size=dap_enc_decode(key, cl_st->request, cl_st->request_size,dg->request,DAP_ENC_DATA_TYPE_RAW); + // dg->request=calloc(1,cl_st->request_size+1); + dg->request_size=dap_enc_decode(key, cl_st->request, cl_st->request_size,&dg->request,DAP_ENC_DATA_TYPE_RAW); dg->request_str[dg->request_size] = 0; log_it(L_DEBUG,"Request after decode '%s'",dg->request_str); - // log_it(L_DEBUG,"Request before decode: '%s' after decode '%s'",cl_st->request_str,dg->request_str); + // log_it(L_DEBUG,"Request before decode: '%s' after decode '%s'",cl_st->request_str,dg->request_str); } dap_enc_data_type_t l_enc_type; @@ -223,8 +137,8 @@ enc_http_delegate_t *enc_http_request_decode(struct dap_http_simple *cl_st) size_t url_path_size=strlen(cl_st->http->url_path); if(url_path_size){ - dg->url_path=calloc(1,url_path_size+1); - dg->url_path_size=dap_enc_decode(key, cl_st->http->url_path,url_path_size,dg->url_path,l_enc_type); + // dg->url_path=calloc(1,url_path_size+1); + dg->url_path_size=dap_enc_decode(key, cl_st->http->url_path,url_path_size,&dg->url_path,l_enc_type); dg->url_path[dg->url_path_size] = 0; log_it(L_DEBUG,"URL path after decode '%s'",dg->url_path ); // log_it(L_DEBUG,"URL path before decode: '%s' after decode '%s'",cl_st->http->url_path,dg->url_path ); @@ -233,8 +147,8 @@ enc_http_delegate_t *enc_http_request_decode(struct dap_http_simple *cl_st) size_t in_query_size=strlen(cl_st->http->in_query_string); if(in_query_size){ - dg->in_query=calloc(1,in_query_size+1); - dg->in_query_size=dap_enc_decode(key, cl_st->http->in_query_string,in_query_size,dg->in_query,l_enc_type); + // dg->in_query=calloc(1,in_query_size+1); + dg->in_query_size=dap_enc_decode(key, cl_st->http->in_query_string,in_query_size,&dg->in_query,l_enc_type); dg->in_query[dg->in_query_size] = 0; log_it(L_DEBUG,"Query string after decode '%s'",dg->in_query); } @@ -251,67 +165,15 @@ enc_http_delegate_t *enc_http_request_decode(struct dap_http_simple *cl_st) void enc_http_reply_encode(struct dap_http_simple *cl_st,enc_http_delegate_t * dg) { dap_enc_key_t * key = dap_enc_ks_find_http(cl_st->http); - if( key == NULL ) - { - log_it(L_ERROR, "Not find key"); + if( key == NULL ) { + log_it(L_ERROR, "Can't find http key."); return; } if(dg->response){ - const size_t part = 255; - size_t out_enc_mem_size = (dg->response_size / part + 1) * (RSA_KEY_LENGTH / 8); -#ifdef __GNUC__ - if (__builtin_expect(dg->response_size > part, 0)) { -#else - if (dg->response_size > part) { -#endif - //log_it(L_DEBUG, "enc_http_reply_encode RSA WAY 1"); - char *out_enc_buffer = calloc (out_enc_mem_size, sizeof(char)); - size_t copy_size, enc_size = 0; - size_t end = dg->response_size; - for (size_t i = 0; i<dg->response_size; i += part) { - - end = dg->response_size - i; - copy_size = (end <= part) ? end : part; - - if(enc_size > out_enc_mem_size) { - log_it(L_WARNING, "Enc size > out_enc_mem_size"); - char *old = out_enc_buffer; - out_enc_buffer = (char*)realloc(out_enc_buffer, out_enc_mem_size * 2); - if(!out_enc_buffer) { - free(old); - log_it(L_ERROR, "Can not memmory allocate"); - return; - } - memset(out_enc_buffer + out_enc_mem_size, 0, out_enc_mem_size); - } - - enc_size +=dap_enc_code(dg->key, - dg->response_str + i, - copy_size, - out_enc_buffer + enc_size, - DAP_ENC_DATA_TYPE_RAW); - - } - cl_st->reply = calloc(1, enc_size); - cl_st->reply_size = enc_size; - //log_it(L_INFO, "\n\n\nCOLLECTED DATA is {%s} size={%d}",out_enc_buffer, _enc_size); - memcpy(cl_st->reply, out_enc_buffer, enc_size); - free (out_enc_buffer); - - } - else if(dg->response_size>0){ - //log_it(L_DEBUG, "enc_http_reply_encode RSA WAY 2"); - if(cl_st->reply) - free(cl_st->reply); - - if(key->type == DAP_ENC_KEY_TYPE_AES){ //Добавить ключ в dap_enc_key.h ??? - cl_st->reply=calloc(1, AES_KEY_LENGTH / 8); - } - else { - cl_st->reply=calloc(1, dg->response_size * 3 + 1); - } - cl_st->reply_size = dap_enc_code(dg->key,dg->response,dg->response_size,cl_st->reply,DAP_ENC_DATA_TYPE_RAW); - } + + if(cl_st->reply) + free(cl_st->reply); + cl_st->reply_size = dap_enc_code(dg->key,dg->response,dg->response_size,&cl_st->reply,DAP_ENC_DATA_TYPE_RAW); } } diff --git a/enc_server/dap_enc_ks.c b/enc_server/dap_enc_ks.c index 0018f862c15806e1bd004c156ee46cc3cb663646..8639c29ff7b30ef868109967852178eb39360555 100644 --- a/enc_server/dap_enc_ks.c +++ b/enc_server/dap_enc_ks.c @@ -53,7 +53,11 @@ void dap_enc_ks_deinit() dap_enc_ks_key_t * dap_enc_ks_find(const char * v_id) { dap_enc_ks_key_t * ret=NULL; + log_it(L_WARNING, "Trying fiend key with id: %s", v_id); HASH_FIND_STR(ks,v_id,ret); + if(ret == NULL) { + log_it(L_WARNING, "Key not found"); + } return ret; } @@ -67,7 +71,7 @@ dap_enc_key_t * dap_enc_ks_find_http(struct dap_http_client * http) if(ks_key) return ks_key->key; else{ - //log_it(L_WARNING, "Not found keyID"); + log_it(L_WARNING, "Not found keyID %s in storage", hdr_key_id->value); return NULL; } }else{ @@ -96,7 +100,8 @@ dap_enc_ks_key_t * dap_enc_ks_add(struct dap_enc_key * key) ret->key=key; pthread_mutex_init(&ret->mutex,NULL); - for(short i = 0; i < sizeof(ret->id); i++) + memset(ret->id, 0, DAP_ENC_KS_KEY_ID_SIZE); + for(short i = 0; i < DAP_ENC_KS_KEY_ID_SIZE; i++) ret->id[i]=65+rand()%25; HASH_ADD_STR(ks,id,ret); @@ -105,11 +110,14 @@ dap_enc_ks_key_t * dap_enc_ks_add(struct dap_enc_key * key) void dap_enc_ks_delete(const char *id) { + log_it(L_WARNING, "dap_enc_ks_delete"); dap_enc_ks_key_t *delItem = dap_enc_ks_find(id); if (delItem) { HASH_DEL (ks, delItem); _enc_key_free(&delItem); + return; } + log_it(L_WARNING, "Can't delete key by id: %s. Key not found", id); } void _enc_key_free(dap_enc_ks_key_t **ptr) diff --git a/enc_server/dap_enc_ks.h b/enc_server/dap_enc_ks.h index c4e49ad6d1f7a1521962109cb2a02fc1bff19efd..012b854c7d2eab4025eb21ef39e972d98b938049 100644 --- a/enc_server/dap_enc_ks.h +++ b/enc_server/dap_enc_ks.h @@ -25,10 +25,11 @@ #include "uthash.h" #include "dap_enc_key.h" +#define DAP_ENC_KS_KEY_ID_SIZE 33 struct dap_http_client; typedef struct dap_enc_key dap_enc_key_t; typedef struct dap_enc_ks_key{ - char id[33]; + char id[DAP_ENC_KS_KEY_ID_SIZE]; dap_enc_key_t *key; time_t time_created; pthread_mutex_t mutex; diff --git a/http_server/dap_http_simple.c b/http_server/dap_http_simple.c index 33c7e1bee485ea428b5060140af41687a4f98007..30d430f9e175739368726cd8f611a44cdf70ad3a 100644 --- a/http_server/dap_http_simple.c +++ b/http_server/dap_http_simple.c @@ -160,13 +160,6 @@ void* dap_http_simple_proc(dap_http_simple_t * cl_sh) if(is_ok){ log_it(L_DEBUG, "Request was processed well"); - if(cl_sh->reply_proc_post_callback){ - void * enc_data = calloc(1,cl_sh->reply_size*2); - cl_sh->reply_proc_post_callback(cl_sh,enc_data); - free(cl_sh->reply); - cl_sh->reply=enc_data; - } - cl_sh->http->out_content_length=cl_sh->reply_size; strcpy(cl_sh->http->out_content_type, cl_sh->reply_mime); @@ -257,6 +250,8 @@ void dap_http_simple_data_write(dap_http_client_t * a_http_client,void * a_arg) a_http_client->client->signal_close=true; //dap_client_ready_to_write(cl_ht->client,false); } + + free(cl_st->reply); } /** diff --git a/http_server/dap_http_simple.h b/http_server/dap_http_simple.h index 3d08c79df01f17531a9f5ab166980beb8cf7e665..c724e2a92d15db0afe7b89a505cec8add803b07e 100644 --- a/http_server/dap_http_simple.h +++ b/http_server/dap_http_simple.h @@ -46,7 +46,7 @@ typedef struct dap_http_simple{ size_t reply_sent; char reply_mime[256]; - dap_http_simple_callback_t reply_proc_post_callback; + // dap_http_simple_callback_t reply_proc_post_callback; } dap_http_simple_t; #define DAP_HTTP_SIMPLE(a) ((dap_http_simple_t*) (a)->_inheritor )