| @@ -23,7 +23,7 @@ void decaf_255_derive_private_key ( | |||||
| keccak_strobe_t strobe; | keccak_strobe_t strobe; | ||||
| strobe_init(strobe, &STROBE_256, magic, 0); | strobe_init(strobe, &STROBE_256, magic, 0); | ||||
| strobe_key(strobe, proto, sizeof(decaf_255_symmetric_key_t)); | |||||
| strobe_fixed_key(strobe, proto, sizeof(decaf_255_symmetric_key_t)); | |||||
| strobe_prng(strobe, encoded_scalar, sizeof(encoded_scalar)); | strobe_prng(strobe, encoded_scalar, sizeof(encoded_scalar)); | ||||
| strobe_destroy(strobe); | strobe_destroy(strobe); | ||||
| @@ -109,7 +109,7 @@ decaf_255_sign_strobe ( | |||||
| /* Derive nonce */ | /* Derive nonce */ | ||||
| keccak_strobe_t strobe2; | keccak_strobe_t strobe2; | ||||
| memcpy(strobe2,strobe,sizeof(strobe2)); | memcpy(strobe2,strobe,sizeof(strobe2)); | ||||
| strobe_key(strobe2,priv->sym,sizeof(decaf_255_symmetric_key_t)); | |||||
| strobe_fixed_key(strobe2,priv->sym,sizeof(decaf_255_symmetric_key_t)); | |||||
| strobe_prng(strobe2,overkill,sizeof(overkill)); | strobe_prng(strobe2,overkill,sizeof(overkill)); | ||||
| strobe_destroy(strobe2); | strobe_destroy(strobe2); | ||||
| @@ -24,7 +24,7 @@ void decaf_448_derive_private_key ( | |||||
| keccak_strobe_t strobe; | keccak_strobe_t strobe; | ||||
| strobe_init(strobe, &STROBE_256, magic, 0); | strobe_init(strobe, &STROBE_256, magic, 0); | ||||
| strobe_key(strobe, proto, sizeof(decaf_448_symmetric_key_t)); | |||||
| strobe_fixed_key(strobe, proto, sizeof(decaf_448_symmetric_key_t)); | |||||
| strobe_prng(strobe, encoded_scalar, sizeof(encoded_scalar)); | strobe_prng(strobe, encoded_scalar, sizeof(encoded_scalar)); | ||||
| strobe_destroy(strobe); | strobe_destroy(strobe); | ||||
| @@ -110,7 +110,7 @@ decaf_448_sign_strobe ( | |||||
| /* Derive nonce */ | /* Derive nonce */ | ||||
| keccak_strobe_t strobe2; | keccak_strobe_t strobe2; | ||||
| memcpy(strobe2,strobe,sizeof(strobe2)); | memcpy(strobe2,strobe,sizeof(strobe2)); | ||||
| strobe_key(strobe2,priv->sym,sizeof(decaf_448_symmetric_key_t)); | |||||
| strobe_fixed_key(strobe2,priv->sym,sizeof(decaf_448_symmetric_key_t)); | |||||
| strobe_prng(strobe2,overkill,sizeof(overkill)); | strobe_prng(strobe2,overkill,sizeof(overkill)); | ||||
| strobe_destroy(strobe2); | strobe_destroy(strobe2); | ||||
| @@ -189,11 +189,6 @@ void spongerng_init_from_buffer ( | |||||
| size_t len, | size_t len, | ||||
| int deterministic | int deterministic | ||||
| ) NONNULL2 API_VIS; | ) NONNULL2 API_VIS; | ||||
| /* FIXME!! This interface has the opposite retval convention from other functions | |||||
| * in the library. (0=success). Should they be harmonized? | |||||
| */ | |||||
| /** | /** | ||||
| * @brief Initialize a sponge-based CSPRNG from a file. | * @brief Initialize a sponge-based CSPRNG from a file. | ||||
| * | * | ||||
| @@ -203,33 +198,27 @@ void spongerng_init_from_buffer ( | |||||
| * @param [in] deterministic If zero, allow RNG to stir in nondeterministic | * @param [in] deterministic If zero, allow RNG to stir in nondeterministic | ||||
| * data from RDRAND or RDTSC. | * data from RDRAND or RDTSC. | ||||
| * | * | ||||
| * @retval 0 Success. | |||||
| * @retval positive An error has occurred, and this was the errno. | |||||
| * @retval -1 An unknown error has occurred. | |||||
| * @retval -2 len was 0. | |||||
| * @retval DECAF_SUCCESS success. | |||||
| * @retval DECAF_FAILURE failure. | |||||
| * @note On failure, errno can be used to determine the cause. | |||||
| */ | */ | ||||
| int spongerng_init_from_file ( | |||||
| decaf_error_t spongerng_init_from_file ( | |||||
| keccak_prng_t prng, | keccak_prng_t prng, | ||||
| const char *file, | const char *file, | ||||
| size_t len, | size_t len, | ||||
| int deterministic | int deterministic | ||||
| ) NONNULL2 API_VIS WARN_UNUSED; | ) NONNULL2 API_VIS WARN_UNUSED; | ||||
| /* FIXME!! This interface has the opposite retval convention from other functions | |||||
| * in the library. (0=success). Should they be harmonized? | |||||
| */ | |||||
| /** | /** | ||||
| * @brief Initialize a nondeterministic sponge-based CSPRNG from /dev/urandom. | * @brief Initialize a nondeterministic sponge-based CSPRNG from /dev/urandom. | ||||
| * | * | ||||
| * @param [out] sponge The sponge object. | * @param [out] sponge The sponge object. | ||||
| * | * | ||||
| * @retval 0 Success. | |||||
| * @retval positive An error has occurred, and this was the errno. | |||||
| * @retval -1 An unknown error has occurred. | |||||
| * @retval DECAF_SUCCESS success. | |||||
| * @retval DECAF_FAILURE failure. | |||||
| * @note On failure, errno can be used to determine the cause. | |||||
| */ | */ | ||||
| int spongerng_init_from_dev_urandom ( | |||||
| decaf_error_t spongerng_init_from_dev_urandom ( | |||||
| keccak_prng_t prng | keccak_prng_t prng | ||||
| ) API_VIS WARN_UNUSED; | ) API_VIS WARN_UNUSED; | ||||
| @@ -312,8 +301,8 @@ STROBE_CONTROL_WORD(STROBE_CW_PRNG, 0x18, STROBE_MODE_SQUEEZE, S | |||||
| STROBE_CONTROL_WORD(STROBE_CW_SESSION_HASH, 0x19, STROBE_MODE_SQUEEZE, 0); | STROBE_CONTROL_WORD(STROBE_CW_SESSION_HASH, 0x19, STROBE_MODE_SQUEEZE, 0); | ||||
| /* Reuse for PRNG */ | /* Reuse for PRNG */ | ||||
| STROBE_CONTROL_WORD(STROBE_CW_PRNG_INITIAL_SEED, 0x10, STROBE_MODE_ABSORB, STROBE_FLAG_LENGTH_64); | |||||
| STROBE_CONTROL_WORD(STROBE_CW_PRNG_RESEED, 0x11, STROBE_MODE_ABSORB, STROBE_FLAG_LENGTH_64); | |||||
| STROBE_CONTROL_WORD(STROBE_CW_PRNG_INITIAL_SEED, 0x10, STROBE_MODE_ABSORB, STROBE_FLAG_NO_LENGTH); | |||||
| STROBE_CONTROL_WORD(STROBE_CW_PRNG_RESEED, 0x11, STROBE_MODE_ABSORB, STROBE_FLAG_NO_LENGTH); | |||||
| STROBE_CONTROL_WORD(STROBE_CW_PRNG_CPU_SEED, 0x12, STROBE_MODE_ABSORB, 0); | STROBE_CONTROL_WORD(STROBE_CW_PRNG_CPU_SEED, 0x12, STROBE_MODE_ABSORB, 0); | ||||
| STROBE_CONTROL_WORD(STROBE_CW_PRNG_USER_SEED, 0x13, STROBE_MODE_ABSORB, STROBE_FLAG_LENGTH_64); | STROBE_CONTROL_WORD(STROBE_CW_PRNG_USER_SEED, 0x13, STROBE_MODE_ABSORB, STROBE_FLAG_LENGTH_64); | ||||
| STROBE_CONTROL_WORD(STROBE_CW_PRNG_PRNG, 0x14, STROBE_MODE_SQUEEZE, STROBE_FLAG_LENGTH_64 | STROBE_FLAG_FORGET); | STROBE_CONTROL_WORD(STROBE_CW_PRNG_PRNG, 0x14, STROBE_MODE_SQUEEZE, STROBE_FLAG_LENGTH_64 | STROBE_FLAG_FORGET); | ||||
| @@ -452,18 +441,33 @@ static INLINE UNUSED void strobe_nonce ( | |||||
| } | } | ||||
| /** | /** | ||||
| * @brief Set key in strobe context. | |||||
| * @brief Set fixed key in strobe context. | |||||
| * @param [inout] The initialized strobe object. | |||||
| * @param [in] in The key. | |||||
| * @param [in] len The length of the key. | |||||
| */ | |||||
| static INLINE UNUSED void | |||||
| strobe_fixed_key ( | |||||
| keccak_strobe_t strobe, | |||||
| const unsigned char *in, | |||||
| uint16_t len | |||||
| ) { | |||||
| strobe_transact( strobe, NULL, in, len, STROBE_CW_FIXED_KEY ); | |||||
| } | |||||
| /** | |||||
| * @brief Set Diffie-Hellman key in strobe context. | |||||
| * @param [inout] The initialized strobe object. | * @param [inout] The initialized strobe object. | ||||
| * @param [in] in The key. | * @param [in] in The key. | ||||
| * @param [in] len The length of the key. | * @param [in] len The length of the key. | ||||
| */ | */ | ||||
| static INLINE UNUSED void | static INLINE UNUSED void | ||||
| strobe_key ( | |||||
| strobe_dh_key ( | |||||
| keccak_strobe_t strobe, | keccak_strobe_t strobe, | ||||
| const unsigned char *in, | const unsigned char *in, | ||||
| uint16_t len | uint16_t len | ||||
| ) { | ) { | ||||
| strobe_transact( strobe, NULL, in, len, STROBE_CW_DH_KEY ); /* FIXME: what about other kinds of keys? */ | |||||
| strobe_transact( strobe, NULL, in, len, STROBE_CW_DH_KEY ); | |||||
| } | } | ||||
| @@ -15,6 +15,7 @@ | |||||
| #include <decaf/shake.h> | #include <decaf/shake.h> | ||||
| #include <string> | #include <string> | ||||
| #include <sys/types.h> | #include <sys/types.h> | ||||
| #include <errno.h> | |||||
| /** @cond internal */ | /** @cond internal */ | ||||
| #if __cplusplus >= 201103L | #if __cplusplus >= 201103L | ||||
| @@ -167,9 +168,9 @@ public: | |||||
| inline SpongeRng( const std::string &in = "/dev/urandom", size_t len = 32, bool deterministic = false ) | inline SpongeRng( const std::string &in = "/dev/urandom", size_t len = 32, bool deterministic = false ) | ||||
| throw(RngException) | throw(RngException) | ||||
| : KeccakSponge((NOINIT())) { | : KeccakSponge((NOINIT())) { | ||||
| int ret = spongerng_init_from_file(sp,in.c_str(),len,deterministic); | |||||
| if (ret) { | |||||
| throw RngException(ret, "Couldn't load from file"); | |||||
| decaf_error_t ret = spongerng_init_from_file(sp,in.c_str(),len,deterministic); | |||||
| if (!decaf_successful(ret)) { | |||||
| throw RngException(errno, "Couldn't load from file"); | |||||
| } | } | ||||
| } | } | ||||
| @@ -205,18 +206,30 @@ public: | |||||
| keyed = false; | keyed = false; | ||||
| } | } | ||||
| /* TODO: add a key type keyword */ | |||||
| inline void key ( | |||||
| inline void fixed_key ( | |||||
| const Block &data | const Block &data | ||||
| ) throw(ProtocolException) { | ) throw(ProtocolException) { | ||||
| strobe_key(sp, data.data(), data.size()); | |||||
| strobe_fixed_key(sp, data.data(), data.size()); | |||||
| keyed = true; | keyed = true; | ||||
| } | } | ||||
| template<class T> inline void key ( | |||||
| template<class T> inline void fixed_key ( | |||||
| const Serializable<T> &data | const Serializable<T> &data | ||||
| ) throw(ProtocolException) { | ) throw(ProtocolException) { | ||||
| key(data.serialize()); | |||||
| fixed_key(data.serialize()); | |||||
| } | |||||
| inline void dh_key ( | |||||
| const Block &data | |||||
| ) throw(ProtocolException) { | |||||
| strobe_dh_key(sp, data.data(), data.size()); | |||||
| keyed = true; | |||||
| } | |||||
| template<class T> inline void dh_key ( | |||||
| const Serializable<T> &data | |||||
| ) throw(ProtocolException) { | |||||
| dh_key(data.serialize()); | |||||
| } | } | ||||
| inline void nonce(const Block &data) NOEXCEPT { | inline void nonce(const Block &data) NOEXCEPT { | ||||
| @@ -21,7 +21,6 @@ | |||||
| #include <sys/types.h> | #include <sys/types.h> | ||||
| #include <sys/stat.h> | #include <sys/stat.h> | ||||
| #include <fcntl.h> | #include <fcntl.h> | ||||
| #include <errno.h> | |||||
| #include <unistd.h> | #include <unistd.h> | ||||
| /* Subset of Mathias Panzenböck's portable endian code, public domain */ | /* Subset of Mathias Panzenböck's portable endian code, public domain */ | ||||
| @@ -292,9 +291,7 @@ static void get_cpu_entropy(uint8_t *entropy, size_t len) { | |||||
| #endif | #endif | ||||
| } | } | ||||
| static const uint16_t SPONGERNG_MAX_BLOCK_SIZE = 1<<12; /* TODO: standardize and freeze */ | |||||
| static const uint16_t SPONGERNG_FILE_BLOCK_SIZE = 1<<12; /* TODO: standardize and freeze */ | |||||
| static const char *SPONGERNG_NAME = "spongerng"; /* TODO: canonicalize name */ | |||||
| static const char *SPONGERNG_NAME = "strobe::spongerng"; /* TODO: canonicalize name */ | |||||
| void spongerng_next ( | void spongerng_next ( | ||||
| keccak_sponge_t sponge, | keccak_sponge_t sponge, | ||||
| @@ -308,12 +305,7 @@ void spongerng_next ( | |||||
| strobe_transact(sponge,NULL,cpu_entropy,sizeof(cpu_entropy),STROBE_CW_PRNG_CPU_SEED); | strobe_transact(sponge,NULL,cpu_entropy,sizeof(cpu_entropy),STROBE_CW_PRNG_CPU_SEED); | ||||
| } | } | ||||
| while (len) { | |||||
| uint16_t cando = (len > SPONGERNG_MAX_BLOCK_SIZE) ? SPONGERNG_MAX_BLOCK_SIZE : len; | |||||
| strobe_transact(sponge,out,NULL,cando,STROBE_CW_PRNG); | |||||
| out += cando; | |||||
| len -= cando; | |||||
| } | |||||
| strobe_transact(sponge,out,NULL,len,STROBE_CW_PRNG); | |||||
| } | } | ||||
| void spongerng_stir ( | void spongerng_stir ( | ||||
| @@ -321,12 +313,7 @@ void spongerng_stir ( | |||||
| const uint8_t * __restrict__ in, | const uint8_t * __restrict__ in, | ||||
| size_t len | size_t len | ||||
| ) { | ) { | ||||
| while (len) { | |||||
| uint16_t cando = (len > SPONGERNG_MAX_BLOCK_SIZE) ? SPONGERNG_MAX_BLOCK_SIZE : len; | |||||
| strobe_transact(sponge,NULL,in,cando,STROBE_CW_PRNG_USER_SEED); | |||||
| in += cando; | |||||
| len -= cando; | |||||
| } | |||||
| strobe_transact(sponge,NULL,in,len,STROBE_CW_PRNG_USER_SEED); | |||||
| } | } | ||||
| static const struct kparams_s spongerng_params = { | static const struct kparams_s spongerng_params = { | ||||
| @@ -343,34 +330,37 @@ void spongerng_init_from_buffer ( | |||||
| spongerng_stir(sponge, in, len); | spongerng_stir(sponge, in, len); | ||||
| } | } | ||||
| int spongerng_init_from_file ( | |||||
| decaf_error_t spongerng_init_from_file ( | |||||
| keccak_sponge_t sponge, | keccak_sponge_t sponge, | ||||
| const char *file, | const char *file, | ||||
| size_t len, | size_t len, | ||||
| int deterministic | int deterministic | ||||
| ) { | ) { | ||||
| strobe_init(sponge, &spongerng_params, SPONGERNG_NAME, !deterministic); | strobe_init(sponge, &spongerng_params, SPONGERNG_NAME, !deterministic); | ||||
| if (!len) return -2; | |||||
| if (!len) return DECAF_FAILURE; | |||||
| int fd = open(file, O_RDONLY); | int fd = open(file, O_RDONLY); | ||||
| if (fd < 0) return errno ? errno : -1; | |||||
| if (fd < 0) return DECAF_FAILURE; | |||||
| uint8_t buffer[SPONGERNG_FILE_BLOCK_SIZE]; | |||||
| uint8_t buffer[128]; | |||||
| int first = 1; | |||||
| while (len) { | while (len) { | ||||
| ssize_t red = read(fd, buffer, (len > sizeof(buffer)) ? sizeof(buffer) : len); | ssize_t red = read(fd, buffer, (len > sizeof(buffer)) ? sizeof(buffer) : len); | ||||
| if (red <= 0) { | if (red <= 0) { | ||||
| close(fd); | close(fd); | ||||
| return errno ? errno : -1; | |||||
| return DECAF_FAILURE; | |||||
| } | } | ||||
| spongerng_stir(sponge,buffer,red); | |||||
| strobe_transact(sponge,NULL,buffer,red, | |||||
| first ? STROBE_CW_PRNG_USER_SEED : (STROBE_CW_PRNG_USER_SEED | STROBE_FLAG_MORE)); | |||||
| len -= red; | len -= red; | ||||
| first = 0; | |||||
| }; | }; | ||||
| close(fd); | close(fd); | ||||
| return 0; | |||||
| return DECAF_SUCCESS; | |||||
| } | } | ||||
| int spongerng_init_from_dev_urandom ( | |||||
| decaf_error_t spongerng_init_from_dev_urandom ( | |||||
| keccak_sponge_t sponge | keccak_sponge_t sponge | ||||
| ) { | ) { | ||||
| return spongerng_init_from_file(sponge, "/dev/urandom", 64, 0); | return spongerng_init_from_file(sponge, "/dev/urandom", 64, 0); | ||||
| @@ -547,7 +537,7 @@ void strobe_transact ( | |||||
| uint64_t my_len = len, len_cw = (cw_flags & STROBE_FLAG_LENGTH_64) ? 10 : 4; | uint64_t my_len = len, len_cw = (cw_flags & STROBE_FLAG_LENGTH_64) ? 10 : 4; | ||||
| if (cw_flags & STROBE_FLAG_NO_LENGTH) { | if (cw_flags & STROBE_FLAG_NO_LENGTH) { | ||||
| my_len = 0; | my_len = 0; | ||||
| } else { | |||||
| } else if ((cw_flags & STROBE_FLAG_LENGTH_64)==0) { | |||||
| assert(my_len < 1<<16); | assert(my_len < 1<<16); | ||||
| } | } | ||||
| @@ -586,6 +576,7 @@ void strobe_transact ( | |||||
| len -= len_cw; /* HACK */ | len -= len_cw; /* HACK */ | ||||
| if (cw_flags & STROBE_FLAG_NO_LENGTH) len = 2*STROBE_FORGET_BYTES; | if (cw_flags & STROBE_FLAG_NO_LENGTH) len = 2*STROBE_FORGET_BYTES; | ||||
| assert(!(cw_flags & STROBE_FLAG_MORE)); | |||||
| strobe_duplex( | strobe_duplex( | ||||
| sponge, NULL, NULL, len, | sponge, NULL, NULL, len, | ||||
| @@ -615,7 +606,7 @@ void strobe_respec ( | |||||
| keccak_sponge_t sponge, | keccak_sponge_t sponge, | ||||
| const struct kparams_s *params | const struct kparams_s *params | ||||
| ) { | ) { | ||||
| uint8_t in[] = { params->rate, params->startRound }; /* TODO: nail down */ | |||||
| uint8_t in[] = { params->rate, params->startRound }; | |||||
| strobe_transact( sponge, NULL, in, sizeof(in), STROBE_CW_RESPEC_INFO ); | strobe_transact( sponge, NULL, in, sizeof(in), STROBE_CW_RESPEC_INFO ); | ||||
| strobe_transact( sponge, NULL, NULL, 0, STROBE_CW_RESPEC ); | strobe_transact( sponge, NULL, NULL, 0, STROBE_CW_RESPEC ); | ||||
| assert(sponge->params->position == 0); | assert(sponge->params->position == 0); | ||||
| @@ -171,23 +171,23 @@ static void tdh ( | |||||
| client.recv_plaintext(gye); | client.recv_plaintext(gye); | ||||
| Point pgxe(gxe); | Point pgxe(gxe); | ||||
| server.key(pgxe*ye); | |||||
| server.dh_key(pgxe*ye); | |||||
| SecureBuffer tag1 = server.produce_auth(); | SecureBuffer tag1 = server.produce_auth(); | ||||
| //SecureBuffer ct = server.encrypt(gy); | //SecureBuffer ct = server.encrypt(gy); | ||||
| server.key(pgxe*y); | |||||
| server.dh_key(pgxe*y); | |||||
| SecureBuffer tag2 = server.produce_auth(); | SecureBuffer tag2 = server.produce_auth(); | ||||
| Point pgye(gye); | Point pgye(gye); | ||||
| client.key(pgye*xe); | |||||
| client.dh_key(pgye*xe); | |||||
| client.verify_auth(tag1); | client.verify_auth(tag1); | ||||
| client.key(Point(gy) * xe); | |||||
| client.dh_key(Point(gy) * xe); | |||||
| client.verify_auth(tag2); | client.verify_auth(tag2); | ||||
| // ct = client.encrypt(gx); | // ct = client.encrypt(gx); | ||||
| client.key(pgye * x); | |||||
| client.dh_key(pgye * x); | |||||
| tag1 = client.produce_auth(); | tag1 = client.produce_auth(); | ||||
| client.respec(STROBE_KEYED_128); | client.respec(STROBE_KEYED_128); | ||||
| server.key(Point(gx) * ye); | |||||
| server.dh_key(Point(gx) * ye); | |||||
| server.verify_auth(tag1); | server.verify_auth(tag1); | ||||
| server.respec(STROBE_KEYED_128); | server.respec(STROBE_KEYED_128); | ||||
| } | } | ||||
| @@ -217,14 +217,14 @@ static void fhmqv ( | |||||
| Scalar schx(server.prng(Scalar::SER_BYTES)); | Scalar schx(server.prng(Scalar::SER_BYTES)); | ||||
| Scalar schy(server.prng(Scalar::SER_BYTES)); | Scalar schy(server.prng(Scalar::SER_BYTES)); | ||||
| Scalar yec = y + ye*schy; | Scalar yec = y + ye*schy; | ||||
| server.key(Point::double_scalarmul(Point(gx),yec,Point(gxe),yec*schx)); | |||||
| server.dh_key(Point::double_scalarmul(Point(gx),yec,Point(gxe),yec*schx)); | |||||
| SecureBuffer as = server.produce_auth(); | SecureBuffer as = server.produce_auth(); | ||||
| client.recv_plaintext(gye); | client.recv_plaintext(gye); | ||||
| Scalar cchx(client.prng(Scalar::SER_BYTES)); | Scalar cchx(client.prng(Scalar::SER_BYTES)); | ||||
| Scalar cchy(client.prng(Scalar::SER_BYTES)); | Scalar cchy(client.prng(Scalar::SER_BYTES)); | ||||
| Scalar xec = x + xe*schx; | Scalar xec = x + xe*schx; | ||||
| client.key(Point::double_scalarmul(Point(gy),xec,Point(gye),xec*schy)); | |||||
| client.dh_key(Point::double_scalarmul(Point(gy),xec,Point(gye),xec*schy)); | |||||
| client.verify_auth(as); | client.verify_auth(as); | ||||
| SecureBuffer ac = client.produce_auth(); | SecureBuffer ac = client.produce_auth(); | ||||
| client.respec(STROBE_KEYED_128); | client.respec(STROBE_KEYED_128); | ||||
| @@ -264,19 +264,19 @@ static void spake2ee( | |||||
| server.send_plaintext(gy); | server.send_plaintext(gy); | ||||
| client.recv_plaintext(gy); | client.recv_plaintext(gy); | ||||
| server.key(h1); | |||||
| server.key((Point(gx) - hc)*y); | |||||
| server.dh_key(h1); | |||||
| server.dh_key((Point(gx) - hc)*y); | |||||
| if(aug) { | if(aug) { | ||||
| /* This step isn't actually online but whatever, it's fastish */ | /* This step isn't actually online but whatever, it's fastish */ | ||||
| SecureBuffer serverAug((Precomputed::base() * gs).serialize()); | SecureBuffer serverAug((Precomputed::base() * gs).serialize()); | ||||
| server.key(Point(serverAug)*y); | |||||
| server.dh_key(Point(serverAug)*y); | |||||
| } | } | ||||
| SecureBuffer tag = server.produce_auth(); | SecureBuffer tag = server.produce_auth(); | ||||
| client.key(h1); | |||||
| client.dh_key(h1); | |||||
| Point pgy(gy); pgy -= hs; | Point pgy(gy); pgy -= hs; | ||||
| client.key(pgy*x); | |||||
| if (aug) client.key(pgy * gs); | |||||
| client.dh_key(pgy*x); | |||||
| if (aug) client.dh_key(pgy * gs); | |||||
| client.verify_auth(tag); | client.verify_auth(tag); | ||||
| tag = client.produce_auth(); | tag = client.produce_auth(); | ||||
| client.respec(STROBE_KEYED_128); | client.respec(STROBE_KEYED_128); | ||||
| @@ -395,7 +395,7 @@ int main(int argc, char **argv) { | |||||
| for (Benchmark b("SHAKE128 1kiB", 30); b.iter(); ) { shake1 += Buffer(b1024,1024); } | for (Benchmark b("SHAKE128 1kiB", 30); b.iter(); ) { shake1 += Buffer(b1024,1024); } | ||||
| for (Benchmark b("SHAKE256 1kiB", 30); b.iter(); ) { shake2 += Buffer(b1024,1024); } | for (Benchmark b("SHAKE256 1kiB", 30); b.iter(); ) { shake2 += Buffer(b1024,1024); } | ||||
| for (Benchmark b("SHA3-512 1kiB", 30); b.iter(); ) { sha5 += Buffer(b1024,1024); } | for (Benchmark b("SHA3-512 1kiB", 30); b.iter(); ) { sha5 += Buffer(b1024,1024); } | ||||
| strobe.key(Buffer(b1024,1024)); | |||||
| strobe.dh_key(Buffer(b1024,1024)); | |||||
| strobe.respec(STROBE_128); | strobe.respec(STROBE_128); | ||||
| for (Benchmark b("STROBE128 1kiB", 10); b.iter(); ) { | for (Benchmark b("STROBE128 1kiB", 10); b.iter(); ) { | ||||
| strobe.encrypt_no_auth(Buffer(b1024,1024),Buffer(b1024,1024)); | strobe.encrypt_no_auth(Buffer(b1024,1024),Buffer(b1024,1024)); | ||||