-
dmitriy.gerasimov authored
Tasks 3647 3699 3690 See merge request !33
fb1c4cbf
/*
Copyright (c) 2017-2018 (c) Project "DeM Labs Inc" https://github.com/demlabsinc
All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdlib.h>
#include <string.h>
#include "dap_common.h"
#include "dap_enc_iaes.h"
#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"
#include "dap_enc_picnic.h"
#include "dap_enc_bliss.h"
#include "dap_enc_tesla.h"
#include "dap_enc_dilithium.h"
#include "dap_enc_ringct20.h"
#include "dap_enc_key.h"
#undef LOG_TAG
#define LOG_TAG "dap_enc_key"
struct dap_enc_key_callbacks{
const char * name;
dap_enc_callback_dataop_t enc;
dap_enc_callback_dataop_t dec;
dap_enc_callback_dataop_na_t enc_na;
dap_enc_callback_dataop_na_t dec_na;
dap_enc_callback_dataop_na_ext_t dec_na_ext;
dap_enc_callback_sign_op_t sign_get;
dap_enc_callback_sign_op_t sign_verify;
dap_enc_callback_gen_key_public_t gen_key_public;
dap_enc_callback_key_size_t gen_key_public_size;
dap_enc_callback_calc_out_size enc_out_size;
dap_enc_callback_calc_out_size dec_out_size;
dap_enc_gen_bob_shared_key gen_bob_shared_key;
dap_enc_gen_alice_shared_key gen_alice_shared_key;
dap_enc_callback_new new_callback;
dap_enc_callback_data_t new_from_data_public_callback;
dap_enc_callback_new_generate new_generate_callback;
dap_enc_callback_delete delete_callback;
} s_callbacks[]={
// AES
[DAP_ENC_KEY_TYPE_IAES]={
.name = "IAES",
.enc = dap_enc_iaes256_cbc_encrypt,
.enc_na = dap_enc_iaes256_cbc_encrypt_fast ,
.dec = dap_enc_iaes256_cbc_decrypt,
.dec_na = dap_enc_iaes256_cbc_decrypt_fast ,
.new_callback = dap_enc_aes_key_new,
.delete_callback = dap_enc_aes_key_delete,
.new_generate_callback = dap_enc_aes_key_generate,
.gen_key_public = NULL,
.gen_key_public_size = NULL,
.enc_out_size = dap_enc_iaes256_calc_encode_size,
.dec_out_size = dap_enc_iaes256_calc_decode_max_size,
.sign_get = NULL,
.sign_verify = NULL
},
// OAES
[DAP_ENC_KEY_TYPE_OAES]={
.name = "OAES",
.enc = dap_enc_oaes_encrypt,
.enc_na = dap_enc_oaes_encrypt_fast ,
.dec = dap_enc_oaes_decrypt,
.dec_na = dap_enc_oaes_decrypt_fast ,
.new_callback = dap_enc_oaes_key_new,
.delete_callback = dap_enc_oaes_key_delete,
.new_generate_callback = dap_enc_oaes_key_generate,
.gen_key_public = NULL,
.gen_key_public_size = NULL,
.enc_out_size = dap_enc_oaes_calc_encode_size,
.dec_out_size = dap_enc_oaes_calc_decode_size,
.sign_get = NULL,
.sign_verify = NULL
},
[DAP_ENC_KEY_TYPE_BF_CBC]={
.name = "BF_CBC",
.enc = dap_enc_bf_cbc_encrypt,
.enc_na = dap_enc_bf_cbc_encrypt_fast ,
.dec = dap_enc_bf_cbc_decrypt,
.dec_na = dap_enc_bf_cbc_decrypt_fast ,
.new_callback = dap_enc_bf_cbc_key_new,
.delete_callback = dap_enc_bf_key_delete,
.new_generate_callback = dap_enc_bf_key_generate,
.gen_key_public = NULL,
.gen_key_public_size = NULL,
.enc_out_size = dap_enc_bf_cbc_calc_encode_size,
.dec_out_size = dap_enc_bf_cbc_calc_decode_size,
.sign_get = NULL,
.sign_verify = NULL
},
[DAP_ENC_KEY_TYPE_BF_OFB]={
.name = "BF_OFB",
.enc = dap_enc_bf_ofb_encrypt,
.enc_na = dap_enc_bf_ofb_encrypt_fast ,
.dec = dap_enc_bf_ofb_decrypt,
.dec_na = dap_enc_bf_ofb_decrypt_fast ,
.new_callback = dap_enc_bf_ofb_key_new,
.delete_callback = dap_enc_bf_key_delete,
.new_generate_callback = dap_enc_bf_key_generate,
.gen_key_public = NULL,
.gen_key_public_size = NULL,
.enc_out_size = dap_enc_bf_ofb_calc_encode_size,
.dec_out_size = dap_enc_bf_ofb_calc_decode_size,
.sign_get = NULL,
.sign_verify = NULL
},
[DAP_ENC_KEY_TYPE_GOST_OFB]={
.name = "GOST_OFB",
.enc = dap_enc_gost_ofb_encrypt,
.enc_na = dap_enc_gost_ofb_encrypt_fast ,
.dec = dap_enc_gost_ofb_decrypt,
.dec_na = dap_enc_gost_ofb_decrypt_fast ,
.new_callback = dap_enc_gost_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_gost_ofb_calc_encode_size,
.dec_out_size = dap_enc_gost_ofb_calc_decode_size,
.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_SALSA2012]={
.name = "SALSA2012",
.enc = dap_enc_salsa2012_encrypt,
.enc_na = dap_enc_salsa2012_encrypt_fast ,
.dec = dap_enc_salsa2012_decrypt,
.dec_na = dap_enc_salsa2012_decrypt_fast ,
.new_callback = dap_enc_salsa2012_key_new,
.delete_callback = dap_enc_salsa2012_key_delete,
.new_generate_callback = dap_enc_salsa2012_key_generate,
.gen_key_public = NULL,
.gen_key_public_size = NULL,
.enc_out_size = dap_enc_salsa2012_calc_encode_size,
.dec_out_size = dap_enc_salsa2012_calc_decode_size,
.sign_get = NULL,
.sign_verify = NULL
},
[DAP_ENC_KEY_TYPE_MSRLN] = {
.name = "MSRLN",
.enc = NULL,
.dec = NULL,
.new_callback = dap_enc_msrln_key_new,
.delete_callback = dap_enc_msrln_key_delete,
.new_generate_callback = dap_enc_msrln_key_generate,
.gen_bob_shared_key = dap_enc_msrln_gen_bob_shared_key,
.gen_alice_shared_key = dap_enc_msrln_gen_alice_shared_key,
.gen_key_public = NULL,
.gen_key_public_size = NULL,
.new_from_data_public_callback = dap_enc_msrln_key_new_from_data_public,
.enc_out_size = NULL,
.dec_out_size = NULL,
.sign_get = NULL,
.sign_verify = NULL
},
[DAP_ENC_KEY_TYPE_DEFEO]={
.name = "DEFEO",
.enc = NULL,
.dec = NULL,
.gen_key_public = NULL,
.gen_key_public_size = NULL,
.gen_bob_shared_key = dap_enc_defeo_gen_bob_shared_key,
.gen_alice_shared_key = dap_enc_defeo_gen_alice_shared_key,
.new_callback = dap_enc_defeo_key_new,
.delete_callback = dap_enc_defeo_key_delete,
.new_generate_callback = dap_enc_defeo_key_new_generate,
.enc_out_size = NULL,
.dec_out_size = NULL,
.sign_get = NULL,
.sign_verify = NULL
},
[DAP_ENC_KEY_TYPE_SIG_PICNIC]={
.name = "PICNIC",
.enc = NULL,
.dec = NULL,
.enc_na = dap_enc_sig_picnic_get_sign, // dap_enc_picnic_enc_na
.dec_na = dap_enc_sig_picnic_verify_sign,// dap_enc_picnic_dec_na
.gen_bob_shared_key = NULL,
.gen_alice_shared_key = NULL,
.new_callback = dap_enc_sig_picnic_key_new,
.gen_key_public = NULL,
.gen_key_public_size = dap_enc_picnic_calc_signature_size,
.delete_callback = dap_enc_sig_picnic_key_delete,
.new_generate_callback = dap_enc_sig_picnic_key_new_generate,
.enc_out_size = NULL,
.dec_out_size = NULL,
.sign_get = NULL,
.sign_verify = NULL
},
[DAP_ENC_KEY_TYPE_SIG_BLISS]={
.name = "SIG_BLISS",
.enc = NULL,
.dec = NULL,
.enc_na = NULL,
.dec_na = NULL,
.sign_get = dap_enc_sig_bliss_get_sign,
.sign_verify = dap_enc_sig_bliss_verify_sign,
.gen_bob_shared_key = NULL,
.gen_alice_shared_key = NULL,
.new_callback = dap_enc_sig_bliss_key_new,
.delete_callback = dap_enc_sig_bliss_key_delete,
.new_generate_callback = dap_enc_sig_bliss_key_new_generate,
.gen_key_public = dap_enc_sig_bliss_key_pub_output,
.gen_key_public_size = dap_enc_sig_bliss_key_pub_output_size,
.enc_out_size = NULL,
.dec_out_size = NULL
},
[DAP_ENC_KEY_TYPE_SIG_TESLA]={
.name = "SIG_TESLA",
.enc = NULL,
.dec = NULL,
.enc_na = dap_enc_sig_tesla_get_sign,
.dec_na = dap_enc_sig_tesla_verify_sign,
.gen_key_public = NULL,
.gen_key_public_size = NULL,
.gen_bob_shared_key = NULL,
.gen_alice_shared_key = NULL,
.new_callback = dap_enc_sig_tesla_key_new,
.delete_callback = dap_enc_sig_tesla_key_delete,
.new_generate_callback = dap_enc_sig_tesla_key_new_generate,
.enc_out_size = NULL,
.dec_out_size = NULL,
.sign_get = NULL,
.sign_verify = NULL
},
[DAP_ENC_KEY_TYPE_SIG_DILITHIUM]={
.name = "SIG_DILITHIUM",
.enc = NULL,
.dec = NULL,
.enc_na = dap_enc_sig_dilithium_get_sign,
.dec_na = dap_enc_sig_dilithium_verify_sign,
.gen_key_public = NULL,
.gen_key_public_size = NULL,
.gen_bob_shared_key = NULL,
.gen_alice_shared_key = NULL,
.new_callback = dap_enc_sig_dilithium_key_new,
.delete_callback = dap_enc_sig_dilithium_key_delete,
.new_generate_callback = dap_enc_sig_dilithium_key_new_generate,
.enc_out_size = NULL,
.dec_out_size = NULL,
.sign_get = NULL,
.sign_verify = NULL
},
[DAP_ENC_KEY_TYPE_SIG_RINGCT20]={
.name = "SIG_RINGCT20",
.enc = NULL,
.dec = NULL,
.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_pbk_list,
.gen_key_public = NULL,
.gen_key_public_size = NULL,
.gen_bob_shared_key = NULL,
.gen_alice_shared_key = NULL,
.new_callback = dap_enc_sig_ringct20_key_new,
.delete_callback = dap_enc_sig_ringct20_key_delete,
.new_generate_callback = dap_enc_sig_ringct20_key_new_generate,
.enc_out_size = NULL,
.dec_out_size = NULL,
.sign_get = NULL,
.sign_verify = NULL
}
};
const size_t c_callbacks_size = sizeof(s_callbacks) / sizeof(s_callbacks[0]);
/**
* @brief dap_enc_key_init
* @return
*/
int dap_enc_key_init()
{
return 0;
}
/**
* @brief dap_enc_key_deinit
*/
void dap_enc_key_deinit()
{
}
/**
* @brief dap_enc_key_serealize_sign
*
* @param a_key_type
* @param a_sign
* @param a_sign_len [in/out]
* @return allocates memory with private key
*/
uint8_t* dap_enc_key_serealize_sign(dap_enc_key_type_t a_key_type, uint8_t *a_sign, size_t *a_sign_len)
{
uint8_t *data = NULL;
switch (a_key_type) {
case DAP_ENC_KEY_TYPE_SIG_BLISS:
data = dap_enc_sig_bliss_write_signature((bliss_signature_t*)a_sign, a_sign_len);
break;
case DAP_ENC_KEY_TYPE_SIG_TESLA:
data = dap_enc_tesla_write_signature((tesla_signature_t*)a_sign, a_sign_len);
break;
case DAP_ENC_KEY_TYPE_SIG_DILITHIUM:
data = dap_enc_dilithium_write_signature((dilithium_signature_t*)a_sign, a_sign_len);
break;
default:
data = DAP_NEW_Z_SIZE(uint8_t, *a_sign_len);
memcpy(data, a_sign, *a_sign_len);
}
return data;
}
/**
* @brief dap_enc_key_serealize_sign
*
* @param a_key_type
* @param a_sign
* @param a_sign_len [in/out]
* @return allocates memory with private key
*/
uint8_t* dap_enc_key_deserealize_sign(dap_enc_key_type_t a_key_type, uint8_t *a_sign, size_t *a_sign_len)
{
uint8_t *data = NULL;
switch (a_key_type) {
case DAP_ENC_KEY_TYPE_SIG_BLISS:
data = (uint8_t*)dap_enc_sig_bliss_read_signature(a_sign, *a_sign_len);
*a_sign_len = sizeof(bliss_signature_t);
break;
case DAP_ENC_KEY_TYPE_SIG_TESLA:
data = (uint8_t*)dap_enc_tesla_read_signature(a_sign, *a_sign_len);
*a_sign_len = sizeof(tesla_signature_t);
break;
case DAP_ENC_KEY_TYPE_SIG_DILITHIUM:
data = (uint8_t*)dap_enc_dilithium_read_signature(a_sign, *a_sign_len);
*a_sign_len = sizeof(dilithium_signature_t);
break;
default:
data = DAP_NEW_Z_SIZE(uint8_t, *a_sign_len);
memcpy(data, a_sign, *a_sign_len);
}
return data;
}
/**
* @brief dap_enc_key_serealize_priv_key
*
* @param a_key
* @param a_buflen_out
* @return allocates memory with private key
*/
uint8_t* dap_enc_key_serealize_priv_key(dap_enc_key_t *a_key, size_t *a_buflen_out)
{
uint8_t *data = NULL;
switch (a_key->type) {
case DAP_ENC_KEY_TYPE_SIG_BLISS:
data = dap_enc_sig_bliss_write_private_key(a_key->priv_key_data, a_buflen_out);
break;
case DAP_ENC_KEY_TYPE_SIG_TESLA:
data = dap_enc_tesla_write_private_key(a_key->priv_key_data, a_buflen_out);
break;
case DAP_ENC_KEY_TYPE_SIG_DILITHIUM:
data = dap_enc_dilithium_write_private_key(a_key->priv_key_data, a_buflen_out);
break;
default:
data = DAP_NEW_Z_SIZE(uint8_t, a_key->priv_key_data_size);
memcpy(data, a_key->priv_key_data, a_key->priv_key_data_size);
if(a_buflen_out)
*a_buflen_out = a_key->priv_key_data_size;
}
return data;
}
/**
* @brief dap_enc_key_serealize_pub_key
*
* @param a_key
* @param a_buflen_out
* @return allocates memory with private key
*/
uint8_t* dap_enc_key_serealize_pub_key(dap_enc_key_t *a_key, size_t *a_buflen_out)
{
uint8_t *data = NULL;
if ( a_key->pub_key_data == NULL ){
log_it(L_ERROR, "Public key is NULL");
return NULL;
}
switch (a_key->type) {
case DAP_ENC_KEY_TYPE_SIG_BLISS:
data = dap_enc_sig_bliss_write_public_key(a_key->pub_key_data, a_buflen_out);
break;
case DAP_ENC_KEY_TYPE_SIG_TESLA:
data = dap_enc_tesla_write_public_key(a_key->pub_key_data, a_buflen_out);
break;
case DAP_ENC_KEY_TYPE_SIG_DILITHIUM:
data = dap_enc_dilithium_write_public_key(a_key->pub_key_data, a_buflen_out);
break;
default:
data = DAP_NEW_Z_SIZE(uint8_t, a_key->pub_key_data_size);
memcpy(data, a_key->pub_key_data, a_key->pub_key_data_size);
if(a_buflen_out)
*a_buflen_out = a_key->pub_key_data_size;
}
return data;
}
/**
* @brief dap_enc_key_deserealize_priv_key
*
* @param a_key
* @param a_buf
* @param a_buflen_out
* @return 0 Ok, -1 error
*/
int dap_enc_key_deserealize_priv_key(dap_enc_key_t *a_key, const uint8_t *a_buf, size_t a_buflen)
{
if(!a_key || !a_buf)
return -1;
switch (a_key->type) {
case DAP_ENC_KEY_TYPE_SIG_BLISS:
if((a_key->priv_key_data)) {
bliss_b_private_key_delete((bliss_private_key_t *) a_key->priv_key_data);
DAP_DELETE(a_key->pub_key_data);
}
a_key->priv_key_data = (uint8_t*) dap_enc_sig_bliss_read_private_key(a_buf, a_buflen);
if(!a_key->priv_key_data)
{
a_key->priv_key_data_size = 0;
return -1;
}
a_key->priv_key_data_size = sizeof(bliss_private_key_t);
break;
case DAP_ENC_KEY_TYPE_SIG_TESLA:
tesla_private_key_delete((tesla_private_key_t *) a_key->priv_key_data);
a_key->priv_key_data = (uint8_t*) dap_enc_tesla_read_private_key(a_buf, a_buflen);
if(!a_key->priv_key_data)
{
a_key->priv_key_data_size = 0;
return -1;
}
a_key->priv_key_data_size = sizeof(tesla_private_key_t);
break;
case DAP_ENC_KEY_TYPE_SIG_PICNIC:
DAP_DELETE(a_key->priv_key_data);
a_key->priv_key_data_size = a_buflen;
a_key->priv_key_data = DAP_NEW_Z_SIZE(uint8_t, a_key->priv_key_data_size);
memcpy(a_key->priv_key_data, a_buf, a_key->priv_key_data_size);
dap_enc_sig_picnic_update(a_key);
break;
case DAP_ENC_KEY_TYPE_SIG_DILITHIUM:
dilithium_private_key_delete((dilithium_private_key_t *) a_key->priv_key_data);
a_key->priv_key_data = (uint8_t*) dap_enc_dilithium_read_private_key(a_buf, a_buflen);
if(!a_key->priv_key_data)
{
a_key->priv_key_data_size = 0;
return -1;
}
a_key->priv_key_data_size = sizeof(dilithium_private_key_t);
break;
default:
DAP_DELETE(a_key->priv_key_data);
a_key->priv_key_data_size = a_buflen;
a_key->priv_key_data = DAP_NEW_Z_SIZE(uint8_t, a_key->priv_key_data_size);
memcpy(a_key->priv_key_data, a_buf, a_key->priv_key_data_size);
}
return 0;
}
/**
* @brief dap_enc_key_deserealize_pub_key
*
* @param a_key
* @param a_buf
* @param a_buflen_out
* @return 0 Ok, -1 error
*/
int dap_enc_key_deserealize_pub_key(dap_enc_key_t *a_key, const uint8_t *a_buf, size_t a_buflen)
{
if(!a_key || !a_buf)
return -1;
switch (a_key->type) {
case DAP_ENC_KEY_TYPE_SIG_BLISS:
if((a_key->pub_key_data)) {
bliss_b_public_key_delete((bliss_public_key_t *) a_key->pub_key_data);
DAP_DELETE(a_key->pub_key_data);
}
a_key->pub_key_data = (uint8_t*) dap_enc_sig_bliss_read_public_key(a_buf, a_buflen);
if(!a_key->pub_key_data)
{
a_key->pub_key_data_size = 0;
return -1;
}
a_key->pub_key_data_size = sizeof(bliss_public_key_t);
break;
case DAP_ENC_KEY_TYPE_SIG_TESLA:
tesla_public_key_delete((tesla_public_key_t *) a_key->pub_key_data);
a_key->pub_key_data = (uint8_t*) dap_enc_tesla_read_public_key(a_buf, a_buflen);
if(!a_key->pub_key_data)
{
a_key->pub_key_data_size = 0;
return -1;
}
a_key->pub_key_data_size = sizeof(tesla_public_key_t);
break;
case DAP_ENC_KEY_TYPE_SIG_PICNIC:
DAP_DELETE(a_key->pub_key_data);
a_key->pub_key_data_size = a_buflen;
a_key->pub_key_data = DAP_NEW_Z_SIZE(uint8_t, a_key->pub_key_data_size);
memcpy(a_key->pub_key_data, a_buf, a_key->pub_key_data_size);
dap_enc_sig_picnic_update(a_key);
break;
case DAP_ENC_KEY_TYPE_SIG_DILITHIUM:
if ( a_key->pub_key_data )
dilithium_public_key_delete((dilithium_public_key_t *) a_key->pub_key_data);
a_key->pub_key_data = (uint8_t*) dap_enc_dilithium_read_public_key(a_buf, a_buflen);
if(!a_key->pub_key_data)
{
a_key->pub_key_data_size = 0;
return -1;
}
a_key->pub_key_data_size = sizeof(dilithium_public_key_t);
break;
default:
DAP_DELETE(a_key->pub_key_data);
a_key->pub_key_data_size = a_buflen;
a_key->pub_key_data = DAP_NEW_Z_SIZE(uint8_t, a_key->pub_key_data_size);
memcpy(a_key->pub_key_data, a_buf, a_key->pub_key_data_size);
}
return 0;
}
/**
* @brief dap_enc_key_serealize
* @param key
* @return allocates dap_enc_key_serealize_t* dont remember use free()
*/
dap_enc_key_serealize_t* dap_enc_key_serealize(dap_enc_key_t * key)
{
dap_enc_key_serealize_t *result = DAP_NEW_Z(dap_enc_key_serealize_t);
result->priv_key_data_size = key->priv_key_data_size;
result->pub_key_data_size = key->pub_key_data_size;
result->last_used_timestamp = key->last_used_timestamp;
result->inheritor_size = key->_inheritor_size;
result->type = key->type;
memcpy(result->priv_key_data, key->priv_key_data, key->priv_key_data_size);
memcpy(result->pub_key_data, key->pub_key_data, key->pub_key_data_size);
memcpy(result->inheritor, key->_inheritor, key->_inheritor_size);
return result;
}
/**
* @brief dap_enc_key_deserealize
* @param buf
* @param buf_size
* @return allocates dap_enc_key_t*. Use dap_enc_key_delete for free memory
*/
dap_enc_key_t* dap_enc_key_deserealize(const void *buf, size_t buf_size)
{
if(buf_size != sizeof (dap_enc_key_serealize_t)) {
log_it(L_ERROR, "Key can't be deserealize. buf_size(%d) != sizeof (dap_enc_key_serealize_t)(%d)",buf_size,sizeof (dap_enc_key_serealize_t));
return NULL;
}
const dap_enc_key_serealize_t *in_key = (const dap_enc_key_serealize_t *)buf;
dap_enc_key_t *result = dap_enc_key_new(in_key->type);
result->last_used_timestamp = in_key->last_used_timestamp;
result->priv_key_data_size = in_key->priv_key_data_size;
result->pub_key_data_size = in_key->pub_key_data_size;
result->_inheritor_size = in_key->inheritor_size;
memcpy(result->priv_key_data, in_key->priv_key_data, result->priv_key_data_size);
memcpy(result->pub_key_data, in_key->pub_key_data, result->pub_key_data_size);
if(in_key->inheritor_size)
memcpy(result->_inheritor, in_key->inheritor, in_key->inheritor_size);
else
result->_inheritor = NULL;
return result;
}
/**
* @brief dap_enc_key_new
* @param a_key_type
* @return
*/
dap_enc_key_t *dap_enc_key_new(dap_enc_key_type_t a_key_type)
{
dap_enc_key_t * ret = NULL;
if(a_key_type < c_callbacks_size ){
ret = DAP_NEW_Z(dap_enc_key_t);
if(s_callbacks[a_key_type].new_callback){
s_callbacks[a_key_type].new_callback(ret);
}
}
ret->type = a_key_type;
return ret;
}
/**
* @brief dap_enc_key_new_generate
* @param a_key_type
* @param kex_buf
* @param kex_size
* @param seed
* @param seed_size
* @param key_size - can be NULL ( generate size by default )
* @return
*/
dap_enc_key_t *dap_enc_key_new_generate(dap_enc_key_type_t a_key_type, const void *kex_buf,
size_t kex_size, const void* seed,
size_t seed_size, size_t key_size)
{
dap_enc_key_t * ret = NULL;
if(a_key_type< c_callbacks_size ) {
ret = dap_enc_key_new(a_key_type);
if(s_callbacks[a_key_type].new_generate_callback) {
s_callbacks[a_key_type].new_generate_callback( ret, kex_buf, kex_size, seed, seed_size, key_size);
}
}
return ret;
}
/**
* @brief dap_enc_key_update
* @param a_key_type
* @return
*/
void dap_enc_key_update(dap_enc_key_t *a_key)
{
if(a_key)
switch (a_key->type) {
case DAP_ENC_KEY_TYPE_SIG_TESLA:
break;
case DAP_ENC_KEY_TYPE_SIG_PICNIC:
dap_enc_sig_picnic_update(a_key);
break;
case DAP_ENC_KEY_TYPE_SIG_BLISS:
break;
case DAP_ENC_KEY_TYPE_SIG_DILITHIUM:
break;
default:
break;
}
}
size_t dap_enc_gen_key_public_size (dap_enc_key_t *a_key)
{
if(s_callbacks[a_key->type].gen_key_public_size) {
return s_callbacks[a_key->type].gen_key_public_size(a_key);
} else {
log_it(L_ERROR, "No callback for key public size calculate");
return 0;
}
}
int dap_enc_gen_key_public (dap_enc_key_t *a_key, void * a_output)
{
if(s_callbacks[a_key->type].gen_key_public) {
return s_callbacks[a_key->type].gen_key_public(a_key,a_output);
} else {
log_it(L_ERROR, "No callback for key public generate action");
}
return -1;
}
/**
* @brief dap_enc_key_delete
* @param a_key
*/
void dap_enc_key_signature_delete(dap_enc_key_type_t a_key_type, uint8_t *a_sig_buf)
{
switch (a_key_type) {
case DAP_ENC_KEY_TYPE_SIG_BLISS:
bliss_signature_delete((bliss_signature_t*)a_sig_buf);
break;
case DAP_ENC_KEY_TYPE_SIG_TESLA:
tesla_signature_delete((tesla_signature_t*)a_sig_buf);
break;
case DAP_ENC_KEY_TYPE_SIG_DILITHIUM:
dilithium_signature_delete((dilithium_signature_t*)a_sig_buf);
break;
default:
break;
}
DAP_DELETE(a_sig_buf);
}
/**
* @brief dap_enc_key_delete
* @param a_key
*/
void dap_enc_key_delete(dap_enc_key_t * a_key)
{
if(s_callbacks[a_key->type].delete_callback) {
s_callbacks[a_key->type].delete_callback(a_key);
} else {
log_it(L_ERROR, "delete callback is null. Can be leak memory!");
}
/* a_key->_inheritor must be cleaned in delete_callback func */
if ( a_key->pub_key_data)
DAP_DELETE(a_key->pub_key_data);
if (a_key->priv_key_data )
DAP_DELETE(a_key->priv_key_data);
DAP_DELETE(a_key);
}
size_t dap_enc_key_get_enc_size(dap_enc_key_t * a_key, const size_t buf_in_size)
{
if(s_callbacks[a_key->type].enc_out_size) {
return s_callbacks[a_key->type].enc_out_size(buf_in_size);
}
log_it(L_ERROR, "enc_out_size not realize for current key type");
return 0;
}
size_t dap_enc_key_get_dec_size(dap_enc_key_t * a_key, const size_t buf_in_size)
{
if(s_callbacks[a_key->type].dec_out_size) {
return s_callbacks[a_key->type].dec_out_size(buf_in_size);
}
log_it(L_ERROR, "dec_out_size not realize for current key type");
return 0;
}
const char *dap_enc_get_type_name(dap_enc_key_type_t a_key_type)
{
if(s_callbacks[a_key_type].name) {
return s_callbacks[a_key_type].name;
}
log_it(L_ERROR, "name not realize for current key type");
return 0;
}