diff --git a/client/dap_client_internal.c b/client/dap_client_internal.c index a4edd1a3bf7d9a18f2aa3468f84a89d471de0fa2..4516968efa33fe052f6b6697ada99d53a49d90bf 100644 --- a/client/dap_client_internal.c +++ b/client/dap_client_internal.c @@ -105,7 +105,7 @@ static void s_stage_status_after(dap_client_internal_t * a_client_internal) char *sendMsg = malloc(out_msg_size * 2 + 1024); char* encrypt_msg = malloc(out_msg_size * 2); - dap_enc_base64_encode(out_msg,out_msg_size, encrypt_msg); + dap_enc_base64_encode(out_msg,out_msg_size, encrypt_msg,DAP_ENC_STANDARD_B64); strcat(sendMsg,encrypt_msg); @@ -443,8 +443,8 @@ void m_enc_init_response(dap_client_t * a_client, void * a_response,size_t a_res char* encoded_key = malloc(key_size); memset(encoded_key,0,key_size); uint8_t *encoded_msg = malloc(msg_size); - dap_enc_base64_decode(a_response,key_size,encoded_key); - dap_enc_base64_decode(msg_index+1,msg_size,encoded_msg); + dap_enc_base64_decode(a_response,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_msrln16_key_t* msrln16_key = DAP_ENC_KEY_TYPE_RLWE_MSRLN16(s_key_domain); 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(s_key_domain); diff --git a/crypto/dap_enc.c b/crypto/dap_enc.c index 8777246862f658813542f1339aa9da3b3dbb31bb..bf3a4615492ee51e7307b53f4c23db41c299a615 100644 --- a/crypto/dap_enc.c +++ b/crypto/dap_enc.c @@ -64,28 +64,19 @@ size_t dap_enc_code(struct dap_enc_key * key,const void * buf,const size_t buf_s { if(key->enc){ void *proc_buf = NULL; - switch(data_type_out){ - case DAP_ENC_DATA_TYPE_B64_URLSAFE: - case DAP_ENC_DATA_TYPE_B64:{ - proc_buf=calloc(1,buf_size*2); - }break; - case DAP_ENC_DATA_TYPE_RAW:{ - proc_buf=buf_out; - }break; - } + if(data_type_out == DAP_ENC_DATA_TYPE_RAW) + proc_buf=buf_out; + else + proc_buf=calloc(1,buf_size*2); size_t ret=key->enc(key,buf,buf_size,proc_buf); - if( (data_type_out==DAP_ENC_DATA_TYPE_B64) ||( data_type_out == DAP_ENC_DATA_TYPE_B64_URLSAFE ) ){ - ret=dap_enc_base64_encode(proc_buf,ret,buf_out); + if(data_type_out==DAP_ENC_DATA_TYPE_B64){ + ret=dap_enc_base64_encode(proc_buf,ret,buf_out,DAP_ENC_STANDARD_B64); + if (proc_buf) + free(proc_buf); + }else if(data_type_out == DAP_ENC_DATA_TYPE_B64_URLSAFE){ + ret=dap_enc_base64_encode(proc_buf,ret,buf_out,DAP_ENC_STANDARD_B64_URLSAFE); if (proc_buf) free(proc_buf); - if( data_type_out == DAP_ENC_DATA_TYPE_B64_URLSAFE ){ - size_t i; - for(i=0;i<ret;i++) - if( ((char*)buf_out)[i] == '/' ) - ((char*)buf_out)[i] = '_'; - } - - return ret; } return ret; }else{ @@ -109,14 +100,13 @@ size_t dap_enc_decode(struct dap_enc_key * key,const void * buf, const size_t bu size_t proc_buf_size = 0; switch(data_type_in){ case DAP_ENC_DATA_TYPE_B64_URLSAFE:{ - size_t i; - for(i=0;i<buf_size;i++) - if( ((char*)buf)[i] == '_' ) - ((char*)buf)[i] = '/'; - } + proc_buf=calloc(1,buf_size); + proc_buf_size= dap_enc_base64_decode((const char*) buf,buf_size,proc_buf,DAP_ENC_STANDARD_B64_URLSAFE); + proc_buf_const=proc_buf; + }break; case DAP_ENC_DATA_TYPE_B64:{ proc_buf=calloc(1,buf_size); - proc_buf_size= dap_enc_base64_decode((const char*) buf,buf_size,proc_buf); + proc_buf_size= dap_enc_base64_decode((const char*) buf,buf_size,proc_buf,DAP_ENC_STANDARD_B64); proc_buf_const=proc_buf; }break; case DAP_ENC_DATA_TYPE_RAW:{ @@ -127,7 +117,7 @@ size_t dap_enc_decode(struct dap_enc_key * key,const void * buf, const size_t bu if(key->dec){ size_t ret=key->dec(key,proc_buf_const,proc_buf_size,buf_out); - if(data_type_in==DAP_ENC_DATA_TYPE_B64) + if(data_type_in==DAP_ENC_DATA_TYPE_B64 || DAP_ENC_DATA_TYPE_B64_URLSAFE) if (proc_buf) free(proc_buf); return ret; diff --git a/crypto/dap_enc_base64.c b/crypto/dap_enc_base64.c index aff8e0027f3ff3480a406f4579e7a7238bf7e7b6..d5ba199d1fb37dec3299a323e892ce6d1a25b669 100755 --- a/crypto/dap_enc_base64.c +++ b/crypto/dap_enc_base64.c @@ -85,7 +85,7 @@ b64_decode_ex (const char *, size_t, size_t *); * @param out * @return */ -size_t dap_enc_base64_decode(const char * in, size_t in_size,void * out) +size_t dap_enc_base64_decode(const char * in_raw, size_t in_size,void * out, dap_enc_b64_standard_t standard) { //B64_Decode( in, in_size, (byte*) out ); //return B64_GetSize( in_size,0 ); @@ -98,6 +98,18 @@ size_t dap_enc_base64_decode(const char * in, size_t in_size,void * out) unsigned char buf[3]; unsigned char tmp[4]; + char* in = (char*)malloc(in_size); + memcpy(in,in_raw,in_size); + + if(standard == DAP_ENC_STANDARD_B64_URLSAFE) + for(int i=0; i < in_size; i++) + { + if(in[i] == '_') + in[i] = '/'; + else if(in[i] == '-') + in[i] = '+'; + } + // alloc //dec = (unsigned char *) b64_malloc(1); if (NULL == out) { return 0; } @@ -181,7 +193,7 @@ size_t dap_enc_base64_decode(const char * in, size_t in_size,void * out) * @param a_out * @return */ -size_t dap_enc_base64_encode(const void * a_in, size_t a_in_size, char * a_out) +size_t dap_enc_base64_encode(const void * a_in, size_t a_in_size, char * a_out, dap_enc_b64_standard_t standard) { int i = 0; int j = 0; @@ -240,6 +252,16 @@ size_t dap_enc_base64_encode(const void * a_in, size_t a_in_size, char * a_out) // Make sure we have enough space to add '\0' character at end. a_out[size] = '\0'; + + if(standard == DAP_ENC_STANDARD_B64_URLSAFE) + for(int i=0; i < size; i++) + { + if(a_out[i] == '/') + a_out[i] = '_'; + else if(a_out[i] == '+') + a_out[i] = '-'; + } + return size; } diff --git a/crypto/dap_enc_base64.h b/crypto/dap_enc_base64.h index c0e7eb0c53c40116e6262ab6e598125f58cdc885..be44ffad70b776bdf89297d994290133571ce0d5 100755 --- a/crypto/dap_enc_base64.h +++ b/crypto/dap_enc_base64.h @@ -6,8 +6,14 @@ extern "C" { #endif -size_t dap_enc_base64_decode(const char * in, size_t in_size,void * out); -size_t dap_enc_base64_encode(const void * in, size_t in_size,char * out); +typedef enum dap_enc_b64_standard{DAP_ENC_STANDARD_B64, + + DAP_ENC_STANDARD_B64_URLSAFE, + + } dap_enc_b64_standard_t; + +size_t dap_enc_base64_decode(const char * in, size_t in_size, void * out, dap_enc_b64_standard_t standard); +size_t dap_enc_base64_encode(const void * in, size_t in_size, char * out, dap_enc_b64_standard_t standard); #ifdef __cplusplus }