From e3e903296c98140e602c1d97eff638a97a1dcc37 Mon Sep 17 00:00:00 2001 From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net> Date: Fri, 8 Jan 2021 21:23:25 +0700 Subject: [PATCH] [+] Workaround for "old" serialization format [!] Fixed platform-depended serialization --- CMakeLists.txt | 2 +- dap-sdk/crypto/include/dap_enc_dilithium.h | 3 + dap-sdk/crypto/include/dap_enc_key.h | 1 + dap-sdk/crypto/src/dap_enc_dilithium.c | 127 +++++++++++++++--- dap-sdk/crypto/src/dap_enc_key.c | 56 ++++++++ .../src/sig_dilithium/dilithium_params.h | 2 +- 6 files changed, 168 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 637d02d30f..3647fddac7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cellframe-sdk C) cmake_minimum_required(VERSION 2.8) set(CMAKE_C_STANDARD 11) -set(CELLFRAME_SDK_NATIVE_VERSION "2.6-99") +set(CELLFRAME_SDK_NATIVE_VERSION "2.6-100") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") diff --git a/dap-sdk/crypto/include/dap_enc_dilithium.h b/dap-sdk/crypto/include/dap_enc_dilithium.h index 7f285580f1..e9352f3c9f 100755 --- a/dap-sdk/crypto/include/dap_enc_dilithium.h +++ b/dap-sdk/crypto/include/dap_enc_dilithium.h @@ -37,6 +37,9 @@ dilithium_signature_t* dap_enc_dilithium_read_signature(uint8_t *a_buf, size_t a uint8_t* dap_enc_dilithium_write_private_key(const dilithium_private_key_t* a_private_key, size_t *a_buflen_out); uint8_t* dap_enc_dilithium_write_public_key(const dilithium_public_key_t* a_public_key, size_t *a_buflen_out); dilithium_private_key_t* dap_enc_dilithium_read_private_key(const uint8_t *a_buf, size_t a_buflen); +dilithium_private_key_t* dap_enc_dilithium_read_private_key_old(const uint8_t *a_buf, size_t a_buflen); + dilithium_public_key_t* dap_enc_dilithium_read_public_key(const uint8_t *a_buf, size_t a_buflen); +dilithium_public_key_t* dap_enc_dilithium_read_public_key_old(const uint8_t *a_buf, size_t a_buflen); #endif diff --git a/dap-sdk/crypto/include/dap_enc_key.h b/dap-sdk/crypto/include/dap_enc_key.h index 42711803e7..9bbfeab50d 100755 --- a/dap-sdk/crypto/include/dap_enc_key.h +++ b/dap-sdk/crypto/include/dap_enc_key.h @@ -255,6 +255,7 @@ uint8_t* dap_enc_key_serealize_priv_key(dap_enc_key_t *a_key, size_t *a_buflen_o uint8_t* dap_enc_key_serealize_pub_key(dap_enc_key_t *a_key, size_t *a_buflen_out); int dap_enc_key_deserealize_priv_key(dap_enc_key_t *a_key, const uint8_t *a_buf, size_t a_buflen); int dap_enc_key_deserealize_pub_key(dap_enc_key_t *a_key, const uint8_t *a_buf, size_t a_buflen); +int dap_enc_key_deserealize_pub_key_old(dap_enc_key_t *a_key, const uint8_t *a_buf, size_t a_buflen); dap_enc_key_serealize_t* dap_enc_key_serealize(dap_enc_key_t * key); dap_enc_key_t* dap_enc_key_deserealize(const void *buf, size_t buf_size); diff --git a/dap-sdk/crypto/src/dap_enc_dilithium.c b/dap-sdk/crypto/src/dap_enc_dilithium.c index b8509aabdf..bbcabca778 100755 --- a/dap-sdk/crypto/src/dap_enc_dilithium.c +++ b/dap-sdk/crypto/src/dap_enc_dilithium.c @@ -10,6 +10,10 @@ static enum DAP_DILITHIUM_SIGN_SECURITY _dilithium_type = DILITHIUM_MIN_SIZE; // by default +//// WARNING! Its because of accident with wrong sizes on mobile 32bit platforms +//// Remove it after you'll update all mobile keys + + void dap_enc_sig_dilithium_set_type(enum DAP_DILITHIUM_SIGN_SECURITY type) { _dilithium_type = type; @@ -114,12 +118,12 @@ uint8_t* dap_enc_dilithium_write_signature(dilithium_signature_t* a_sign, size_t size_t l_buflen = dap_enc_dilithium_calc_signagture_size(a_sign); uint8_t *l_buf = DAP_NEW_SIZE(uint8_t, l_buflen); - memcpy(l_buf, &l_buflen, sizeof(size_t)); - l_shift_mem += sizeof(size_t); + memcpy(l_buf, &l_buflen, sizeof(uint64_t)); + l_shift_mem += sizeof(uint64_t); memcpy(l_buf + l_shift_mem, &a_sign->kind, sizeof(dilithium_kind_t)); l_shift_mem += sizeof(dilithium_kind_t); memcpy(l_buf + l_shift_mem, &a_sign->sig_len, sizeof(unsigned long long)); - l_shift_mem += sizeof(unsigned long long); + l_shift_mem += sizeof(uint64_t); memcpy(l_buf + l_shift_mem, a_sign->sig_data, a_sign->sig_len ); l_shift_mem += a_sign->sig_len ; @@ -131,12 +135,43 @@ uint8_t* dap_enc_dilithium_write_signature(dilithium_signature_t* a_sign, size_t /* Deserialize a signature */ dilithium_signature_t* dap_enc_dilithium_read_signature(uint8_t *a_buf, size_t a_buflen) { - if( !a_buf || (a_buflen < (sizeof(size_t) + sizeof(dilithium_kind_t)) ) ) + if( !a_buf || (a_buflen < (sizeof(uint64_t) + sizeof(dilithium_kind_t)) ) ) return NULL ; dilithium_kind_t kind; - size_t l_buflen_internal = 0; - memcpy(&l_buflen_internal, a_buf, sizeof(size_t)); - memcpy(&kind, a_buf + sizeof(size_t), sizeof(dilithium_kind_t)); + uint64_t l_buflen_internal = 0; + memcpy(&l_buflen_internal, a_buf, sizeof(uint64_t)); + memcpy(&kind, a_buf + sizeof(uint64_t), sizeof(dilithium_kind_t)); + if(l_buflen_internal != a_buflen) + return NULL ; + dilithium_param_t p; + if(!dilithium_params_init(&p, kind)) + return NULL ; + + dilithium_signature_t* l_sign = DAP_NEW(dilithium_signature_t); + l_sign->kind = kind; + uint64_t l_shift_mem = sizeof(uint64_t) + sizeof(dilithium_kind_t); + memcpy(&l_sign->sig_len, a_buf + l_shift_mem, sizeof(uint64_t)); + l_shift_mem += sizeof(uint64_t); + l_sign->sig_data = DAP_NEW_SIZE(unsigned char, l_sign->sig_len); + memcpy(l_sign->sig_data, a_buf + l_shift_mem, l_sign->sig_len); + l_shift_mem += l_sign->sig_len; + return l_sign; +} + +/** + * @brief dap_enc_dilithium_read_signature + * @param a_buf + * @param a_buflen + * @return + */ +dilithium_signature_t* dap_enc_dilithium_read_signature_old(uint8_t *a_buf, size_t a_buflen) +{ + if( !a_buf || (a_buflen < (sizeof(uint32_t) + sizeof(dilithium_kind_t)) ) ) + return NULL ; + dilithium_kind_t kind; + uint32_t l_buflen_internal = 0; + memcpy(&l_buflen_internal, a_buf, sizeof(uint32_t)); + memcpy(&kind, a_buf + sizeof(uint32_t), sizeof(dilithium_kind_t)); if(l_buflen_internal != a_buflen) return NULL ; dilithium_param_t p; @@ -154,6 +189,7 @@ dilithium_signature_t* dap_enc_dilithium_read_signature(uint8_t *a_buf, size_t a return l_sign; } + /* Serialize a private key. */ uint8_t* dap_enc_dilithium_write_private_key(const dilithium_private_key_t* a_private_key, size_t *a_buflen_out) { @@ -178,11 +214,11 @@ uint8_t* dap_enc_dilithium_write_public_key(const dilithium_public_key_t* a_publ if(!dilithium_params_init(&p, a_public_key->kind)) return NULL; - size_t l_buflen = sizeof(size_t) + sizeof(dilithium_kind_t) + p.CRYPTO_PUBLICKEYBYTES; + uint64_t l_buflen = sizeof(uint64_t) + sizeof(dilithium_kind_t) + p.CRYPTO_PUBLICKEYBYTES; uint8_t *l_buf = DAP_NEW_SIZE(uint8_t, l_buflen); - memcpy(l_buf, &l_buflen, sizeof(size_t)); - memcpy(l_buf + sizeof(size_t), &a_public_key->kind, sizeof(dilithium_kind_t)); - memcpy(l_buf + sizeof(size_t) + sizeof(dilithium_kind_t), a_public_key->data, p.CRYPTO_PUBLICKEYBYTES); + memcpy(l_buf, &l_buflen, sizeof(uint64_t)); + memcpy(l_buf + sizeof(uint64_t), &a_public_key->kind, sizeof(dilithium_kind_t)); + memcpy(l_buf + sizeof(uint64_t) + sizeof(dilithium_kind_t), a_public_key->data, p.CRYPTO_PUBLICKEYBYTES); if(a_buflen_out) *a_buflen_out = l_buflen; return l_buf; @@ -191,12 +227,34 @@ uint8_t* dap_enc_dilithium_write_public_key(const dilithium_public_key_t* a_publ /* Deserialize a private key. */ dilithium_private_key_t* dap_enc_dilithium_read_private_key(const uint8_t *a_buf, size_t a_buflen) { - if(!a_buf || a_buflen < (sizeof(size_t) + sizeof(dilithium_kind_t))) + if(!a_buf || a_buflen < (sizeof(uint64_t) + sizeof(dilithium_kind_t))) + return NULL; + dilithium_kind_t kind; + uint64_t l_buflen = 0; + memcpy(&l_buflen, a_buf, sizeof(uint64_t)); + memcpy(&kind, a_buf + sizeof(uint64_t), sizeof(dilithium_kind_t)); + if(l_buflen != a_buflen) + return NULL; + dilithium_param_t p; + if(!dilithium_params_init(&p, kind)) + return NULL; + dilithium_private_key_t* l_private_key = DAP_NEW(dilithium_private_key_t); + l_private_key->kind = kind; + + l_private_key->data = DAP_NEW_SIZE(unsigned char, p.CRYPTO_SECRETKEYBYTES); + memcpy(l_private_key->data, a_buf + sizeof(uint64_t) + sizeof(dilithium_kind_t), p.CRYPTO_SECRETKEYBYTES); + return l_private_key; +} + +/* Deserialize a private key. */ +dilithium_private_key_t* dap_enc_dilithium_read_private_key_old(const uint8_t *a_buf, size_t a_buflen) +{ + if(!a_buf || a_buflen < (sizeof(uint32_t) + sizeof(dilithium_kind_t))) return NULL; dilithium_kind_t kind; - size_t l_buflen = 0; - memcpy(&l_buflen, a_buf, sizeof(size_t)); - memcpy(&kind, a_buf + sizeof(size_t), sizeof(dilithium_kind_t)); + uint32_t l_buflen = 0; + memcpy(&l_buflen, a_buf, sizeof(uint32_t)); + memcpy(&kind, a_buf + sizeof(uint32_t), sizeof(dilithium_kind_t)); if(l_buflen != a_buflen) return NULL; dilithium_param_t p; @@ -206,19 +264,46 @@ dilithium_private_key_t* dap_enc_dilithium_read_private_key(const uint8_t *a_buf l_private_key->kind = kind; l_private_key->data = DAP_NEW_SIZE(unsigned char, p.CRYPTO_SECRETKEYBYTES); - memcpy(l_private_key->data, a_buf + sizeof(size_t) + sizeof(dilithium_kind_t), p.CRYPTO_SECRETKEYBYTES); + memcpy(l_private_key->data, a_buf + sizeof(uint32_t) + sizeof(dilithium_kind_t), p.CRYPTO_SECRETKEYBYTES); return l_private_key; } /* Deserialize a public key. */ dilithium_public_key_t* dap_enc_dilithium_read_public_key(const uint8_t *a_buf, size_t a_buflen) { - if(!a_buf || a_buflen < (sizeof(size_t) + sizeof(dilithium_kind_t))) + if(!a_buf || a_buflen < (sizeof(uint64_t) + sizeof(dilithium_kind_t))) + return NULL; + dilithium_kind_t kind; + uint64_t l_buflen = 0; + memcpy(&l_buflen, a_buf, sizeof(uint64_t)); + memcpy(&kind, a_buf + sizeof(uint64_t), sizeof(dilithium_kind_t)); + if(l_buflen != a_buflen) + return NULL; + dilithium_param_t p; + if(!dilithium_params_init(&p, kind)) + return NULL; + dilithium_public_key_t* l_public_key = DAP_NEW_Z(dilithium_public_key_t); + l_public_key->kind = kind; + + l_public_key->data = DAP_NEW_Z_SIZE(unsigned char, p.CRYPTO_PUBLICKEYBYTES); + memcpy(l_public_key->data, a_buf + sizeof(uint64_t) + sizeof(dilithium_kind_t), p.CRYPTO_PUBLICKEYBYTES); + return l_public_key; +} + +/** + * @brief dap_enc_dilithium_read_public_key_old + * @param a_buf + * @param a_buflen + * @return + */ +dilithium_public_key_t* dap_enc_dilithium_read_public_key_old(const uint8_t *a_buf, size_t a_buflen) +{ + if(!a_buf || a_buflen < (sizeof(uint32_t) + sizeof(dilithium_kind_t))) return NULL; dilithium_kind_t kind; - size_t l_buflen = 0; - memcpy(&l_buflen, a_buf, sizeof(size_t)); - memcpy(&kind, a_buf + sizeof(size_t), sizeof(dilithium_kind_t)); + uint32_t l_buflen = 0; + memcpy(&l_buflen, a_buf, sizeof(uint32_t)); + memcpy(&kind, a_buf + sizeof(uint32_t), sizeof(dilithium_kind_t)); if(l_buflen != a_buflen) return NULL; dilithium_param_t p; @@ -228,6 +313,6 @@ dilithium_public_key_t* dap_enc_dilithium_read_public_key(const uint8_t *a_buf, l_public_key->kind = kind; l_public_key->data = DAP_NEW_Z_SIZE(unsigned char, p.CRYPTO_PUBLICKEYBYTES); - memcpy(l_public_key->data, a_buf + sizeof(size_t) + sizeof(dilithium_kind_t), p.CRYPTO_PUBLICKEYBYTES); + memcpy(l_public_key->data, a_buf + sizeof(uint32_t) + sizeof(dilithium_kind_t), p.CRYPTO_PUBLICKEYBYTES); return l_public_key; } diff --git a/dap-sdk/crypto/src/dap_enc_key.c b/dap-sdk/crypto/src/dap_enc_key.c index a04f827079..c65be02244 100755 --- a/dap-sdk/crypto/src/dap_enc_key.c +++ b/dap-sdk/crypto/src/dap_enc_key.c @@ -550,6 +550,62 @@ int dap_enc_key_deserealize_priv_key(dap_enc_key_t *a_key, const uint8_t *a_buf, return 0; } +int dap_enc_key_deserealize_pub_key_old(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_old(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_deserealize_pub_key * diff --git a/dap-sdk/crypto/src/sig_dilithium/dilithium_params.h b/dap-sdk/crypto/src/sig_dilithium/dilithium_params.h index b7294dea8d..ef2ee73619 100755 --- a/dap-sdk/crypto/src/sig_dilithium/dilithium_params.h +++ b/dap-sdk/crypto/src/sig_dilithium/dilithium_params.h @@ -27,7 +27,7 @@ ///======================================================================== /* Names for the four varieties of Dilithium */ -typedef enum { MODE_0, MODE_1, MODE_2, MODE_3 } dilithium_kind_t; +typedef enum { MODE_0, MODE_1, MODE_2, MODE_3 } __attribute__((aligned(4))) dilithium_kind_t; typedef struct { dilithium_kind_t kind; /* the kind of Dilithium (i.e. *this* choice of parameters) */ -- GitLab