diff --git a/CMakeLists.txt b/CMakeLists.txt index e83538a211f90e04be4a2d65c0fc897f264c2e05..fae4546942d8ffbd7b4116d4d9efd7ad55983973 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,4 +17,3 @@ endif() add_subdirectory(core) add_subdirectory(crypto) - diff --git a/core/unix/CMakeLists.txt b/core/unix/CMakeLists.txt index 7679c21334908fb049c31c980759aefa1ebdd496..da6eb03154d78815fd34573db71fc5042713f538 100644 --- a/core/unix/CMakeLists.txt +++ b/core/unix/CMakeLists.txt @@ -20,3 +20,4 @@ target_include_directories(dap_core_unix INTERFACE .) if(LINUX) target_include_directories(dap_core_unix INTERFACE ./linux) endif() + diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index daeb534ab668bdb202b9f25561a279ac1b375b36..9388ac5a7ddecff17b6dfbdf038d3aa7a935e1e3 100755 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -14,3 +14,5 @@ target_include_directories(dap_crypto PRIVATE rand iaes oaes sha3 msrln defeo_sc target_include_directories(dap_crypto INTERFACE . sha3) target_link_libraries(dap_crypto dap_core m) + + diff --git a/crypto/dap_enc_bliss.c b/crypto/dap_enc_bliss.c index 4610d36203672689100ba22694ac64412ebc95ba..29d6f60f0ce1ac948b2192cde5e937a0ca354b1f 100644 --- a/crypto/dap_enc_bliss.c +++ b/crypto/dap_enc_bliss.c @@ -22,13 +22,43 @@ void dap_enc_sig_bliss_key_new(struct dap_enc_key *key) { key->gen_alice_shared_key = (dap_enc_gen_alice_shared_key) dap_enc_sig_bliss_verify_sign; } +/** + * @brief dap_enc_sig_bliss_key_pub_output_size + * @param l_key + * @return + */ +size_t dap_enc_sig_bliss_key_pub_output_size(struct dap_enc_key *l_key) +{ + (void) l_key; + return sizeof(bliss_public_key_t); // Always same, right? +} + +/** + * @brief dap_enc_sig_bliss_key_pub_output + * @param l_key + * @param l_output + * @return + */ +int dap_enc_sig_bliss_key_pub_output(struct dap_enc_key *l_key, void * l_output) +{ + int32_t retcode; + + retcode = bliss_b_public_key_extract( (bliss_public_key_t *) l_output, + (const bliss_private_key_t *) l_key->priv_key_data); + if (retcode != BLISS_B_NO_ERROR) { + log_it(L_CRITICAL, "Can't extract public key from the private one"); + return -1; + } + return 0; +} + // generation key pair for sign Alice // OUTPUT: // a_key->data --- Alice's public key // alice_priv --- Alice's private key // alice_msg_len --- Alice's private key length -void dap_enc_sig_bliss_key_new_generate(struct dap_enc_key * key, const void *kex_buf, +void dap_enc_sig_bliss_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) { @@ -36,9 +66,9 @@ void dap_enc_sig_bliss_key_new_generate(struct dap_enc_key * key, const void *ke (void) seed; (void) seed_size; (void)key_size; - int32_t retcode; + int32_t l_retcode; - dap_enc_sig_bliss_key_new(key); + dap_enc_sig_bliss_key_new(a_key); uint8_t seed_tmp[SHA3_512_DIGEST_LENGTH]; entropy_t entropy; @@ -53,19 +83,23 @@ void dap_enc_sig_bliss_key_new_generate(struct dap_enc_key * key, const void *ke * type = 4 - max securiry (192 bits) */ //int32_t type = 4; - key->priv_key_data = malloc(sizeof(bliss_private_key_t)); - retcode = bliss_b_private_key_gen((bliss_private_key_t *) key->priv_key_data, _bliss_type, &entropy); - if (retcode != BLISS_B_NO_ERROR) { - bliss_b_private_key_delete(key->priv_key_data); + a_key->priv_key_data_size = sizeof(bliss_private_key_t); + a_key->priv_key_data = DAP_NEW_SIZE(void,a_key->priv_key_data_size); + l_retcode = bliss_b_private_key_gen((bliss_private_key_t *) a_key->priv_key_data, _bliss_type, &entropy); + if (l_retcode != BLISS_B_NO_ERROR) { + bliss_b_private_key_delete(a_key->priv_key_data); + a_key->priv_key_data = NULL; + a_key->priv_key_data_size = 0; log_it(L_CRITICAL, "Error"); return; } - key->pub_key_data = malloc(sizeof(bliss_public_key_t)); - retcode = bliss_b_public_key_extract( (bliss_public_key_t *) key->pub_key_data, (const bliss_private_key_t *) key->priv_key_data); - if (retcode != BLISS_B_NO_ERROR) { - bliss_b_private_key_delete(key->priv_key_data); - bliss_b_public_key_delete(key->pub_key_data); + a_key->pub_key_data_size = sizeof(bliss_public_key_t); + a_key->pub_key_data = DAP_NEW_SIZE(void,a_key->pub_key_data_size ); + l_retcode = bliss_b_public_key_extract( (bliss_public_key_t *) a_key->pub_key_data, (const bliss_private_key_t *) a_key->priv_key_data); + if (l_retcode != BLISS_B_NO_ERROR) { + bliss_b_private_key_delete(a_key->priv_key_data); + bliss_b_public_key_delete(a_key->pub_key_data); log_it(L_CRITICAL, "Error"); return; } diff --git a/crypto/dap_enc_bliss.h b/crypto/dap_enc_bliss.h index 73f2f25a7b261b4ddd2a2a1437fd442df2215c9a..3d7620b55a76ef07f140fc45bcd9586da916e9ff 100644 --- a/crypto/dap_enc_bliss.h +++ b/crypto/dap_enc_bliss.h @@ -23,4 +23,6 @@ size_t dap_enc_sig_bliss_verify_sign(struct dap_enc_key * key,const void * msg, const size_t msg_size, void * signature, const size_t signature_size); void dap_enc_sig_bliss_key_delete(struct dap_enc_key *key); +size_t dap_enc_sig_bliss_key_pub_output_size(struct dap_enc_key *l_key); +int dap_enc_sig_bliss_key_pub_output(struct dap_enc_key *l_key, void * l_output); diff --git a/crypto/dap_enc_key.c b/crypto/dap_enc_key.c index 06650d2da7f31a4f0241b1306f0d13a92a88e472..e56694a28de5746aa823e523877ad15f426feb4a 100755 --- a/crypto/dap_enc_key.c +++ b/crypto/dap_enc_key.c @@ -43,6 +43,9 @@ struct dap_enc_key_callbacks{ 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_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; @@ -52,7 +55,6 @@ struct dap_enc_key_callbacks{ 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 @@ -65,6 +67,8 @@ struct dap_enc_key_callbacks{ .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_size, }, @@ -78,6 +82,8 @@ struct dap_enc_key_callbacks{ .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, }, @@ -90,6 +96,8 @@ struct dap_enc_key_callbacks{ .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 @@ -98,6 +106,8 @@ struct dap_enc_key_callbacks{ .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, @@ -115,6 +125,8 @@ struct dap_enc_key_callbacks{ .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 = NULL, .delete_callback = dap_enc_sig_picnic_key_delete, .new_generate_callback = dap_enc_sig_picnic_key_new_generate, .enc_out_size = NULL, @@ -131,6 +143,9 @@ struct dap_enc_key_callbacks{ .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 }, @@ -140,6 +155,8 @@ struct dap_enc_key_callbacks{ .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, @@ -260,6 +277,26 @@ dap_enc_key_t *dap_enc_key_new_generate(dap_enc_key_type_t a_key_type, const voi } +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 diff --git a/crypto/dap_enc_key.h b/crypto/dap_enc_key.h index 0ced83097685d51410249d3ddcfae11f4d2e61dc..8bc6d7b90e2a4abb0d21237214f7959aa6997c5d 100755 --- a/crypto/dap_enc_key.h +++ b/crypto/dap_enc_key.h @@ -110,7 +110,8 @@ typedef enum dap_enc_key_type{ DAP_ENC_KEY_TYPE_IAES, // Symmetric AES DAP_ENC_KEY_TYPE_SIG_TESLA, // signature based on Ring_LWE problem with zero-knowledge proof as specified in // Post-Quantum Zero-Knowledge and Signatures from Symmetric-Key Primitives - DAP_ENC_KEY_TYPE_FNAM2 + DAP_ENC_KEY_TYPE_NULL = 0 + } dap_enc_key_type_t; struct dap_enc_key; @@ -125,6 +126,8 @@ typedef void (*dap_enc_callback_new_generate)(struct dap_enc_key* key, const voi // free memory typedef void (*dap_enc_callback_delete)(struct dap_enc_key*); +typedef size_t (*dap_enc_callback_key_size_t)(struct dap_enc_key*); + // encrypt and decrypt functions. Allocates Memory for out typedef size_t (*dap_enc_callback_dataop_t)(struct dap_enc_key *key, const void *in, const size_t in_size,void ** out); @@ -155,6 +158,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 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 **); @@ -225,6 +229,9 @@ dap_enc_key_t *dap_enc_key_new_generate(dap_enc_key_type_t key_type, const void dap_enc_key_t *dap_enc_gen_pub_key_from_priv(struct dap_enc_key *a_key, void **priv_key, size_t *alice_msg_len); +size_t dap_enc_gen_key_public_size (dap_enc_key_t *a_key); +int dap_enc_gen_key_public (dap_enc_key_t *a_key, void * a_output); + void dap_enc_key_delete(dap_enc_key_t * a_key); #ifdef __cplusplus diff --git a/crypto/sig_picnic/macos_specific_endian.h b/crypto/sig_picnic/macos_specific_endian.h new file mode 100644 index 0000000000000000000000000000000000000000..f7b6756a062fb8aced2f09687172b90f77f75106 --- /dev/null +++ b/crypto/sig_picnic/macos_specific_endian.h @@ -0,0 +1,32 @@ +#ifndef MACOS_SPECIFIC_ENDIAN_H +#define MACOS_SPECIFIC_ENDIAN_H + +/** compatibility header for endian.h + * This is a simple compatibility shim to convert + * BSD/Linux endian macros to the Mac OS X equivalents. + * It is public domain. + * */ + +#ifndef __APPLE__ + #warning "This header file (endian.h) is MacOS X specific.\n" +#endif /* __APPLE__ */ + +#include <machine/endian.h> +#include <libkern/OSByteOrder.h> + +#define htobe16(x) OSSwapHostToBigInt16(x) +#define htole16(x) OSSwapHostToLittleInt16(x) +#define be16toh(x) OSSwapBigToHostInt16(x) +#define le16toh(x) OSSwapLittleToHostInt16(x) + +#define htobe32(x) OSSwapHostToBigInt32(x) +#define htole32(x) OSSwapHostToLittleInt32(x) +#define be32toh(x) OSSwapBigToHostInt32(x) +#define le32toh(x) OSSwapLittleToHostInt32(x) + +#define htobe64(x) OSSwapHostToBigInt64(x) +#define htole64(x) OSSwapHostToLittleInt64(x) +#define be64toh(x) OSSwapBigToHostInt64(x) +#define le64toh(x) OSSwapLittleToHostInt64(x) + +#endif // MACOS_SPECIFIC_ENDIAN_H diff --git a/crypto/sig_picnic/picnic_impl.c b/crypto/sig_picnic/picnic_impl.c index e1061f03fd7fc8663e1cbf61596d90ab47eb1bd8..990a6dae471569046ef4b86d4258d11630e2f8a6 100644 --- a/crypto/sig_picnic/picnic_impl.c +++ b/crypto/sig_picnic/picnic_impl.c @@ -20,6 +20,8 @@ #if defined (__WIN32) #include <Windows.h> #include <bcrypt.h> +#elif defined (__APPLE__) + #include "macos_specific_endian.h" #else #include <endian.h> #endif diff --git a/crypto/sig_picnic/sig_picnic.pri b/crypto/sig_picnic/sig_picnic.pri index 52fd38176d6dc903300e9f32f5661674f5b0b64d..f95cfdd7a48fa9ea60d914fe4dbeac2d0eec57ad 100644 --- a/crypto/sig_picnic/sig_picnic.pri +++ b/crypto/sig_picnic/sig_picnic.pri @@ -3,8 +3,9 @@ HEADERS += $$PWD/hash.h \ $$PWD/picnic.h \ $$PWD/picnic_impl.h \ $$PWD/picnic_types.h \ - $$PWD/platform.h \ + $$PWD/platform.h +macos { HEADERS += $$PWD/macos_specific_endian.h } SOURCES += $$PWD/hash.c \ $$PWD/lowmc_constants.c \