From 85e688a3a7d81f7917481e9f40bca010757a2842 Mon Sep 17 00:00:00 2001 From: root <root@p.const-desktop> Date: Thu, 3 Oct 2019 15:46:01 +0300 Subject: [PATCH] Rollback to non-XKCP algos --- include/dap_crypto_common.h | 6 +- src/dap_enc_iaes.c | 12 +- src/iaes/iaes256_cbc_cernal.c | 1 - src/msrln/kex.c | 20 +- src/msrln/random.c | 19 +- src/sha3/fips202.c | 587 +++++++++++++++++++++++++++++ src/sha3/fips202.h | 2 - src/sha3/sha3.pri | 5 +- src/sig_bliss/bliss_b.h | 6 +- src/sig_bliss/bliss_b_signatures.c | 12 +- src/sig_bliss/entropy.c | 3 +- src/sig_tesla/poly.c | 12 +- src/sig_tesla/sample.c | 60 +-- 13 files changed, 666 insertions(+), 79 deletions(-) create mode 100644 src/sha3/fips202.c diff --git a/include/dap_crypto_common.h b/include/dap_crypto_common.h index ec7f385..f213209 100755 --- a/include/dap_crypto_common.h +++ b/include/dap_crypto_common.h @@ -15,9 +15,9 @@ extern "C" { #include "sha3/fips202.h" -#include "KeccakHash.h" -#include "SimpleFIPS202.h" -#include "SP800-185.h" +//#include "KeccakHash.h" +//#include "SimpleFIPS202.h" +//#include "SP800-185.h" #include "rand/dap_rand.h" diff --git a/src/dap_enc_iaes.c b/src/dap_enc_iaes.c index bdd4a25..a3636d4 100755 --- a/src/dap_enc_iaes.c +++ b/src/dap_enc_iaes.c @@ -3,10 +3,10 @@ #include <string.h> #include "dap_enc_key.h" #include "dap_enc_iaes.h" -//#include "sha3/fips202.h" +#include "sha3/fips202.h" -#include "KeccakHash.h" -#include "SimpleFIPS202.h" +//#include "KeccakHash.h" +//#include "SimpleFIPS202.h" #include "dap_common.h" @@ -56,8 +56,10 @@ void dap_enc_aes_key_generate(struct dap_enc_key * a_key, const void *kex_buf, memcpy(id_concat_kex,seed, seed_size); memcpy(id_concat_kex + seed_size, kex_buf, kex_size); - SHAKE256(a_key->priv_key_data, IAES_KEYSIZE, id_concat_kex, (kex_size + seed_size)); - SHAKE128(DAP_ENC_AES_KEY(a_key)->ivec, IAES_BLOCK_SIZE, seed, seed_size); + //SHAKE256(a_key->priv_key_data, IAES_KEYSIZE, id_concat_kex, (kex_size + seed_size)); + //SHAKE128(DAP_ENC_AES_KEY(a_key)->ivec, IAES_BLOCK_SIZE, seed, seed_size); + shake256(a_key->priv_key_data, IAES_KEYSIZE, id_concat_kex, (kex_size + seed_size)); + shake128(DAP_ENC_AES_KEY(a_key)->ivec, IAES_BLOCK_SIZE, seed, seed_size); free(id_concat_kex); } diff --git a/src/iaes/iaes256_cbc_cernal.c b/src/iaes/iaes256_cbc_cernal.c index a7eef85..da86720 100755 --- a/src/iaes/iaes256_cbc_cernal.c +++ b/src/iaes/iaes256_cbc_cernal.c @@ -490,7 +490,6 @@ size_t IAES_256_CBC_decrypt(const uint8_t *cdata, uint8_t *data, uint8_t *ivec, size_t i, padding = 0; size_t end = length > 16 ? length - 16 : 0; - if(length>0) for(i = length-1; i >= end; i--) { if(data[i] == 0) diff --git a/src/msrln/kex.c b/src/msrln/kex.c index 41574b2..6dffe22 100755 --- a/src/msrln/kex.c +++ b/src/msrln/kex.c @@ -5,8 +5,8 @@ #include <malloc.h> #endif -#include "KeccakHash.h" -#include "SimpleFIPS202.h" +//#include "KeccakHash.h" +//#include "SimpleFIPS202.h" // N^-1 * prime_scale^-8 @@ -467,22 +467,22 @@ CRYPTO_MSRLN_STATUS generate_a(uint32_t* a, const unsigned char* seed, Extendabl uint16_t val; unsigned int nblocks = 16; uint8_t buf[SHAKE128_RATE * 16]; // was * nblocks, but VS doesn't like this buf init - Keccak_HashInstance ks; + //Keccak_HashInstance ks; -// uint64_t state[SHA3_STATESIZE] = {0}; -// shake128_absorb(state, seed, SEED_BYTES); -// shake128_squeezeblocks((unsigned char *) buf, nblocks, state); + uint64_t state[SHA3_STATESIZE] = {0}; + shake128_absorb(state, seed, SEED_BYTES); + shake128_squeezeblocks((unsigned char *) buf, nblocks, state); /*#ifdef _WIN32 SHAKE128_InitAbsorb( &ks, seed, SEED_BYTES ); KECCAK_HashSqueeze( &ks, (unsigned char *) buf, nblocks * 8 ); - #else */ + #else Keccak_HashInitialize_SHAKE128(&ks); Keccak_HashUpdate( &ks, seed, SEED_BYTES * 8 ); Keccak_HashFinal( &ks, seed ); Keccak_HashSqueeze( &ks, (unsigned char *) buf, nblocks * 8 * 8 ); //#endif - + */ while (ctr < PARAMETER_N) { val = (buf[pos] | ((uint16_t) buf[pos + 1] << 8)) & 0x3fff; if (val < PARAMETER_Q) { @@ -491,8 +491,8 @@ CRYPTO_MSRLN_STATUS generate_a(uint32_t* a, const unsigned char* seed, Extendabl pos += 2; if (pos > SHAKE128_RATE * nblocks - 2) { nblocks = 1; -// shake128_squeezeblocks((unsigned char *) buf, nblocks, state); - Keccak_HashSqueeze( &ks, (unsigned char *) buf, nblocks * 8 * 8 ); + shake128_squeezeblocks((unsigned char *) buf, nblocks, state); +// Keccak_HashSqueeze( &ks, (unsigned char *) buf, nblocks * 8 * 8 ); pos = 0; } } diff --git a/src/msrln/random.c b/src/msrln/random.c index d25bf72..ab2b129 100755 --- a/src/msrln/random.c +++ b/src/msrln/random.c @@ -1,6 +1,6 @@ #include "msrln_priv.h" -#include "KeccakHash.h" +//#include "KeccakHash.h" //#include "SimpleFIPS202.h" #define LOG_TAG "RANDOM" @@ -12,16 +12,16 @@ CRYPTO_MSRLN_STATUS MSRLN_generate_a(const unsigned char* seed, unsigned int see uint16_t val; unsigned int nblocks = 16; uint8_t buf[SHAKE128_RATE * 16]; // was * nblocks, but VS doesn't like this buf init - Keccak_HashInstance ks; + //Keccak_HashInstance ks; -// uint64_t state[SHA3_STATESIZE]; -// shake128_absorb(state, seed, seed_nbytes); -// shake128_squeezeblocks((unsigned char *) buf, nblocks, state); + uint64_t state[SHA3_STATESIZE]; + shake128_absorb(state, seed, seed_nbytes); + shake128_squeezeblocks((unsigned char *) buf, nblocks, state); - Keccak_HashInitialize_SHAKE128(&ks); + /*Keccak_HashInitialize_SHAKE128(&ks); Keccak_HashUpdate( &ks, seed, seed_nbytes * 8 ); Keccak_HashFinal( &ks, seed ); - Keccak_HashSqueeze( &ks, (unsigned char *) buf, nblocks * 8 * 8 ); + Keccak_HashSqueeze( &ks, (unsigned char *) buf, nblocks * 8 * 8 );*/ while (ctr < array_ndigits) { val = (buf[pos] | ((uint16_t) buf[pos + 1] << 8)) & 0x3fff; @@ -31,12 +31,11 @@ CRYPTO_MSRLN_STATUS MSRLN_generate_a(const unsigned char* seed, unsigned int see pos += 2; if (pos > SHAKE128_RATE * nblocks - 2) { nblocks = 1; -// shake128_squeezeblocks((unsigned char *) buf, nblocks, state); - Keccak_HashSqueeze( &ks, (unsigned char *) buf, nblocks * 8 * 8 ); + shake128_squeezeblocks((unsigned char *) buf, nblocks, state); +// Keccak_HashSqueeze( &ks, (unsigned char *) buf, nblocks * 8 * 8 ); pos = 0; } } - return CRYPTO_MSRLN_SUCCESS; } diff --git a/src/sha3/fips202.c b/src/sha3/fips202.c new file mode 100644 index 0000000..022be71 --- /dev/null +++ b/src/sha3/fips202.c @@ -0,0 +1,587 @@ +/******************************************************************************************** +* SHA3-derived functions: SHAKE and cSHAKE +* +* Based on the public domain implementation in crypto_hash/keccakc512/simple/ +* from http://bench.cr.yp.to/supercop.html by Ronny Van Keer +* and the public domain "TweetFips202" implementation from https://twitter.com/tweetfips202 +* by Gilles Van Assche, Daniel J. Bernstein, and Peter Schwabe +* +* See NIST Special Publication 800-185 for more information: +* http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-185.pdf +* +*********************************************************************************************/ + +#include <stdint.h> +#include <assert.h> +#include "fips202.h" + +#define NROUNDS 24 +#define ROL(a, offset) ((a << offset) ^ (a >> (64-offset))) + + +static uint64_t load64(const unsigned char *x) +{ + unsigned long long r = 0, i; + + for (i = 0; i < 8; ++i) { + r |= (unsigned long long)x[i] << 8 * i; + } + return r; +} + + +static void store64(uint8_t *x, uint64_t u) +{ + unsigned int i; + + for (i = 0; i < 8; ++i) { + x[i] = (uint8_t)u; + u >>= 8; + } +} + + +static const uint64_t KeccakF_RoundConstants[NROUNDS] = +{ + (uint64_t)0x0000000000000001ULL, + (uint64_t)0x0000000000008082ULL, + (uint64_t)0x800000000000808aULL, + (uint64_t)0x8000000080008000ULL, + (uint64_t)0x000000000000808bULL, + (uint64_t)0x0000000080000001ULL, + (uint64_t)0x8000000080008081ULL, + (uint64_t)0x8000000000008009ULL, + (uint64_t)0x000000000000008aULL, + (uint64_t)0x0000000000000088ULL, + (uint64_t)0x0000000080008009ULL, + (uint64_t)0x000000008000000aULL, + (uint64_t)0x000000008000808bULL, + (uint64_t)0x800000000000008bULL, + (uint64_t)0x8000000000008089ULL, + (uint64_t)0x8000000000008003ULL, + (uint64_t)0x8000000000008002ULL, + (uint64_t)0x8000000000000080ULL, + (uint64_t)0x000000000000800aULL, + (uint64_t)0x800000008000000aULL, + (uint64_t)0x8000000080008081ULL, + (uint64_t)0x8000000000008080ULL, + (uint64_t)0x0000000080000001ULL, + (uint64_t)0x8000000080008008ULL +}; + + +void KeccakF1600_StatePermute(uint64_t * state) +{ + int round; + + uint64_t Aba, Abe, Abi, Abo, Abu; + uint64_t Aga, Age, Agi, Ago, Agu; + uint64_t Aka, Ake, Aki, Ako, Aku; + uint64_t Ama, Ame, Ami, Amo, Amu; + uint64_t Asa, Ase, Asi, Aso, Asu; + uint64_t BCa, BCe, BCi, BCo, BCu; + uint64_t Da, De, Di, Do, Du; + uint64_t Eba, Ebe, Ebi, Ebo, Ebu; + uint64_t Ega, Ege, Egi, Ego, Egu; + uint64_t Eka, Eke, Eki, Eko, Eku; + uint64_t Ema, Eme, Emi, Emo, Emu; + uint64_t Esa, Ese, Esi, Eso, Esu; + + //copyFromState(A, state) + Aba = state[ 0]; + Abe = state[ 1]; + Abi = state[ 2]; + Abo = state[ 3]; + Abu = state[ 4]; + Aga = state[ 5]; + Age = state[ 6]; + Agi = state[ 7]; + Ago = state[ 8]; + Agu = state[ 9]; + Aka = state[10]; + Ake = state[11]; + Aki = state[12]; + Ako = state[13]; + Aku = state[14]; + Ama = state[15]; + Ame = state[16]; + Ami = state[17]; + Amo = state[18]; + Amu = state[19]; + Asa = state[20]; + Ase = state[21]; + Asi = state[22]; + Aso = state[23]; + Asu = state[24]; + + for( round = 0; round < NROUNDS; round += 2 ) + { + // prepareTheta + BCa = Aba^Aga^Aka^Ama^Asa; + BCe = Abe^Age^Ake^Ame^Ase; + BCi = Abi^Agi^Aki^Ami^Asi; + BCo = Abo^Ago^Ako^Amo^Aso; + BCu = Abu^Agu^Aku^Amu^Asu; + + //thetaRhoPiChiIotaPrepareTheta(round , A, E) + Da = BCu^ROL(BCe, 1); + De = BCa^ROL(BCi, 1); + Di = BCe^ROL(BCo, 1); + Do = BCi^ROL(BCu, 1); + Du = BCo^ROL(BCa, 1); + + Aba ^= Da; + BCa = Aba; + Age ^= De; + BCe = ROL(Age, 44); + Aki ^= Di; + BCi = ROL(Aki, 43); + Amo ^= Do; + BCo = ROL(Amo, 21); + Asu ^= Du; + BCu = ROL(Asu, 14); + Eba = BCa ^((~BCe)& BCi ); + Eba ^= (uint64_t)KeccakF_RoundConstants[round]; + Ebe = BCe ^((~BCi)& BCo ); + Ebi = BCi ^((~BCo)& BCu ); + Ebo = BCo ^((~BCu)& BCa ); + Ebu = BCu ^((~BCa)& BCe ); + + Abo ^= Do; + BCa = ROL(Abo, 28); + Agu ^= Du; + BCe = ROL(Agu, 20); + Aka ^= Da; + BCi = ROL(Aka, 3); + Ame ^= De; + BCo = ROL(Ame, 45); + Asi ^= Di; + BCu = ROL(Asi, 61); + Ega = BCa ^((~BCe)& BCi ); + Ege = BCe ^((~BCi)& BCo ); + Egi = BCi ^((~BCo)& BCu ); + Ego = BCo ^((~BCu)& BCa ); + Egu = BCu ^((~BCa)& BCe ); + + Abe ^= De; + BCa = ROL(Abe, 1); + Agi ^= Di; + BCe = ROL(Agi, 6); + Ako ^= Do; + BCi = ROL(Ako, 25); + Amu ^= Du; + BCo = ROL(Amu, 8); + Asa ^= Da; + BCu = ROL(Asa, 18); + Eka = BCa ^((~BCe)& BCi ); + Eke = BCe ^((~BCi)& BCo ); + Eki = BCi ^((~BCo)& BCu ); + Eko = BCo ^((~BCu)& BCa ); + Eku = BCu ^((~BCa)& BCe ); + + Abu ^= Du; + BCa = ROL(Abu, 27); + Aga ^= Da; + BCe = ROL(Aga, 36); + Ake ^= De; + BCi = ROL(Ake, 10); + Ami ^= Di; + BCo = ROL(Ami, 15); + Aso ^= Do; + BCu = ROL(Aso, 56); + Ema = BCa ^((~BCe)& BCi ); + Eme = BCe ^((~BCi)& BCo ); + Emi = BCi ^((~BCo)& BCu ); + Emo = BCo ^((~BCu)& BCa ); + Emu = BCu ^((~BCa)& BCe ); + + Abi ^= Di; + BCa = ROL(Abi, 62); + Ago ^= Do; + BCe = ROL(Ago, 55); + Aku ^= Du; + BCi = ROL(Aku, 39); + Ama ^= Da; + BCo = ROL(Ama, 41); + Ase ^= De; + BCu = ROL(Ase, 2); + Esa = BCa ^((~BCe)& BCi ); + Ese = BCe ^((~BCi)& BCo ); + Esi = BCi ^((~BCo)& BCu ); + Eso = BCo ^((~BCu)& BCa ); + Esu = BCu ^((~BCa)& BCe ); + + // prepareTheta + BCa = Eba^Ega^Eka^Ema^Esa; + BCe = Ebe^Ege^Eke^Eme^Ese; + BCi = Ebi^Egi^Eki^Emi^Esi; + BCo = Ebo^Ego^Eko^Emo^Eso; + BCu = Ebu^Egu^Eku^Emu^Esu; + + //thetaRhoPiChiIotaPrepareTheta(round+1, E, A) + Da = BCu^ROL(BCe, 1); + De = BCa^ROL(BCi, 1); + Di = BCe^ROL(BCo, 1); + Do = BCi^ROL(BCu, 1); + Du = BCo^ROL(BCa, 1); + + Eba ^= Da; + BCa = Eba; + Ege ^= De; + BCe = ROL(Ege, 44); + Eki ^= Di; + BCi = ROL(Eki, 43); + Emo ^= Do; + BCo = ROL(Emo, 21); + Esu ^= Du; + BCu = ROL(Esu, 14); + Aba = BCa ^((~BCe)& BCi ); + Aba ^= (uint64_t)KeccakF_RoundConstants[round+1]; + Abe = BCe ^((~BCi)& BCo ); + Abi = BCi ^((~BCo)& BCu ); + Abo = BCo ^((~BCu)& BCa ); + Abu = BCu ^((~BCa)& BCe ); + + Ebo ^= Do; + BCa = ROL(Ebo, 28); + Egu ^= Du; + BCe = ROL(Egu, 20); + Eka ^= Da; + BCi = ROL(Eka, 3); + Eme ^= De; + BCo = ROL(Eme, 45); + Esi ^= Di; + BCu = ROL(Esi, 61); + Aga = BCa ^((~BCe)& BCi ); + Age = BCe ^((~BCi)& BCo ); + Agi = BCi ^((~BCo)& BCu ); + Ago = BCo ^((~BCu)& BCa ); + Agu = BCu ^((~BCa)& BCe ); + + Ebe ^= De; + BCa = ROL(Ebe, 1); + Egi ^= Di; + BCe = ROL(Egi, 6); + Eko ^= Do; + BCi = ROL(Eko, 25); + Emu ^= Du; + BCo = ROL(Emu, 8); + Esa ^= Da; + BCu = ROL(Esa, 18); + Aka = BCa ^((~BCe)& BCi ); + Ake = BCe ^((~BCi)& BCo ); + Aki = BCi ^((~BCo)& BCu ); + Ako = BCo ^((~BCu)& BCa ); + Aku = BCu ^((~BCa)& BCe ); + + Ebu ^= Du; + BCa = ROL(Ebu, 27); + Ega ^= Da; + BCe = ROL(Ega, 36); + Eke ^= De; + BCi = ROL(Eke, 10); + Emi ^= Di; + BCo = ROL(Emi, 15); + Eso ^= Do; + BCu = ROL(Eso, 56); + Ama = BCa ^((~BCe)& BCi ); + Ame = BCe ^((~BCi)& BCo ); + Ami = BCi ^((~BCo)& BCu ); + Amo = BCo ^((~BCu)& BCa ); + Amu = BCu ^((~BCa)& BCe ); + + Ebi ^= Di; + BCa = ROL(Ebi, 62); + Ego ^= Do; + BCe = ROL(Ego, 55); + Eku ^= Du; + BCi = ROL(Eku, 39); + Ema ^= Da; + BCo = ROL(Ema, 41); + Ese ^= De; + BCu = ROL(Ese, 2); + Asa = BCa ^((~BCe)& BCi ); + Ase = BCe ^((~BCi)& BCo ); + Asi = BCi ^((~BCo)& BCu ); + Aso = BCo ^((~BCu)& BCa ); + Asu = BCu ^((~BCa)& BCe ); + } + + //copyToState(state, A) + state[ 0] = Aba; + state[ 1] = Abe; + state[ 2] = Abi; + state[ 3] = Abo; + state[ 4] = Abu; + state[ 5] = Aga; + state[ 6] = Age; + state[ 7] = Agi; + state[ 8] = Ago; + state[ 9] = Agu; + state[10] = Aka; + state[11] = Ake; + state[12] = Aki; + state[13] = Ako; + state[14] = Aku; + state[15] = Ama; + state[16] = Ame; + state[17] = Ami; + state[18] = Amo; + state[19] = Amu; + state[20] = Asa; + state[21] = Ase; + state[22] = Asi; + state[23] = Aso; + state[24] = Asu; + + #undef round +} + +#include <string.h> +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + + +static void keccak_absorb(uint64_t *s, unsigned int r, const unsigned char *m, unsigned long long int mlen, unsigned char p) +{ + unsigned long long i; + unsigned char t[200]; + + while (mlen >= r) + { + for (i = 0; i < r / 8; ++i) + s[i] ^= load64(m + 8 * i); + + KeccakF1600_StatePermute(s); + mlen -= r; + m += r; + } + + for (i = 0; i < r; ++i) + t[i] = 0; + for (i = 0; i < mlen; ++i) + t[i] = m[i]; + t[i] = p; + t[r - 1] |= 128; + for (i = 0; i < r / 8; ++i) + s[i] ^= load64(t + 8 * i); +} + + +static void keccak_squeezeblocks(unsigned char *h, unsigned long long int nblocks, uint64_t *s, unsigned int r) +{ + unsigned int i; + + while(nblocks > 0) + { + KeccakF1600_StatePermute(s); + for (i = 0; i < (r>>3); i++) + { + store64(h+8*i, s[i]); + } + h += r; + nblocks--; + } +} + + +/********** SHAKE128 ***********/ + +void shake128_absorb(uint64_t *s, const unsigned char *input, unsigned int inputByteLen) +{ + keccak_absorb(s, SHAKE128_RATE, input, inputByteLen, 0x1F); +} + + +void shake128_squeezeblocks(unsigned char *output, unsigned long long nblocks, uint64_t *s) +{ + keccak_squeezeblocks(output, nblocks, s, SHAKE128_RATE); +} + + +void shake128(unsigned char *output, unsigned long long outlen, const unsigned char *input, unsigned long long inlen) +{ + uint64_t s[25] = {0}; + unsigned char t[SHAKE128_RATE]; + unsigned long long nblocks = outlen/SHAKE128_RATE; + size_t i; + + /* Absorb input */ + keccak_absorb(s, SHAKE128_RATE, input, inlen, 0x1F); + + /* Squeeze output */ + keccak_squeezeblocks(output, nblocks, s, SHAKE128_RATE); + + output += nblocks*SHAKE128_RATE; + outlen -= nblocks*SHAKE128_RATE; + + if (outlen) + { + keccak_squeezeblocks(t, 1, s, SHAKE128_RATE); + for (i = 0; i < outlen; i++) + output[i] = t[i]; + } +} + + +/********** cSHAKE128 ***********/ + +void cshake128_simple_absorb(uint64_t s[25], uint16_t cstm, const unsigned char *in, unsigned long long inlen) +{ + unsigned char *sep = (unsigned char*)s; + + /* Absorb customization (domain-separation) string */ + sep[0] = 0x01; + sep[1] = 0xa8; + sep[2] = 0x01; + sep[3] = 0x00; + sep[4] = 0x01; + sep[5] = 16; // fixed bitlen of cstm + sep[6] = cstm & 0xff; + sep[7] = cstm >> 8; + + KeccakF1600_StatePermute(s); + + /* Absorb input */ + keccak_absorb(s, SHAKE128_RATE, in, inlen, 0x04); +} + + +void cshake128_simple_squeezeblocks(unsigned char *output, unsigned long long nblocks, uint64_t *s) +{ + keccak_squeezeblocks(output, nblocks, s, SHAKE128_RATE); +} + + +void cshake128_simple(unsigned char *output, unsigned long long outlen, uint16_t cstm, const unsigned char *in, unsigned long long inlen) +{ + uint64_t s[25] = {0}; + unsigned char t[SHAKE128_RATE]; + unsigned int i; + + cshake128_simple_absorb(s, cstm, in, inlen); + + /* Squeeze output */ + keccak_squeezeblocks(output, outlen/SHAKE128_RATE, s, SHAKE128_RATE); + output += (outlen/SHAKE128_RATE)*SHAKE128_RATE; + + if (outlen%SHAKE128_RATE) + { + keccak_squeezeblocks(t, 1, s, SHAKE128_RATE); + for (i = 0; i < outlen%SHAKE128_RATE; i++) + output[i] = t[i]; + } +} + + +/********** SHAKE256 ***********/ + +void shake256_absorb(uint64_t *s, const unsigned char *input, unsigned int inputByteLen) +{ + keccak_absorb(s, SHAKE256_RATE, input, inputByteLen, 0x1F); +} + + +void shake256_squeezeblocks(unsigned char *output, unsigned long long nblocks, uint64_t *s) +{ + keccak_squeezeblocks(output, nblocks, s, SHAKE256_RATE); +} + + +void shake256(unsigned char *output, unsigned long long outlen, const unsigned char *input, unsigned long long inlen) +{ + uint64_t s[25] = {0}; + unsigned char t[SHAKE256_RATE]; + unsigned long long nblocks = outlen/SHAKE256_RATE; + size_t i; + + /* Absorb input */ + keccak_absorb(s, SHAKE256_RATE, input, inlen, 0x1F); + + /* Squeeze output */ + keccak_squeezeblocks(output, nblocks, s, SHAKE256_RATE); + + output += nblocks*SHAKE256_RATE; + outlen -= nblocks*SHAKE256_RATE; + + if (outlen) + { + keccak_squeezeblocks(t, 1, s, SHAKE256_RATE); + for (i = 0; i < outlen; i++) + output[i] = t[i]; + } +} + + +/********** cSHAKE256 ***********/ + +void cshake256_simple_absorb(uint64_t s[25], uint16_t cstm, const unsigned char *in, unsigned long long inlen) +{ + unsigned char *sep = (unsigned char*)s; + + /* Absorb customization (domain-separation) string */ + sep[0] = 0x01; + sep[1] = 0x88; + sep[2] = 0x01; + sep[3] = 0x00; + sep[4] = 0x01; + sep[5] = 16; // fixed bitlen of cstm + sep[6] = cstm & 0xff; + sep[7] = cstm >> 8; + + KeccakF1600_StatePermute(s); + + /* Absorb input */ + keccak_absorb(s, SHAKE256_RATE, in, inlen, 0x04); +} + + +void cshake256_simple_squeezeblocks(unsigned char *output, unsigned long long nblocks, uint64_t *s) +{ + keccak_squeezeblocks(output, nblocks, s, SHAKE256_RATE); +} + + +void cshake256_simple(unsigned char *output, unsigned long long outlen, uint16_t cstm, const unsigned char *in, unsigned long long inlen) +{ + uint64_t s[25] = {0}; + unsigned char t[SHAKE256_RATE]; + unsigned int i; + + cshake256_simple_absorb(s, cstm, in, inlen); + + /* Squeeze output */ + keccak_squeezeblocks(output, outlen/SHAKE256_RATE, s, SHAKE256_RATE); + output += (outlen/SHAKE256_RATE)*SHAKE256_RATE; + + if(outlen%SHAKE256_RATE) + { + keccak_squeezeblocks(t, 1, s, SHAKE256_RATE); + for (i = 0; i < outlen%SHAKE256_RATE; i++) + output[i] = t[i]; + } +} + +void sha3_256(unsigned char *output, const unsigned char *input, unsigned int inputByteLen) +{ + uint64_t s[25] = {0}; + unsigned char t[SHA3_256_RATE]; + int i; + + keccak_absorb(s, SHA3_256_RATE, input, inputByteLen, 0x06); + keccak_squeezeblocks(t, 1, s, SHA3_256_RATE); + for(i=0;i<32;i++) + output[i] = t[i]; +} + +void sha3_512(unsigned char *output, const unsigned char *input, unsigned int inputByteLen) +{ + uint64_t s[25] = {0}; + unsigned char t[SHA3_512_RATE]; + uint32_t i; + + keccak_absorb(s, SHA3_512_RATE, input, inputByteLen, 0x06); + keccak_squeezeblocks(t, 1, s, SHA3_512_RATE); + for(i=0;i<64;i++) + output[i] = t[i]; +} + diff --git a/src/sha3/fips202.h b/src/sha3/fips202.h index 40b3fa7..5bd9cb6 100755 --- a/src/sha3/fips202.h +++ b/src/sha3/fips202.h @@ -12,7 +12,6 @@ #define SHA3_256_RATE 136 -#if 0 void shake128_absorb(uint64_t *s, const unsigned char *input, unsigned int inputByteLen); void shake128_squeezeblocks(unsigned char *output, unsigned long long nblocks, uint64_t *s); void shake128(unsigned char *output, unsigned long long outlen, const unsigned char *input, unsigned long long inlen); @@ -31,7 +30,6 @@ void cshake256_simple(unsigned char *output, unsigned long long outlen, uint16_t void sha3_256(unsigned char *output, const unsigned char *input, unsigned int inputByteLen); void sha3_512(unsigned char *output, const unsigned char *input, unsigned int inputByteLen); -#endif #endif diff --git a/src/sha3/sha3.pri b/src/sha3/sha3.pri index be9685f..b93b260 100755 --- a/src/sha3/sha3.pri +++ b/src/sha3/sha3.pri @@ -8,7 +8,8 @@ HEADERS += $$PWD/fips202.h \ $$PWD/KeccakSponge-common.h \ $$PWD/KeccakSpongeWidth1600.h -SOURCES += $$PWD/KeccakHash.c \ +SOURCES += $$PWD/fips202.c \ + $$PWD/KeccakHash.c \ $$PWD/KeccakP-1600-reference.c \ $$PWD/KeccakSpongeWidth1600.c - + \ No newline at end of file diff --git a/src/sig_bliss/bliss_b.h b/src/sig_bliss/bliss_b.h index c60800b..e00a98d 100755 --- a/src/sig_bliss/bliss_b.h +++ b/src/sig_bliss/bliss_b.h @@ -5,10 +5,10 @@ #include <stddef.h> #include <stdlib.h> #include <assert.h> -//#include "../sha3/fips202.h" +#include "sha3/fips202.h" -#include "KeccakHash.h" -#include "SimpleFIPS202.h" +//#include "KeccakHash.h" +//#include "SimpleFIPS202.h" #define BLISS_B_CRYPTO_SECRETKEYBYTES 256 #define BLISS_B_CRYPTO_PUBLICKEYBYTES 85 diff --git a/src/sig_bliss/bliss_b_signatures.c b/src/sig_bliss/bliss_b_signatures.c index 4feee4e..0e1de13 100755 --- a/src/sig_bliss/bliss_b_signatures.c +++ b/src/sig_bliss/bliss_b_signatures.c @@ -134,8 +134,8 @@ static void generateC(uint32_t *indices, uint32_t kappa, const int32_t *n_vector * (so that n_vector[n-1] is taken into account). */ hash[hash_sz - 1]++; - SHA3_512(whash, hash, hash_sz); - + //SHA3_512(whash, hash, hash_sz); + sha3_512(whash, hash, hash_sz); memset(array, 0, n); if (n == 256) { @@ -474,8 +474,8 @@ int32_t bliss_b_sign(bliss_signature_t *signature, const bliss_private_key_t *p /* 0: compute the hash of the msg */ - SHA3_512(hash, msg, msg_sz); - + //SHA3_512(hash, msg, msg_sz); + sha3_512(hash, msg, msg_sz); // for debugging if (false) { printf("sign hash\n"); @@ -830,8 +830,8 @@ int32_t bliss_b_verify(const bliss_signature_t *signature, const bliss_public_k /* hash the message into the first SHA3_512_DIGEST_LENGTH bytes of the hash */ - SHA3_512(hash, msg, msg_sz); - + //SHA3_512(hash, msg, msg_sz); + sha3_512(hash, msg, msg_sz); if (false) { printf("verify hash\n"); for (i=0; i<SHA3_512_DIGEST_LENGTH; i++) { diff --git a/src/sig_bliss/entropy.c b/src/sig_bliss/entropy.c index e7fbf3d..2032eb2 100755 --- a/src/sig_bliss/entropy.c +++ b/src/sig_bliss/entropy.c @@ -23,7 +23,8 @@ static void refresh(entropy_t *entropy, uint8_t *hash, uint32_t n) { assert(n > 0); while (n > 0) { - SHA3_512(hash, entropy->seed, SHA3_512_DIGEST_LENGTH); + //SHA3_512(hash, entropy->seed, SHA3_512_DIGEST_LENGTH); + sha3_512(hash, entropy->seed, SHA3_512_DIGEST_LENGTH); increment_seed(entropy); hash += SHA3_512_DIGEST_LENGTH; n --; diff --git a/src/sig_tesla/poly.c b/src/sig_tesla/poly.c index 996e88a..8d2fb6f 100755 --- a/src/sig_tesla/poly.c +++ b/src/sig_tesla/poly.c @@ -182,15 +182,15 @@ void poly_uniform(poly_k *a, const unsigned char *seed, tesla_param_t *p) { unsigned char *buf = malloc(SHAKE128_RATE * nblocks * sizeof(char)); uint16_t dmsp = 0; -// cshake128_simple( buf, SHAKE128_RATE * nblocks, dmsp++, seed, CRYPTO_RANDOMBYTES); - cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, buf, SHAKE128_RATE * nblocks * 8, NULL, 0, &dmsp, 16 ); - ++ dmsp; + cshake128_simple( buf, SHAKE128_RATE * nblocks, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, buf, SHAKE128_RATE * nblocks * 8, NULL, 0, &dmsp, 16 ); +// ++ dmsp; while (i < p->PARAM_K * p->PARAM_N) { if (pos > SHAKE128_RATE * nblocks - 4 * nbytes) { nblocks = 1; -// cshake128_simple(buf, SHAKE128_RATE * nblocks, dmsp++, seed, CRYPTO_RANDOMBYTES); - cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, buf, SHAKE128_RATE * nblocks * 8, NULL, 0, &dmsp, 16 ); - ++ dmsp; + cshake128_simple(buf, SHAKE128_RATE * nblocks, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, buf, SHAKE128_RATE * nblocks * 8, NULL, 0, &dmsp, 16 ); +// ++ dmsp; pos = 0; } val1 = (*(uint32_t *) (buf + pos)) & mask; diff --git a/src/sig_tesla/sample.c b/src/sig_tesla/sample.c index a72fb90..67da29b 100755 --- a/src/sig_tesla/sample.c +++ b/src/sig_tesla/sample.c @@ -17,15 +17,15 @@ void sample_y(int64_t *y, const unsigned char *seed, int nonce, tesla_param_t *p uint32_t NBLOCKS_SHAKE = 0; if(p->kind == 0 || p->kind == 3) { -// cshake128_simple((uint8_t *) buf, p->PARAM_N * nbytes, dmsp++, seed, CRYPTO_RANDOMBYTES); - cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, p->PARAM_N * nbytes * 8, NULL, 0, &dmsp, 16 ); - ++dmsp; + cshake128_simple((uint8_t *) buf, p->PARAM_N * nbytes, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, p->PARAM_N * nbytes * 8, NULL, 0, &dmsp, 16 ); +// ++dmsp; NBLOCKS_SHAKE = SHAKE128_RATE / (((p->PARAM_B_BITS + 1) + 7) / 8); } else { -// cshake256_simple((uint8_t *) buf, p->PARAM_N * nbytes, dmsp++, seed, CRYPTO_RANDOMBYTES); - cSHAKE256( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, p->PARAM_N * nbytes * 8, NULL, 0, &dmsp, 16 ); - ++dmsp; + cshake256_simple((uint8_t *) buf, p->PARAM_N * nbytes, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cSHAKE256( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, p->PARAM_N * nbytes * 8, NULL, 0, &dmsp, 16 ); +// ++dmsp; NBLOCKS_SHAKE = SHAKE256_RATE / (((p->PARAM_B_BITS + 1) + 7) / 8); } @@ -33,15 +33,15 @@ void sample_y(int64_t *y, const unsigned char *seed, int nonce, tesla_param_t *p if (pos >= nblocks * nbytes) { if(p->kind == 0 || p->kind == 3) { nblocks = NBLOCKS_SHAKE; -// cshake128_simple((uint8_t *) buf, SHAKE128_RATE, dmsp++, seed, CRYPTO_RANDOMBYTES); - cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, SHAKE128_RATE * 8, NULL, 0, &dmsp, 16 ); - ++dmsp; + cshake128_simple((uint8_t *) buf, SHAKE128_RATE, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, SHAKE128_RATE * 8, NULL, 0, &dmsp, 16 ); +// ++dmsp; } else { nblocks = NBLOCKS_SHAKE; -// cshake256_simple((uint8_t *) buf, SHAKE256_RATE, dmsp++, seed, CRYPTO_RANDOMBYTES); - cSHAKE256( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, SHAKE256_RATE * 8, NULL, 0, &dmsp, 16 ); - ++dmsp; + cshake256_simple((uint8_t *) buf, SHAKE256_RATE, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cSHAKE256( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, SHAKE256_RATE * 8, NULL, 0, &dmsp, 16 ); +// ++dmsp; } pos = 0; } @@ -677,15 +677,15 @@ void sample_gauss_poly(int64_t *x, const unsigned char *seed, int nonce, tesla_p {0x0321020100200100LL, 0x0200010000200001LL}, }; -// cshake128_simple(seed_ex, (p->PARAM_N) * 8, dmsp++, seed, CRYPTO_RANDOMBYTES); - cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, seed_ex, (p->PARAM_N) * 8 * 8, NULL, 0, &dmsp, 16 ); - ++dmsp; + cshake128_simple(seed_ex, (p->PARAM_N) * 8, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, seed_ex, (p->PARAM_N) * 8 * 8, NULL, 0, &dmsp, 16 ); +// ++dmsp; for (x_ind = 0; x_ind < (int64_t)(p->PARAM_N); x_ind++) { if ((j + 46) > (int64_t)(p->PARAM_N)) { -// cshake128_simple((uint8_t *) buf, (p->PARAM_N) * 8, dmsp++, seed, CRYPTO_RANDOMBYTES); - cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, (p->PARAM_N) * 8 * 8, NULL, 0, &dmsp, 16 ); - ++dmsp; + cshake128_simple((uint8_t *) buf, (p->PARAM_N) * 8, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cSHAKE128( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, (p->PARAM_N) * 8 * 8, NULL, 0, &dmsp, 16 ); +// ++dmsp; j = 0; } do { @@ -772,15 +772,15 @@ void sample_gauss_poly(int64_t *x, const unsigned char *seed, int nonce, tesla_p {0x0000032102010020LL, 0x0100020001000020LL, 0x0001000002000001LL}, }; -// cshake256_simple(seed_ex, (p->PARAM_N) * 8, dmsp++, seed, CRYPTO_RANDOMBYTES); - cSHAKE256( seed, CRYPTO_RANDOMBYTES * 8, seed_ex, (p->PARAM_N) * 8 * 8, NULL, 0, &dmsp, 16 ); - ++dmsp; + cshake256_simple(seed_ex, (p->PARAM_N) * 8, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cSHAKE256( seed, CRYPTO_RANDOMBYTES * 8, seed_ex, (p->PARAM_N) * 8 * 8, NULL, 0, &dmsp, 16 ); +// ++dmsp; for (x_ind = 0; x_ind < (int64_t)(p->PARAM_N); x_ind++) { if ((j + 46) > (int64_t)(p->PARAM_N)) { -// cshake256_simple((uint8_t *) buf, (p->PARAM_N) * 8, dmsp++, seed, CRYPTO_RANDOMBYTES); - cSHAKE256( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, (p->PARAM_N) * 8 * 8, NULL, 0, &dmsp, 16 ); - ++dmsp; + cshake256_simple((uint8_t *) buf, (p->PARAM_N) * 8, dmsp++, seed, CRYPTO_RANDOMBYTES); +// cSHAKE256( seed, CRYPTO_RANDOMBYTES * 8, (uint8_t *) buf, (p->PARAM_N) * 8 * 8, NULL, 0, &dmsp, 16 ); +// ++dmsp; j = 0; } @@ -869,9 +869,9 @@ void encode_c(uint32_t *pos_list, int16_t *sign_list, unsigned char *c_bin, tesl uint16_t dmsp = 0; // Use the hash value as key to generate some randomness -// cshake128_simple(r, RLENGTH, dmsp++, c_bin, CRYPTO_RANDOMBYTES); - cSHAKE128( c_bin, CRYPTO_RANDOMBYTES * 8, r, RLENGTH * 8, NULL, 0, &dmsp, 16 ); - ++dmsp; + cshake128_simple(r, RLENGTH, dmsp++, c_bin, CRYPTO_RANDOMBYTES); +// cSHAKE128( c_bin, CRYPTO_RANDOMBYTES * 8, r, RLENGTH * 8, NULL, 0, &dmsp, 16 ); +// ++dmsp; // Use rejection sampling to determine positions to be set in the new vector for (i = 0; i < p->PARAM_N; i++) @@ -879,9 +879,9 @@ void encode_c(uint32_t *pos_list, int16_t *sign_list, unsigned char *c_bin, tesl for (i = 0; i < p->PARAM_W;) { // Sample a unique position k times. Use two bytes if (cnt > (RLENGTH - 3)) { -// cshake128_simple(r, RLENGTH, dmsp++, c_bin, CRYPTO_RANDOMBYTES); - cSHAKE128( c_bin, CRYPTO_RANDOMBYTES * 8, r, RLENGTH * 8, NULL, 0, &dmsp, 16 ); - ++dmsp; + cshake128_simple(r, RLENGTH, dmsp++, c_bin, CRYPTO_RANDOMBYTES); +// cSHAKE128( c_bin, CRYPTO_RANDOMBYTES * 8, r, RLENGTH * 8, NULL, 0, &dmsp, 16 ); +// ++dmsp; cnt = 0; } pos = (r[cnt] << 8) | (r[cnt + 1]); -- GitLab