@@ -62,7 +62,7 @@ public: | |||||
} | } | ||||
/** Serialization size. */ | /** Serialization size. */ | ||||
inline size_t serSize() const NOEXCEPT { return SER_BYTES; } | |||||
inline size_t ser_size() const NOEXCEPT { return SER_BYTES; } | |||||
/** Verify a message */ | /** Verify a message */ | ||||
inline void verify( | inline void verify( | ||||
@@ -132,7 +132,7 @@ public: | |||||
} | } | ||||
/** Serialization size. */ | /** Serialization size. */ | ||||
inline size_t serSize() const NOEXCEPT { return SER_BYTES; } | |||||
inline size_t ser_size() const NOEXCEPT { return SER_BYTES; } | |||||
/** Serialize into a buffer. */ | /** Serialize into a buffer. */ | ||||
inline void serialize_into(unsigned char *x) const NOEXCEPT { | inline void serialize_into(unsigned char *x) const NOEXCEPT { | ||||
@@ -152,7 +152,7 @@ public: | |||||
} | } | ||||
/** Derive a shared secret */ | /** Derive a shared secret */ | ||||
inline SecureBuffer sharedSecret( | |||||
inline SecureBuffer shared_secret( | |||||
const PublicKey<$(cxx_ns)> &pub, | const PublicKey<$(cxx_ns)> &pub, | ||||
size_t bytes, | size_t bytes, | ||||
bool me_first | bool me_first | ||||
@@ -166,7 +166,7 @@ public: | |||||
/** Derive a shared secret */ | /** Derive a shared secret */ | ||||
inline decaf_error_t __attribute__((warn_unused_result)) | inline decaf_error_t __attribute__((warn_unused_result)) | ||||
sharedSecretNoexcept( | |||||
shared_secret_noexcept( | |||||
Buffer ret, | Buffer ret, | ||||
const PublicKey<$(cxx_ns)> &pub, | const PublicKey<$(cxx_ns)> &pub, | ||||
bool me_first | bool me_first | ||||
@@ -1364,11 +1364,11 @@ struct smvt_control { | |||||
}; | }; | ||||
static int recode_wnaf ( | static int recode_wnaf ( | ||||
struct smvt_control *control, /* [nbits/(tableBits+1) + 3] */ | |||||
struct smvt_control *control, /* [nbits/(table_bits+1) + 3] */ | |||||
const scalar_t scalar, | const scalar_t scalar, | ||||
unsigned int tableBits | |||||
unsigned int table_bits | |||||
) { | ) { | ||||
unsigned int table_size = SCALAR_BITS/(tableBits+1) + 3; | |||||
unsigned int table_size = SCALAR_BITS/(table_bits+1) + 3; | |||||
int position = table_size - 1; /* at the end */ | int position = table_size - 1; /* at the end */ | ||||
/* place the end marker */ | /* place the end marker */ | ||||
@@ -1382,7 +1382,7 @@ static int recode_wnaf ( | |||||
*/ | */ | ||||
uint64_t current = scalar->limb[0] & 0xFFFF; | uint64_t current = scalar->limb[0] & 0xFFFF; | ||||
uint32_t mask = (1<<(tableBits+1))-1; | |||||
uint32_t mask = (1<<(table_bits+1))-1; | |||||
unsigned int w; | unsigned int w; | ||||
const unsigned int B_OVER_16 = sizeof(scalar->limb[0]) / 2; | const unsigned int B_OVER_16 = sizeof(scalar->limb[0]) / 2; | ||||
@@ -1396,7 +1396,7 @@ static int recode_wnaf ( | |||||
assert(position >= 0); | assert(position >= 0); | ||||
uint32_t pos = __builtin_ctz((uint32_t)current), odd = (uint32_t)current >> pos; | uint32_t pos = __builtin_ctz((uint32_t)current), odd = (uint32_t)current >> pos; | ||||
int32_t delta = odd & mask; | int32_t delta = odd & mask; | ||||
if (odd & 1<<(tableBits+1)) delta -= (1<<(tableBits+1)); | |||||
if (odd & 1<<(table_bits+1)) delta -= (1<<(table_bits+1)); | |||||
current -= delta << pos; | current -= delta << pos; | ||||
control[position].power = pos + 16*(w-1); | control[position].power = pos + 16*(w-1); | ||||
control[position].addend = delta; | control[position].addend = delta; | ||||
@@ -538,12 +538,12 @@ void $(c_ns)_scalar_cond_sel ( | |||||
/** | /** | ||||
* @brief Test that a point is valid, for debugging purposes. | * @brief Test that a point is valid, for debugging purposes. | ||||
* | * | ||||
* @param [in] toTest The point to test. | |||||
* @param [in] to_test The point to test. | |||||
* @retval DECAF_TRUE The point is valid. | * @retval DECAF_TRUE The point is valid. | ||||
* @retval DECAF_FALSE The point is invalid. | * @retval DECAF_FALSE The point is invalid. | ||||
*/ | */ | ||||
decaf_bool_t $(c_ns)_point_valid ( | decaf_bool_t $(c_ns)_point_valid ( | ||||
const $(c_ns)_point_t toTest | |||||
const $(c_ns)_point_t to_test | |||||
) API_VIS WARN_UNUSED NONNULL NOINLINE; | ) API_VIS WARN_UNUSED NONNULL NOINLINE; | ||||
/** | /** | ||||
@@ -104,7 +104,7 @@ public: | |||||
inline Scalar(const Block &buffer) NOEXCEPT { *this = buffer; } | inline Scalar(const Block &buffer) NOEXCEPT { *this = buffer; } | ||||
/** Serializable instance */ | /** Serializable instance */ | ||||
inline size_t serSize() const NOEXCEPT { return SER_BYTES; } | |||||
inline size_t ser_size() const NOEXCEPT { return SER_BYTES; } | |||||
/** Serializable instance */ | /** Serializable instance */ | ||||
inline void serialize_into(unsigned char *buffer) const NOEXCEPT { | inline void serialize_into(unsigned char *buffer) const NOEXCEPT { | ||||
@@ -378,7 +378,7 @@ public: | |||||
} | } | ||||
/** Serializable instance */ | /** Serializable instance */ | ||||
inline size_t serSize() const NOEXCEPT { return SER_BYTES; } | |||||
inline size_t ser_size() const NOEXCEPT { return SER_BYTES; } | |||||
/** Serializable instance */ | /** Serializable instance */ | ||||
inline void serialize_into(unsigned char *buffer) const NOEXCEPT { | inline void serialize_into(unsigned char *buffer) const NOEXCEPT { | ||||
@@ -559,7 +559,7 @@ public: | |||||
* initializer for points which makes this equal to the identity. | * initializer for points which makes this equal to the identity. | ||||
*/ | */ | ||||
inline Precomputed ( | inline Precomputed ( | ||||
const Precomputed_U &yours = *defaultValue() | |||||
const Precomputed_U &yours = *default_value() | |||||
) NOEXCEPT : OwnedOrUnowned<Precomputed,Precomputed_U>(yours) {} | ) NOEXCEPT : OwnedOrUnowned<Precomputed,Precomputed_U>(yours) {} | ||||
@@ -617,7 +617,7 @@ public: | |||||
friend class OwnedOrUnowned<Precomputed,Precomputed_U>; | friend class OwnedOrUnowned<Precomputed,Precomputed_U>; | ||||
static inline size_t size() NOEXCEPT { return $(c_ns)_sizeof_precomputed_s; } | static inline size_t size() NOEXCEPT { return $(c_ns)_sizeof_precomputed_s; } | ||||
static inline size_t alignment() NOEXCEPT { return $(c_ns)_alignof_precomputed_s; } | static inline size_t alignment() NOEXCEPT { return $(c_ns)_alignof_precomputed_s; } | ||||
static inline const Precomputed_U * defaultValue() NOEXCEPT { return $(c_ns)_precomputed_base; } | |||||
static inline const Precomputed_U * default_value() NOEXCEPT { return $(c_ns)_precomputed_base; } | |||||
/** @endcond */ | /** @endcond */ | ||||
}; | }; | ||||
@@ -59,10 +59,10 @@ int main(int argc, char **argv) { | |||||
if (ret || !pre) return 1; | if (ret || !pre) return 1; | ||||
API_NS(precompute)(pre, real_point_base); | API_NS(precompute)(pre, real_point_base); | ||||
struct niels_s *preWnaf; | |||||
ret = posix_memalign((void**)&preWnaf, API_NS(alignof_precomputed_s), API_NS(sizeof_precomputed_wnafs)); | |||||
if (ret || !preWnaf) return 1; | |||||
API_NS(precompute_wnafs)(preWnaf, real_point_base); | |||||
struct niels_s *pre_wnaf; | |||||
ret = posix_memalign((void**)&pre_wnaf, API_NS(alignof_precomputed_s), API_NS(sizeof_precomputed_wnafs)); | |||||
if (ret || !pre_wnaf) return 1; | |||||
API_NS(precompute_wnafs)(pre_wnaf, real_point_base); | |||||
const gf_s *output; | const gf_s *output; | ||||
unsigned i; | unsigned i; | ||||
@@ -91,7 +91,7 @@ int main(int argc, char **argv) { | |||||
} | } | ||||
printf("\n};\n"); | printf("\n};\n"); | ||||
output = (const gf_s *)preWnaf; | |||||
output = (const gf_s *)pre_wnaf; | |||||
printf("const gf API_NS(precomputed_wnaf_as_fe)[%d]\n", | printf("const gf API_NS(precomputed_wnaf_as_fe)[%d]\n", | ||||
(int)(API_NS(sizeof_precomputed_wnafs) / sizeof(gf))); | (int)(API_NS(sizeof_precomputed_wnafs) / sizeof(gf))); | ||||
printf("__attribute__((aligned(%d),visibility(\"hidden\"))) = {\n ", (int)API_NS(alignof_precomputed_s)); | printf("__attribute__((aligned(%d),visibility(\"hidden\"))) = {\n ", (int)API_NS(alignof_precomputed_s)); | ||||
@@ -12,12 +12,12 @@ | |||||
#define API_NAME "$(c_ns)" | #define API_NAME "$(c_ns)" | ||||
#define API_NS(_id) $(c_ns)_##_id | #define API_NS(_id) $(c_ns)_##_id | ||||
#define hash_ctx_t $(eddsa_hash)_ctx_t | |||||
#define hash_init $(eddsa_hash)_init | |||||
#define hash_update $(eddsa_hash)_update | |||||
#define hash_final $(eddsa_hash)_final | |||||
#define hash_destroy $(eddsa_hash)_destroy | |||||
#define hash_hash $(eddsa_hash)_hash | |||||
#define hash_ctx_t decaf_$(eddsa_hash)_ctx_t | |||||
#define hash_init decaf_$(eddsa_hash)_init | |||||
#define hash_update decaf_$(eddsa_hash)_update | |||||
#define hash_final decaf_$(eddsa_hash)_final | |||||
#define hash_destroy decaf_$(eddsa_hash)_destroy | |||||
#define hash_hash decaf_$(eddsa_hash)_hash | |||||
#define SUPPORTS_CONTEXTS $(C_NS)_EDDSA_SUPPORTS_CONTEXTS | #define SUPPORTS_CONTEXTS $(C_NS)_EDDSA_SUPPORTS_CONTEXTS | ||||
#define EDDSA_USE_SIGMA_ISOGENY $(eddsa_sigma_iso) | #define EDDSA_USE_SIGMA_ISOGENY $(eddsa_sigma_iso) | ||||
@@ -47,9 +47,9 @@ static void hash_init_with_dom( | |||||
hash_init(hash); | hash_init(hash); | ||||
#if SUPPORTS_CONTEXTS | #if SUPPORTS_CONTEXTS | ||||
const char *domS = "$(eddsa_dom)"; | |||||
const char *dom_s = "$(eddsa_dom)"; | |||||
const uint8_t dom[2] = {1+word_is_zero(prehashed), context_len}; | const uint8_t dom[2] = {1+word_is_zero(prehashed), context_len}; | ||||
hash_update(hash,(const unsigned char *)domS, strlen(domS)); | |||||
hash_update(hash,(const unsigned char *)dom_s, strlen(dom_s)); | |||||
hash_update(hash,dom,2); | hash_update(hash,dom,2); | ||||
hash_update(hash,context,context_len); | hash_update(hash,context,context_len); | ||||
#else | #else | ||||
@@ -145,7 +145,7 @@ public: | |||||
} | } | ||||
/** Serialization size. */ | /** Serialization size. */ | ||||
inline size_t serSize() const NOEXCEPT { return SER_BYTES; } | |||||
inline size_t ser_size() const NOEXCEPT { return SER_BYTES; } | |||||
/** Serialize into a buffer. */ | /** Serialize into a buffer. */ | ||||
inline void serialize_into(unsigned char *x) const NOEXCEPT { | inline void serialize_into(unsigned char *x) const NOEXCEPT { | ||||
@@ -258,7 +258,7 @@ public: | |||||
/** Serialization size. */ | /** Serialization size. */ | ||||
inline size_t serSize() const NOEXCEPT { return SER_BYTES; } | |||||
inline size_t ser_size() const NOEXCEPT { return SER_BYTES; } | |||||
/** Serialize into a buffer. */ | /** Serialize into a buffer. */ | ||||
inline void serialize_into(unsigned char *x) const NOEXCEPT { | inline void serialize_into(unsigned char *x) const NOEXCEPT { | ||||
@@ -85,7 +85,7 @@ inline bool memeq(const std::vector<T,U> &a, const std::vector<V,W> &b) { | |||||
template<class Base> class Serializable { | template<class Base> class Serializable { | ||||
public: | public: | ||||
/** @brief Return the number of bytes needed to serialize this object */ | /** @brief Return the number of bytes needed to serialize this object */ | ||||
inline size_t serSize() const NOEXCEPT { return static_cast<const Base*>(this)->serSize(); } | |||||
inline size_t ser_size() const NOEXCEPT { return static_cast<const Base*>(this)->ser_size(); } | |||||
/** @brief Serialize this object into a buffer */ | /** @brief Serialize this object into a buffer */ | ||||
inline void serialize_into(unsigned char *buf) const NOEXCEPT { | inline void serialize_into(unsigned char *buf) const NOEXCEPT { | ||||
@@ -94,7 +94,7 @@ public: | |||||
/** @brief Serialize this object into a SecureBuffer and return it */ | /** @brief Serialize this object into a SecureBuffer and return it */ | ||||
inline SecureBuffer serialize() const throw(std::bad_alloc) { | inline SecureBuffer serialize() const throw(std::bad_alloc) { | ||||
SecureBuffer out(serSize()); | |||||
SecureBuffer out(ser_size()); | |||||
serialize_into(out.data()); | serialize_into(out.data()); | ||||
return out; | return out; | ||||
} | } | ||||
@@ -396,32 +396,32 @@ protected: | |||||
Wrapped *mine; | Wrapped *mine; | ||||
const Wrapped *yours; | const Wrapped *yours; | ||||
} ours; | } ours; | ||||
bool isMine; | |||||
bool is_mine; | |||||
inline void clear() NOEXCEPT { | inline void clear() NOEXCEPT { | ||||
if (isMine) { | |||||
if (is_mine) { | |||||
really_bzero(ours.mine, T::size()); | really_bzero(ours.mine, T::size()); | ||||
free(ours.mine); | free(ours.mine); | ||||
ours.yours = T::defaultValue(); | |||||
isMine = false; | |||||
ours.yours = T::default_value(); | |||||
is_mine = false; | |||||
} | } | ||||
} | } | ||||
inline void alloc() throw(std::bad_alloc) { | inline void alloc() throw(std::bad_alloc) { | ||||
if (isMine) return; | |||||
if (is_mine) return; | |||||
int ret = posix_memalign((void**)&ours.mine, T::alignment(), T::size()); | int ret = posix_memalign((void**)&ours.mine, T::alignment(), T::size()); | ||||
if (ret || !ours.mine) { | if (ret || !ours.mine) { | ||||
isMine = false; | |||||
is_mine = false; | |||||
throw std::bad_alloc(); | throw std::bad_alloc(); | ||||
} | } | ||||
isMine = true; | |||||
is_mine = true; | |||||
} | } | ||||
inline const Wrapped *get() const NOEXCEPT { return isMine ? ours.mine : ours.yours; } | |||||
inline const Wrapped *get() const NOEXCEPT { return is_mine ? ours.mine : ours.yours; } | |||||
inline OwnedOrUnowned( | inline OwnedOrUnowned( | ||||
const Wrapped &yours = *T::defaultValue() | |||||
const Wrapped &yours = *T::default_value() | |||||
) NOEXCEPT { | ) NOEXCEPT { | ||||
ours.yours = &yours; | ours.yours = &yours; | ||||
isMine = false; | |||||
is_mine = false; | |||||
} | } | ||||
/** | /** | ||||
@@ -429,14 +429,14 @@ protected: | |||||
*/ | */ | ||||
inline T &operator=(const OwnedOrUnowned &it) throw(std::bad_alloc) { | inline T &operator=(const OwnedOrUnowned &it) throw(std::bad_alloc) { | ||||
if (this == &it) return *(T*)this; | if (this == &it) return *(T*)this; | ||||
if (it.isMine) { | |||||
if (it.is_mine) { | |||||
alloc(); | alloc(); | ||||
memcpy(ours.mine,it.ours.mine,T::size()); | memcpy(ours.mine,it.ours.mine,T::size()); | ||||
} else { | } else { | ||||
clear(); | clear(); | ||||
ours.yours = it.ours.yours; | ours.yours = it.ours.yours; | ||||
} | } | ||||
isMine = it.isMine; | |||||
is_mine = it.is_mine; | |||||
return *(T*)this; | return *(T*)this; | ||||
} | } | ||||
@@ -445,9 +445,9 @@ protected: | |||||
if (this == &it) return *(T*)this; | if (this == &it) return *(T*)this; | ||||
clear(); | clear(); | ||||
ours = it.ours; | ours = it.ours; | ||||
isMine = it.isMine; | |||||
it.isMine = false; | |||||
it.ours.yours = T::defaultValue; | |||||
is_mine = it.is_mine; | |||||
it.is_mine = false; | |||||
it.ours.yours = T::default_value; | |||||
return *this; | return *this; | ||||
} | } | ||||
#endif | #endif | ||||
@@ -19,31 +19,31 @@ extern "C" { | |||||
#endif | #endif | ||||
typedef struct sha512_ctx_s { | |||||
typedef struct decaf_sha512_ctx_s { | |||||
uint64_t state[8]; | uint64_t state[8]; | ||||
uint8_t block[128]; | uint8_t block[128]; | ||||
uint64_t bytesProcessed; | |||||
} sha512_ctx_s, sha512_ctx_t[1]; | |||||
uint64_t bytes_processed; | |||||
} decaf_sha512_ctx_s, decaf_sha512_ctx_t[1]; | |||||
void sha512_init(sha512_ctx_t ctx) NONNULL API_VIS; | |||||
void sha512_update(sha512_ctx_t ctx, const uint8_t *message, size_t length) NONNULL API_VIS; | |||||
void sha512_final(sha512_ctx_t ctx, uint8_t *out, size_t length) NONNULL API_VIS; | |||||
void decaf_sha512_init(decaf_sha512_ctx_t ctx) NONNULL API_VIS; | |||||
void decaf_sha512_update(decaf_sha512_ctx_t ctx, const uint8_t *message, size_t length) NONNULL API_VIS; | |||||
void decaf_sha512_final(decaf_sha512_ctx_t ctx, uint8_t *out, size_t length) NONNULL API_VIS; | |||||
static inline void sha512_destroy(sha512_ctx_t ctx) { | |||||
static inline void decaf_sha512_destroy(decaf_sha512_ctx_t ctx) { | |||||
decaf_bzero(ctx,sizeof(*ctx)); | decaf_bzero(ctx,sizeof(*ctx)); | ||||
} | } | ||||
static inline void sha512_hash( | |||||
static inline void decaf_sha512_hash( | |||||
uint8_t *output, | uint8_t *output, | ||||
size_t output_len, | size_t output_len, | ||||
const uint8_t *message, | const uint8_t *message, | ||||
size_t message_len | size_t message_len | ||||
) { | ) { | ||||
sha512_ctx_t ctx; | |||||
sha512_init(ctx); | |||||
sha512_update(ctx,message,message_len); | |||||
sha512_final(ctx,output,output_len); | |||||
sha512_destroy(ctx); | |||||
decaf_sha512_ctx_t ctx; | |||||
decaf_sha512_init(ctx); | |||||
decaf_sha512_update(ctx,message,message_len); | |||||
decaf_sha512_final(ctx,output,output_len); | |||||
decaf_sha512_destroy(ctx); | |||||
} | } | ||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
@@ -1,5 +1,5 @@ | |||||
/** | /** | ||||
* @file decaf/sha512.hxx | |||||
* @file decaf/decaf_sha512.hxx | |||||
* @copyright | * @copyright | ||||
* Based on public domain code by Dan Bernstein \n | * Based on public domain code by Dan Bernstein \n | ||||
* Copyright (c) 2015 Cryptography Research, Inc. \n | * Copyright (c) 2015 Cryptography Research, Inc. \n | ||||
@@ -30,7 +30,7 @@ class SHA512 { | |||||
protected: | protected: | ||||
/** @cond internal */ | /** @cond internal */ | ||||
/** The C-wrapper sponge state */ | /** The C-wrapper sponge state */ | ||||
sha512_ctx_t sha; | |||||
decaf_sha512_ctx_t sha; | |||||
public: | public: | ||||
@@ -44,10 +44,10 @@ public: | |||||
static const size_t DEFAULT_OUTPUT_BYTES = OUTPUT_BYTES; | static const size_t DEFAULT_OUTPUT_BYTES = OUTPUT_BYTES; | ||||
/** Constructor */ | /** Constructor */ | ||||
inline SHA512() NOEXCEPT { sha512_init(sha); } | |||||
inline SHA512() NOEXCEPT { decaf_sha512_init(sha); } | |||||
/** Add more data to running hash */ | /** Add more data to running hash */ | ||||
inline void update(const uint8_t *__restrict__ in, size_t len) NOEXCEPT { sha512_update(sha,in,len); } | |||||
inline void update(const uint8_t *__restrict__ in, size_t len) NOEXCEPT { decaf_sha512_update(sha,in,len); } | |||||
/** Add more data to running hash, C++ version. */ | /** Add more data to running hash, C++ version. */ | ||||
inline void update(const Block &s) NOEXCEPT { update(s.data(),s.size()); } | inline void update(const Block &s) NOEXCEPT { update(s.data(),s.size()); } | ||||
@@ -61,17 +61,17 @@ public: | |||||
/** @brief Output bytes from the SHA context, and resets it. */ | /** @brief Output bytes from the SHA context, and resets it. */ | ||||
inline void final(Buffer b) throw(LengthException) { | inline void final(Buffer b) throw(LengthException) { | ||||
if (b.size() > OUTPUT_BYTES) throw LengthException(); | if (b.size() > OUTPUT_BYTES) throw LengthException(); | ||||
sha512_final(sha,b.data(),b.size()); | |||||
decaf_sha512_final(sha,b.data(),b.size()); | |||||
} | } | ||||
/** Resets the SHA context */ | /** Resets the SHA context */ | ||||
inline void reset() NOEXCEPT { sha512_init(sha); } | |||||
inline void reset() NOEXCEPT { decaf_sha512_init(sha); } | |||||
/** @brief Output bytes from the sponge. */ | /** @brief Output bytes from the sponge. */ | ||||
inline SecureBuffer final(size_t len = OUTPUT_BYTES) throw(LengthException) { | inline SecureBuffer final(size_t len = OUTPUT_BYTES) throw(LengthException) { | ||||
if (len > OUTPUT_BYTES) throw LengthException(); | if (len > OUTPUT_BYTES) throw LengthException(); | ||||
SecureBuffer buffer(len); | SecureBuffer buffer(len); | ||||
sha512_final(sha,buffer.data(),len); | |||||
decaf_sha512_final(sha,buffer.data(),len); | |||||
return buffer; | return buffer; | ||||
} | } | ||||
@@ -88,12 +88,12 @@ public: | |||||
) throw(LengthException, std::bad_alloc) { | ) throw(LengthException, std::bad_alloc) { | ||||
if (outlen > OUTPUT_BYTES) throw LengthException(); | if (outlen > OUTPUT_BYTES) throw LengthException(); | ||||
SecureBuffer buffer(outlen); | SecureBuffer buffer(outlen); | ||||
sha512_hash(buffer.data(),outlen,message.data(),message.size()); | |||||
decaf_sha512_hash(buffer.data(),outlen,message.data(),message.size()); | |||||
return buffer; | return buffer; | ||||
} | } | ||||
/** Destructor zeroizes state */ | /** Destructor zeroizes state */ | ||||
inline ~SHA512() NOEXCEPT { sha512_destroy(sha); } | |||||
inline ~SHA512() NOEXCEPT { decaf_sha512_destroy(sha); } | |||||
}; | }; | ||||
} /* namespace decaf */ | } /* namespace decaf */ | ||||
@@ -5,12 +5,11 @@ | |||||
* Copyright (c) 2015 Cryptography Research, Inc. \n | * Copyright (c) 2015 Cryptography Research, Inc. \n | ||||
* Released under the MIT License. See LICENSE.txt for license information. | * Released under the MIT License. See LICENSE.txt for license information. | ||||
* @author Mike Hamburg | * @author Mike Hamburg | ||||
* @brief SHA-3-n and SHAKE-n instances. | |||||
* @warning EXPERIMENTAL! The names, parameter orders etc are likely to change. | |||||
* @brief SHA-3-n and DECAF_SHAKE-n instances. | |||||
*/ | */ | ||||
#ifndef __SHAKE_H__ | |||||
#define __SHAKE_H__ | |||||
#ifndef __DECAF_SHAKE_H__ | |||||
#define __DECAF_SHAKE_H__ | |||||
#include <stdint.h> | #include <stdint.h> | ||||
#include <sys/types.h> | #include <sys/types.h> | ||||
@@ -24,19 +23,19 @@ extern "C" { | |||||
#ifndef INTERNAL_SPONGE_STRUCT | #ifndef INTERNAL_SPONGE_STRUCT | ||||
/** Sponge container object for the various primitives. */ | /** Sponge container object for the various primitives. */ | ||||
typedef struct keccak_sponge_s { | |||||
typedef struct decaf_keccak_sponge_s { | |||||
/** @cond internal */ | /** @cond internal */ | ||||
uint64_t opaque[26]; | uint64_t opaque[26]; | ||||
/** @endcond */ | /** @endcond */ | ||||
} keccak_sponge_s; | |||||
} decaf_keccak_sponge_s; | |||||
/** Convenience GMP-style one-element array version */ | /** Convenience GMP-style one-element array version */ | ||||
typedef struct keccak_sponge_s keccak_sponge_t[1]; | |||||
typedef struct decaf_keccak_sponge_s decaf_keccak_sponge_t[1]; | |||||
/** Parameters for sponge construction, distinguishing SHA3 and | |||||
* SHAKE instances. | |||||
/** Parameters for sponge construction, distinguishing DECAF_SHA3 and | |||||
* DECAF_SHAKE instances. | |||||
*/ | */ | ||||
struct kparams_s; | |||||
struct decaf_kparams_s; | |||||
#endif | #endif | ||||
/** | /** | ||||
@@ -44,48 +43,48 @@ extern "C" { | |||||
* @param [out] sponge The object to initialize. | * @param [out] sponge The object to initialize. | ||||
* @param [in] params The sponge's parameter description. | * @param [in] params The sponge's parameter description. | ||||
*/ | */ | ||||
void sponge_init ( | |||||
keccak_sponge_t sponge, | |||||
const struct kparams_s *params | |||||
void decaf_sponge_init ( | |||||
decaf_keccak_sponge_t sponge, | |||||
const struct decaf_kparams_s *params | |||||
) API_VIS; | ) API_VIS; | ||||
/** | /** | ||||
* @brief Absorb data into a SHA3 or SHAKE hash context. | |||||
* @brief Absorb data into a DECAF_SHA3 or DECAF_SHAKE hash context. | |||||
* @param [inout] sponge The context. | * @param [inout] sponge The context. | ||||
* @param [in] in The input data. | * @param [in] in The input data. | ||||
* @param [in] len The input data's length in bytes. | * @param [in] len The input data's length in bytes. | ||||
*/ | */ | ||||
void sha3_update ( | |||||
struct keccak_sponge_s * __restrict__ sponge, | |||||
void decaf_sha3_update ( | |||||
struct decaf_keccak_sponge_s * __restrict__ sponge, | |||||
const uint8_t *in, | const uint8_t *in, | ||||
size_t len | size_t len | ||||
) API_VIS; | ) API_VIS; | ||||
/** | /** | ||||
* @brief Squeeze output data from a SHA3 or SHAKE hash context. | |||||
* @brief Squeeze output data from a DECAF_SHA3 or DECAF_SHAKE hash context. | |||||
* This does not destroy or re-initialize the hash context, and | * This does not destroy or re-initialize the hash context, and | ||||
* sha3 output can be called more times. | |||||
* decaf_sha3 output can be called more times. | |||||
* | * | ||||
* @param [inout] sponge The context. | * @param [inout] sponge The context. | ||||
* @param [out] out The output data. | * @param [out] out The output data. | ||||
* @param [in] len The requested output data length in bytes. | * @param [in] len The requested output data length in bytes. | ||||
*/ | */ | ||||
void sha3_output ( | |||||
keccak_sponge_t sponge, | |||||
void decaf_sha3_output ( | |||||
decaf_keccak_sponge_t sponge, | |||||
uint8_t * __restrict__ out, | uint8_t * __restrict__ out, | ||||
size_t len | size_t len | ||||
) API_VIS; | ) API_VIS; | ||||
/** | /** | ||||
* @brief Squeeze output data from a SHA3 or SHAKE hash context. | |||||
* @brief Squeeze output data from a DECAF_SHA3 or DECAF_SHAKE hash context. | |||||
* This re-initializes the context to its starting parameters. | * This re-initializes the context to its starting parameters. | ||||
* | * | ||||
* @param [inout] sponge The context. | * @param [inout] sponge The context. | ||||
* @param [out] out The output data. | * @param [out] out The output data. | ||||
* @param [in] len The requested output data length in bytes. | * @param [in] len The requested output data length in bytes. | ||||
*/ | */ | ||||
void sha3_final ( | |||||
keccak_sponge_t sponge, | |||||
void decaf_sha3_final ( | |||||
decaf_keccak_sponge_t sponge, | |||||
uint8_t * __restrict__ out, | uint8_t * __restrict__ out, | ||||
size_t len | size_t len | ||||
) API_VIS; | ) API_VIS; | ||||
@@ -95,36 +94,36 @@ void sha3_final ( | |||||
* | * | ||||
* @param [inout] sponge The context. | * @param [inout] sponge The context. | ||||
*/ | */ | ||||
void sha3_reset ( | |||||
keccak_sponge_t sponge | |||||
void decaf_sha3_reset ( | |||||
decaf_keccak_sponge_t sponge | |||||
) API_VIS; | ) API_VIS; | ||||
/** | /** | ||||
* @brief Return the default output length of the sponge construction, | * @brief Return the default output length of the sponge construction, | ||||
* for the purpose of C++ default operators. | * for the purpose of C++ default operators. | ||||
* | * | ||||
* Returns n/8 for SHA3-n and 2n/8 for SHAKE-n. | |||||
* Returns n/8 for DECAF_SHA3-n and 2n/8 for DECAF_SHAKE-n. | |||||
*/ | */ | ||||
size_t sponge_default_output_bytes ( | |||||
const keccak_sponge_t sponge /**< [inout] The context. */ | |||||
size_t decaf_sponge_default_output_bytes ( | |||||
const decaf_keccak_sponge_t sponge /**< [inout] The context. */ | |||||
) API_VIS; | ) API_VIS; | ||||
/** | /** | ||||
* @brief Return the default output length of the sponge construction, | * @brief Return the default output length of the sponge construction, | ||||
* for the purpose of C++ default operators. | * for the purpose of C++ default operators. | ||||
* | * | ||||
* Returns n/8 for SHA3-n and SIZE_MAX for SHAKE-n. | |||||
* Returns n/8 for DECAF_SHA3-n and SIZE_MAX for DECAF_SHAKE-n. | |||||
*/ | */ | ||||
size_t sponge_max_output_bytes ( | |||||
const keccak_sponge_t sponge /**< [inout] The context. */ | |||||
size_t decaf_sponge_max_output_bytes ( | |||||
const decaf_keccak_sponge_t sponge /**< [inout] The context. */ | |||||
) API_VIS; | ) API_VIS; | ||||
/** | /** | ||||
* @brief Destroy a SHA3 or SHAKE sponge context by overwriting it with 0. | |||||
* @brief Destroy a DECAF_SHA3 or DECAF_SHAKE sponge context by overwriting it with 0. | |||||
* @param [out] sponge The context. | * @param [out] sponge The context. | ||||
*/ | */ | ||||
void sponge_destroy ( | |||||
keccak_sponge_t sponge | |||||
void decaf_sponge_destroy ( | |||||
decaf_keccak_sponge_t sponge | |||||
) API_VIS; | ) API_VIS; | ||||
/** | /** | ||||
@@ -135,73 +134,75 @@ void sponge_destroy ( | |||||
* @param [in] outlen The length of the output data. | * @param [in] outlen The length of the output data. | ||||
* @param [in] params The parameters of the sponge hash. | * @param [in] params The parameters of the sponge hash. | ||||
*/ | */ | ||||
void sponge_hash ( | |||||
void decaf_sponge_hash ( | |||||
const uint8_t *in, | const uint8_t *in, | ||||
size_t inlen, | size_t inlen, | ||||
uint8_t *out, | uint8_t *out, | ||||
size_t outlen, | size_t outlen, | ||||
const struct kparams_s *params | |||||
const struct decaf_kparams_s *params | |||||
) API_VIS; | ) API_VIS; | ||||
/* FUTURE: expand/doxygenate individual SHAKE/SHA3 instances? */ | |||||
/* FUTURE: expand/doxygenate individual DECAF_SHAKE/DECAF_SHA3 instances? */ | |||||
/** @cond internal */ | /** @cond internal */ | ||||
#define DECSHAKE(n) \ | |||||
extern const struct kparams_s SHAKE##n##_params_s API_VIS; \ | |||||
typedef struct shake##n##_ctx_s { keccak_sponge_t s; } shake##n##_ctx_t[1]; \ | |||||
static inline void NONNULL shake##n##_init(shake##n##_ctx_t sponge) { \ | |||||
sponge_init(sponge->s, &SHAKE##n##_params_s); \ | |||||
#define DEC_SHAKE(n) \ | |||||
extern const struct decaf_kparams_s DECAF_SHAKE##n##_params_s API_VIS; \ | |||||
typedef struct decaf_shake##n##_ctx_s { decaf_keccak_sponge_t s; } decaf_shake##n##_ctx_t[1]; \ | |||||
static inline void NONNULL decaf_shake##n##_init(decaf_shake##n##_ctx_t sponge) { \ | |||||
decaf_sponge_init(sponge->s, &DECAF_SHAKE##n##_params_s); \ | |||||
} \ | } \ | ||||
static inline void NONNULL shake##n##_gen_init(keccak_sponge_t sponge) { \ | |||||
sponge_init(sponge, &SHAKE##n##_params_s); \ | |||||
static inline void NONNULL decaf_shake##n##_gen_init(decaf_keccak_sponge_t sponge) { \ | |||||
decaf_sponge_init(sponge, &DECAF_SHAKE##n##_params_s); \ | |||||
} \ | } \ | ||||
static inline void NONNULL shake##n##_update(shake##n##_ctx_t sponge, const uint8_t *in, size_t inlen ) { \ | |||||
sha3_update(sponge->s, in, inlen); \ | |||||
static inline void NONNULL decaf_shake##n##_update(decaf_shake##n##_ctx_t sponge, const uint8_t *in, size_t inlen ) { \ | |||||
decaf_sha3_update(sponge->s, in, inlen); \ | |||||
} \ | } \ | ||||
static inline void NONNULL shake##n##_final(shake##n##_ctx_t sponge, uint8_t *out, size_t outlen ) { \ | |||||
sha3_output(sponge->s, out, outlen); \ | |||||
sponge_init(sponge->s, &SHAKE##n##_params_s); \ | |||||
static inline void NONNULL decaf_shake##n##_final(decaf_shake##n##_ctx_t sponge, uint8_t *out, size_t outlen ) { \ | |||||
decaf_sha3_output(sponge->s, out, outlen); \ | |||||
decaf_sponge_init(sponge->s, &DECAF_SHAKE##n##_params_s); \ | |||||
} \ | } \ | ||||
static inline void NONNULL shake##n##_hash(uint8_t *out, size_t outlen, const uint8_t *in, size_t inlen) { \ | |||||
sponge_hash(in,inlen,out,outlen,&SHAKE##n##_params_s); \ | |||||
static inline void NONNULL decaf_shake##n##_hash(uint8_t *out, size_t outlen, const uint8_t *in, size_t inlen) { \ | |||||
decaf_sponge_hash(in,inlen,out,outlen,&DECAF_SHAKE##n##_params_s); \ | |||||
} \ | } \ | ||||
static inline void NONNULL shake##n##_destroy( shake##n##_ctx_t sponge ) { \ | |||||
sponge_destroy(sponge->s); \ | |||||
static inline void NONNULL decaf_shake##n##_destroy( decaf_shake##n##_ctx_t sponge ) { \ | |||||
decaf_sponge_destroy(sponge->s); \ | |||||
} | } | ||||
#define DECSHA3(n) \ | |||||
extern const struct kparams_s SHA3_##n##_params_s API_VIS; \ | |||||
typedef struct sha3_##n##_ctx_s { keccak_sponge_t s; } sha3_##n##_ctx_t[1]; \ | |||||
static inline void NONNULL sha3_##n##_init(sha3_##n##_ctx_t sponge) { \ | |||||
sponge_init(sponge->s, &SHA3_##n##_params_s); \ | |||||
#define DEC_SHA3(n) \ | |||||
extern const struct decaf_kparams_s DECAF_SHA3_##n##_params_s API_VIS; \ | |||||
typedef struct decaf_sha3_##n##_ctx_s { decaf_keccak_sponge_t s; } decaf_sha3_##n##_ctx_t[1]; \ | |||||
static inline void NONNULL decaf_sha3_##n##_init(decaf_sha3_##n##_ctx_t sponge) { \ | |||||
decaf_sponge_init(sponge->s, &DECAF_SHA3_##n##_params_s); \ | |||||
} \ | } \ | ||||
static inline void NONNULL sha3_##n##_gen_init(keccak_sponge_t sponge) { \ | |||||
sponge_init(sponge, &SHA3_##n##_params_s); \ | |||||
static inline void NONNULL decaf_sha3_##n##_gen_init(decaf_keccak_sponge_t sponge) { \ | |||||
decaf_sponge_init(sponge, &DECAF_SHA3_##n##_params_s); \ | |||||
} \ | } \ | ||||
static inline void NONNULL sha3_##n##_update(sha3_##n##_ctx_t sponge, const uint8_t *in, size_t inlen ) { \ | |||||
sha3_update(sponge->s, in, inlen); \ | |||||
static inline void NONNULL decaf_sha3_##n##_update(decaf_sha3_##n##_ctx_t sponge, const uint8_t *in, size_t inlen ) { \ | |||||
decaf_sha3_update(sponge->s, in, inlen); \ | |||||
} \ | } \ | ||||
static inline void NONNULL sha3_##n##_final(sha3_##n##_ctx_t sponge, uint8_t *out, size_t outlen ) { \ | |||||
sha3_output(sponge->s, out, outlen); \ | |||||
sponge_init(sponge->s, &SHA3_##n##_params_s); \ | |||||
static inline void NONNULL decaf_sha3_##n##_final(decaf_sha3_##n##_ctx_t sponge, uint8_t *out, size_t outlen ) { \ | |||||
decaf_sha3_output(sponge->s, out, outlen); \ | |||||
decaf_sponge_init(sponge->s, &DECAF_SHA3_##n##_params_s); \ | |||||
} \ | } \ | ||||
static inline void NONNULL sha3_##n##_hash(uint8_t *out, size_t outlen, const uint8_t *in, size_t inlen) { \ | |||||
sponge_hash(in,inlen,out,outlen,&SHA3_##n##_params_s); \ | |||||
static inline void NONNULL decaf_sha3_##n##_hash(uint8_t *out, size_t outlen, const uint8_t *in, size_t inlen) { \ | |||||
decaf_sponge_hash(in,inlen,out,outlen,&DECAF_SHA3_##n##_params_s); \ | |||||
} \ | } \ | ||||
static inline void NONNULL sha3_##n##_destroy(sha3_##n##_ctx_t sponge) { \ | |||||
sponge_destroy(sponge->s); \ | |||||
static inline void NONNULL decaf_sha3_##n##_destroy(decaf_sha3_##n##_ctx_t sponge) { \ | |||||
decaf_sponge_destroy(sponge->s); \ | |||||
} | } | ||||
/** @endcond */ | /** @endcond */ | ||||
DECSHAKE(128) | |||||
DECSHAKE(256) | |||||
DECSHA3(224) | |||||
DECSHA3(256) | |||||
DECSHA3(384) | |||||
DECSHA3(512) | |||||
DEC_SHAKE(128) | |||||
DEC_SHAKE(256) | |||||
DEC_SHA3(224) | |||||
DEC_SHA3(256) | |||||
DEC_SHA3(384) | |||||
DEC_SHA3(512) | |||||
#undef DEC_SHAKE | |||||
#undef DEC_SHA3 | |||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
} /* extern "C" */ | } /* extern "C" */ | ||||
#endif | #endif | ||||
#endif /* __SHAKE_H__ */ | |||||
#endif /* __DECAF_SHAKE_H__ */ |
@@ -1,5 +1,5 @@ | |||||
/** | /** | ||||
* @file decaf/shake.hxx | |||||
* @file decaf/decaf_shake.hxx | |||||
* @copyright | * @copyright | ||||
* Based on CC0 code by David Leon Gil, 2015 \n | * Based on CC0 code by David Leon Gil, 2015 \n | ||||
* Copyright (c) 2015 Cryptography Research, Inc. \n | * Copyright (c) 2015 Cryptography Research, Inc. \n | ||||
@@ -35,18 +35,18 @@ class KeccakHash { | |||||
protected: | protected: | ||||
/** @cond internal */ | /** @cond internal */ | ||||
/** The C-wrapper sponge state */ | /** The C-wrapper sponge state */ | ||||
keccak_sponge_t sp; | |||||
decaf_keccak_sponge_t sp; | |||||
/** Initialize from parameters */ | /** Initialize from parameters */ | ||||
inline KeccakHash(const kparams_s *params) NOEXCEPT { sponge_init(sp, params); } | |||||
inline KeccakHash(const decaf_kparams_s *params) NOEXCEPT { decaf_sponge_init(sp, params); } | |||||
/** @endcond */ | /** @endcond */ | ||||
public: | public: | ||||
/** Add more data to running hash */ | /** Add more data to running hash */ | ||||
inline void update(const uint8_t *__restrict__ in, size_t len) NOEXCEPT { sha3_update(sp,in,len); } | |||||
inline void update(const uint8_t *__restrict__ in, size_t len) NOEXCEPT { decaf_sha3_update(sp,in,len); } | |||||
/** Add more data to running hash, C++ version. */ | /** Add more data to running hash, C++ version. */ | ||||
inline void update(const Block &s) NOEXCEPT { sha3_update(sp,s.data(),s.size()); } | |||||
inline void update(const Block &s) NOEXCEPT { decaf_sha3_update(sp,s.data(),s.size()); } | |||||
/** Add more data, stream version. */ | /** Add more data, stream version. */ | ||||
inline KeccakHash &operator<<(const Block &s) NOEXCEPT { update(s); return *this; } | inline KeccakHash &operator<<(const Block &s) NOEXCEPT { update(s); return *this; } | ||||
@@ -58,7 +58,7 @@ public: | |||||
inline SecureBuffer output(size_t len) throw(std::bad_alloc, LengthException) { | inline SecureBuffer output(size_t len) throw(std::bad_alloc, LengthException) { | ||||
if (len > max_output_size()) throw LengthException(); | if (len > max_output_size()) throw LengthException(); | ||||
SecureBuffer buffer(len); | SecureBuffer buffer(len); | ||||
sha3_output(sp,buffer.data(),len); | |||||
decaf_sha3_output(sp,buffer.data(),len); | |||||
return buffer; | return buffer; | ||||
} | } | ||||
@@ -66,7 +66,7 @@ public: | |||||
inline SecureBuffer final(size_t len) throw(std::bad_alloc, LengthException) { | inline SecureBuffer final(size_t len) throw(std::bad_alloc, LengthException) { | ||||
if (len > max_output_size()) throw LengthException(); | if (len > max_output_size()) throw LengthException(); | ||||
SecureBuffer buffer(len); | SecureBuffer buffer(len); | ||||
sha3_final(sp,buffer.data(),len); | |||||
decaf_sha3_final(sp,buffer.data(),len); | |||||
return buffer; | return buffer; | ||||
} | } | ||||
@@ -75,22 +75,22 @@ public: | |||||
* @todo make this throw exceptions. | * @todo make this throw exceptions. | ||||
*/ | */ | ||||
inline void output(Buffer b) throw(LengthException) { | inline void output(Buffer b) throw(LengthException) { | ||||
sha3_output(sp,b.data(),b.size()); | |||||
decaf_sha3_output(sp,b.data(),b.size()); | |||||
} | } | ||||
/** @brief Output bytes from the sponge and reinitialize it. */ | /** @brief Output bytes from the sponge and reinitialize it. */ | ||||
inline void final(Buffer b) throw(LengthException) { | inline void final(Buffer b) throw(LengthException) { | ||||
sha3_final(sp,b.data(),b.size()); | |||||
decaf_sha3_final(sp,b.data(),b.size()); | |||||
} | } | ||||
/** @brief Return the sponge's default output size. */ | /** @brief Return the sponge's default output size. */ | ||||
inline size_t default_output_size() const NOEXCEPT { | inline size_t default_output_size() const NOEXCEPT { | ||||
return sponge_default_output_bytes(sp); | |||||
return decaf_sponge_default_output_bytes(sp); | |||||
} | } | ||||
/** @brief Return the sponge's maximum output size. */ | /** @brief Return the sponge's maximum output size. */ | ||||
inline size_t max_output_size() const NOEXCEPT { | inline size_t max_output_size() const NOEXCEPT { | ||||
return sponge_max_output_bytes(sp); | |||||
return decaf_sponge_max_output_bytes(sp); | |||||
} | } | ||||
/** Output the default number of bytes. */ | /** Output the default number of bytes. */ | ||||
@@ -104,17 +104,17 @@ public: | |||||
} | } | ||||
/** Reset the hash to the empty string */ | /** Reset the hash to the empty string */ | ||||
inline void reset() NOEXCEPT { sha3_reset(sp); } | |||||
inline void reset() NOEXCEPT { decaf_sha3_reset(sp); } | |||||
/** Destructor zeroizes state */ | /** Destructor zeroizes state */ | ||||
inline ~KeccakHash() NOEXCEPT { sponge_destroy(sp); } | |||||
inline ~KeccakHash() NOEXCEPT { decaf_sponge_destroy(sp); } | |||||
}; | }; | ||||
/** Fixed-output-length SHA3 */ | /** Fixed-output-length SHA3 */ | ||||
template<int bits> class SHA3 : public KeccakHash { | template<int bits> class SHA3 : public KeccakHash { | ||||
private: | private: | ||||
/** Get the parameter template block for this hash */ | /** Get the parameter template block for this hash */ | ||||
static inline const struct kparams_s *get_params(); | |||||
static inline const struct decaf_kparams_s *get_params(); | |||||
public: | public: | ||||
/** Number of bytes of output */ | /** Number of bytes of output */ | ||||
@@ -142,7 +142,7 @@ template<int bits> | |||||
class SHAKE : public KeccakHash { | class SHAKE : public KeccakHash { | ||||
private: | private: | ||||
/** Get the parameter template block for this hash */ | /** Get the parameter template block for this hash */ | ||||
static inline const struct kparams_s *get_params(); | |||||
static inline const struct decaf_kparams_s *get_params(); | |||||
public: | public: | ||||
/** Number of bytes of output */ | /** Number of bytes of output */ | ||||
@@ -165,12 +165,12 @@ public: | |||||
}; | }; | ||||
/** @cond internal */ | /** @cond internal */ | ||||
template<> inline const struct kparams_s *SHAKE<128>::get_params() { return &SHAKE128_params_s; } | |||||
template<> inline const struct kparams_s *SHAKE<256>::get_params() { return &SHAKE256_params_s; } | |||||
template<> inline const struct kparams_s *SHA3<224>::get_params() { return &SHA3_224_params_s; } | |||||
template<> inline const struct kparams_s *SHA3<256>::get_params() { return &SHA3_256_params_s; } | |||||
template<> inline const struct kparams_s *SHA3<384>::get_params() { return &SHA3_384_params_s; } | |||||
template<> inline const struct kparams_s *SHA3<512>::get_params() { return &SHA3_512_params_s; } | |||||
template<> inline const struct decaf_kparams_s *SHAKE<128>::get_params() { return &DECAF_SHAKE128_params_s; } | |||||
template<> inline const struct decaf_kparams_s *SHAKE<256>::get_params() { return &DECAF_SHAKE256_params_s; } | |||||
template<> inline const struct decaf_kparams_s *SHA3<224>::get_params() { return &DECAF_SHA3_224_params_s; } | |||||
template<> inline const struct decaf_kparams_s *SHA3<256>::get_params() { return &DECAF_SHA3_256_params_s; } | |||||
template<> inline const struct decaf_kparams_s *SHA3<384>::get_params() { return &DECAF_SHA3_384_params_s; } | |||||
template<> inline const struct decaf_kparams_s *SHA3<512>::get_params() { return &DECAF_SHA3_512_params_s; } | |||||
/** @endcond */ | /** @endcond */ | ||||
} /* namespace decaf */ | } /* namespace decaf */ | ||||
@@ -20,15 +20,15 @@ extern "C" { | |||||
/** Keccak CSPRNG structure as struct. */ | /** Keccak CSPRNG structure as struct. */ | ||||
typedef struct { | typedef struct { | ||||
keccak_sponge_t sponge; /**< Internal sponge object. */ | |||||
} keccak_prng_s; | |||||
decaf_keccak_sponge_t sponge; /**< Internal sponge object. */ | |||||
} decaf_keccak_prng_s; | |||||
/** Keccak CSPRNG structure as one-element array */ | /** Keccak CSPRNG structure as one-element array */ | ||||
typedef keccak_prng_s keccak_prng_t[1]; | |||||
typedef decaf_keccak_prng_s decaf_keccak_prng_t[1]; | |||||
/** Initialize a sponge-based CSPRNG from a buffer. */ | /** Initialize a sponge-based CSPRNG from a buffer. */ | ||||
void spongerng_init_from_buffer ( | |||||
keccak_prng_t prng, /**< [out] The PRNG object. */ | |||||
void decaf_spongerng_init_from_buffer ( | |||||
decaf_keccak_prng_t prng, /**< [out] The PRNG object. */ | |||||
const uint8_t *__restrict__ in, /**< [in] The initialization data. */ | const uint8_t *__restrict__ in, /**< [in] The initialization data. */ | ||||
size_t len, /**< [in] The length of the initialization data. */ | size_t len, /**< [in] The length of the initialization data. */ | ||||
int deterministic /**< [in] If zero, allow RNG to stir in nondeterministic data from RDRAND or RDTSC.*/ | int deterministic /**< [in] If zero, allow RNG to stir in nondeterministic data from RDRAND or RDTSC.*/ | ||||
@@ -40,8 +40,8 @@ void spongerng_init_from_buffer ( | |||||
* @retval DECAF_FAILURE failure. | * @retval DECAF_FAILURE failure. | ||||
* @note On failure, errno can be used to determine the cause. | * @note On failure, errno can be used to determine the cause. | ||||
*/ | */ | ||||
decaf_error_t spongerng_init_from_file ( | |||||
keccak_prng_t prng, /**< [out] The PRNG object. */ | |||||
decaf_error_t decaf_spongerng_init_from_file ( | |||||
decaf_keccak_prng_t prng, /**< [out] The PRNG object. */ | |||||
const char *file, /**< [in] A name of a file containing initial data. */ | const char *file, /**< [in] A name of a file containing initial data. */ | ||||
size_t len, /**< [in] The length of the initial data. Must be positive. */ | size_t len, /**< [in] The length of the initial data. Must be positive. */ | ||||
int deterministic /**< [in] If zero, allow RNG to stir in nondeterministic data from RDRAND or RDTSC. */ | int deterministic /**< [in] If zero, allow RNG to stir in nondeterministic data from RDRAND or RDTSC. */ | ||||
@@ -53,36 +53,36 @@ decaf_error_t spongerng_init_from_file ( | |||||
* @retval DECAF_FAILURE failure. | * @retval DECAF_FAILURE failure. | ||||
* @note On failure, errno can be used to determine the cause. | * @note On failure, errno can be used to determine the cause. | ||||
*/ | */ | ||||
decaf_error_t spongerng_init_from_dev_urandom ( | |||||
keccak_prng_t prng /**< [out] sponge The sponge object. */ | |||||
decaf_error_t decaf_spongerng_init_from_dev_urandom ( | |||||
decaf_keccak_prng_t prng /**< [out] sponge The sponge object. */ | |||||
) API_VIS WARN_UNUSED; | ) API_VIS WARN_UNUSED; | ||||
/** Output bytes from a sponge-based CSPRNG. */ | /** Output bytes from a sponge-based CSPRNG. */ | ||||
void spongerng_next ( | |||||
keccak_prng_t prng, /**< [inout] The PRNG object. */ | |||||
void decaf_spongerng_next ( | |||||
decaf_keccak_prng_t prng, /**< [inout] The PRNG object. */ | |||||
uint8_t * __restrict__ out, /**< [out] Output buffer. */ | uint8_t * __restrict__ out, /**< [out] Output buffer. */ | ||||
size_t len /**< [in] Number of bytes to output. */ | size_t len /**< [in] Number of bytes to output. */ | ||||
) API_VIS; | ) API_VIS; | ||||
/** Stir entropy data into a sponge-based CSPRNG from a buffer. */ | /** Stir entropy data into a sponge-based CSPRNG from a buffer. */ | ||||
void spongerng_stir ( | |||||
keccak_prng_t prng, /**< [out] The PRNG object. */ | |||||
void decaf_spongerng_stir ( | |||||
decaf_keccak_prng_t prng, /**< [out] The PRNG object. */ | |||||
const uint8_t * __restrict__ in, /**< [in] The entropy data. */ | const uint8_t * __restrict__ in, /**< [in] The entropy data. */ | ||||
size_t len /**< [in] The length of the initial data. */ | size_t len /**< [in] The length of the initial data. */ | ||||
) NONNULL API_VIS; | ) NONNULL API_VIS; | ||||
/** Securely destroy a sponge RNG object by overwriting it. */ | /** Securely destroy a sponge RNG object by overwriting it. */ | ||||
static INLINE UNUSED void | static INLINE UNUSED void | ||||
spongerng_destroy ( | |||||
keccak_prng_t doomed /**< [in] The object to destroy. */ | |||||
decaf_spongerng_destroy ( | |||||
decaf_keccak_prng_t doomed /**< [in] The object to destroy. */ | |||||
); | ); | ||||
/** @cond internal */ | /** @cond internal */ | ||||
/***************************************/ | /***************************************/ | ||||
/* Implementations of inline functions */ | /* Implementations of inline functions */ | ||||
/***************************************/ | /***************************************/ | ||||
void spongerng_destroy (keccak_prng_t doomed) { | |||||
sponge_destroy(doomed->sponge); | |||||
void decaf_spongerng_destroy (decaf_keccak_prng_t doomed) { | |||||
decaf_sponge_destroy(doomed->sponge); | |||||
} | } | ||||
/** @endcond */ /* internal */ | /** @endcond */ /* internal */ | ||||
@@ -38,7 +38,7 @@ namespace decaf { | |||||
class SpongeRng : public Rng { | class SpongeRng : public Rng { | ||||
private: | private: | ||||
/** C wrapped object */ | /** C wrapped object */ | ||||
keccak_prng_t sp; | |||||
decaf_keccak_prng_t sp; | |||||
public: | public: | ||||
/** Deterministic flag. | /** Deterministic flag. | ||||
@@ -61,13 +61,13 @@ public: | |||||
/** Initialize, deterministically by default, from block */ | /** Initialize, deterministically by default, from block */ | ||||
inline SpongeRng( const Block &in, Deterministic det ) { | inline SpongeRng( const Block &in, Deterministic det ) { | ||||
spongerng_init_from_buffer(sp,in.data(),in.size(),(int)det); | |||||
decaf_spongerng_init_from_buffer(sp,in.data(),in.size(),(int)det); | |||||
} | } | ||||
/** Initialize, non-deterministically by default, from C/C++ filename */ | /** Initialize, non-deterministically by default, from C/C++ filename */ | ||||
inline SpongeRng( const std::string &in = "/dev/urandom", size_t len = 32, Deterministic det = RANDOM ) | inline SpongeRng( const std::string &in = "/dev/urandom", size_t len = 32, Deterministic det = RANDOM ) | ||||
throw(RngException) { | throw(RngException) { | ||||
decaf_error_t ret = spongerng_init_from_file(sp,in.c_str(),len,det); | |||||
decaf_error_t ret = decaf_spongerng_init_from_file(sp,in.c_str(),len,det); | |||||
if (!decaf_successful(ret)) { | if (!decaf_successful(ret)) { | ||||
throw RngException(errno, "Couldn't load from file"); | throw RngException(errno, "Couldn't load from file"); | ||||
} | } | ||||
@@ -75,11 +75,11 @@ public: | |||||
/** Stir in new data */ | /** Stir in new data */ | ||||
inline void stir( const Block &data ) NOEXCEPT { | inline void stir( const Block &data ) NOEXCEPT { | ||||
spongerng_stir(sp,data.data(),data.size()); | |||||
decaf_spongerng_stir(sp,data.data(),data.size()); | |||||
} | } | ||||
/** Securely destroy by overwriting state. */ | /** Securely destroy by overwriting state. */ | ||||
inline ~SpongeRng() NOEXCEPT { spongerng_destroy(sp); } | |||||
inline ~SpongeRng() NOEXCEPT { decaf_spongerng_destroy(sp); } | |||||
using Rng::read; | using Rng::read; | ||||
@@ -88,7 +88,7 @@ public: | |||||
#if __cplusplus >= 201103L | #if __cplusplus >= 201103L | ||||
final | final | ||||
#endif | #endif | ||||
{ spongerng_next(sp,buffer.data(),buffer.size()); } | |||||
{ decaf_spongerng_next(sp,buffer.data(),buffer.size()); } | |||||
private: | private: | ||||
SpongeRng(const SpongeRng &) DELETE; | SpongeRng(const SpongeRng &) DELETE; | ||||
@@ -19,29 +19,29 @@ extern "C" { | |||||
/** Keccak STROBE structure as struct. */ | /** Keccak STROBE structure as struct. */ | ||||
typedef struct { | typedef struct { | ||||
keccak_sponge_t sponge; /**< Internal sponge object. */ | |||||
decaf_keccak_sponge_t sponge; /**< Internal sponge object. */ | |||||
} keccak_strobe_s; | } keccak_strobe_s; | ||||
/** Keccak STROBE structure as one-element array */ | /** Keccak STROBE structure as one-element array */ | ||||
typedef keccak_strobe_s keccak_strobe_t[1]; | typedef keccak_strobe_s keccak_strobe_t[1]; | ||||
/** STROBE parameters, 128-bit estimated security for hashing and encryption */ | /** STROBE parameters, 128-bit estimated security for hashing and encryption */ | ||||
extern const struct kparams_s STROBE_128 API_VIS; | |||||
extern const struct decaf_kparams_s STROBE_128 API_VIS; | |||||
/** STROBE parameters, 256-bit estimated security for hashing and encryption */ | /** STROBE parameters, 256-bit estimated security for hashing and encryption */ | ||||
extern const struct kparams_s STROBE_256 API_VIS; | |||||
extern const struct decaf_kparams_s STROBE_256 API_VIS; | |||||
/** STROBE parameters, 128-bit estimated security for encryption only (not hashing) */ | /** STROBE parameters, 128-bit estimated security for encryption only (not hashing) */ | ||||
extern const struct kparams_s STROBE_KEYED_128 API_VIS; | |||||
extern const struct decaf_kparams_s STROBE_KEYED_128 API_VIS; | |||||
/** STROBE parameters, 256-bit estimated security for encryption only (not hashing) */ | /** STROBE parameters, 256-bit estimated security for encryption only (not hashing) */ | ||||
extern const struct kparams_s STROBE_KEYED_256 API_VIS; | |||||
extern const struct decaf_kparams_s STROBE_KEYED_256 API_VIS; | |||||
/** Initialize Strobe protocol context. */ | /** Initialize Strobe protocol context. */ | ||||
void strobe_init ( | void strobe_init ( | ||||
keccak_strobe_t strobe, /**< [out] The uninitialized strobe object. */ | keccak_strobe_t strobe, /**< [out] The uninitialized strobe object. */ | ||||
const struct kparams_s *params, /**< [in] Parameter set descriptor. */ | |||||
const struct decaf_kparams_s *params, /**< [in] Parameter set descriptor. */ | |||||
const char *proto, /**< [in] Unique identifier for the protocol. TODO: define namespaces for this */ | const char *proto, /**< [in] Unique identifier for the protocol. TODO: define namespaces for this */ | ||||
uint8_t am_client /**< [in] Nonzero if this party. */ | uint8_t am_client /**< [in] Nonzero if this party. */ | ||||
) NONNULL API_VIS; | ) NONNULL API_VIS; | ||||
@@ -158,7 +158,7 @@ static inline void NONNULL strobe_prng ( | |||||
/** Respecify Strobe protocol object's crypto. */ | /** Respecify Strobe protocol object's crypto. */ | ||||
void strobe_respec ( | void strobe_respec ( | ||||
keccak_strobe_t strobe, /**< [inout] The initialized strobe context. */ | keccak_strobe_t strobe, /**< [inout] The initialized strobe context. */ | ||||
const struct kparams_s *params /**< [in] Strobe parameter descriptor. */ | |||||
const struct decaf_kparams_s *params /**< [in] Strobe parameter descriptor. */ | |||||
) NONNULL API_VIS; | ) NONNULL API_VIS; | ||||
/** Securely destroy a STROBE object by overwriting it. */ | /** Securely destroy a STROBE object by overwriting it. */ | ||||
@@ -329,7 +329,7 @@ void strobe_prng(keccak_strobe_t strobe, unsigned char *out, uint16_t len) { | |||||
} | } | ||||
void strobe_destroy (keccak_strobe_t doomed) { | void strobe_destroy (keccak_strobe_t doomed) { | ||||
sponge_destroy(doomed->sponge); | |||||
decaf_sponge_destroy(doomed->sponge); | |||||
} | } | ||||
/** @endcond */ /* internal */ | /** @endcond */ /* internal */ | ||||
@@ -53,7 +53,7 @@ public: | |||||
inline Strobe ( | inline Strobe ( | ||||
const char *description, /**< Description of this protocol. */ | const char *description, /**< Description of this protocol. */ | ||||
client_or_server whoami, /**< Am I client or server? */ | client_or_server whoami, /**< Am I client or server? */ | ||||
const kparams_s ¶ms = STROBE_256 /**< Strength parameters */ | |||||
const decaf_kparams_s ¶ms = STROBE_256 /**< Strength parameters */ | |||||
) NOEXCEPT { | ) NOEXCEPT { | ||||
strobe_init(wrapped, ¶ms, description, whoami == CLIENT); | strobe_init(wrapped, ¶ms, description, whoami == CLIENT); | ||||
keyed = false; | keyed = false; | ||||
@@ -222,7 +222,7 @@ public: | |||||
/** Change specs, perhaps to a faster spec that takes advantage of being keyed. | /** Change specs, perhaps to a faster spec that takes advantage of being keyed. | ||||
* @warning Experimental. | * @warning Experimental. | ||||
*/ | */ | ||||
inline void respec(const kparams_s ¶ms) throw(ProtocolException) { | |||||
inline void respec(const decaf_kparams_s ¶ms) throw(ProtocolException) { | |||||
if (!keyed) throw(ProtocolException()); | if (!keyed) throw(ProtocolException()); | ||||
strobe_respec(wrapped, ¶ms); | strobe_respec(wrapped, ¶ms); | ||||
} | } | ||||
@@ -64,7 +64,7 @@ static uint64_t load_bigendian(const uint8_t *x) | |||||
b = a; \ | b = a; \ | ||||
a = T1 + T2; | a = T1 + T2; | ||||
static NOINLINE void hashblock(sha512_ctx_t ctx) { | |||||
static NOINLINE void hashblock(decaf_sha512_ctx_t ctx) { | |||||
const uint8_t *in = ctx->block; | const uint8_t *in = ctx->block; | ||||
uint64_t a = ctx->state[0]; | uint64_t a = ctx->state[0]; | ||||
uint64_t b = ctx->state[1]; | uint64_t b = ctx->state[1]; | ||||
@@ -197,7 +197,7 @@ static NOINLINE void hashblock(sha512_ctx_t ctx) { | |||||
ctx->state[7] += h; | ctx->state[7] += h; | ||||
} | } | ||||
void sha512_init(sha512_ctx_t ctx) { | |||||
void decaf_sha512_init(decaf_sha512_ctx_t ctx) { | |||||
static const uint64_t iv[8] = { | static const uint64_t iv[8] = { | ||||
0x6a09e667f3bcc908, | 0x6a09e667f3bcc908, | ||||
0xbb67ae8584caa73b, | 0xbb67ae8584caa73b, | ||||
@@ -210,16 +210,16 @@ void sha512_init(sha512_ctx_t ctx) { | |||||
}; | }; | ||||
memcpy(ctx->state,iv,sizeof(iv)); | memcpy(ctx->state,iv,sizeof(iv)); | ||||
memset(ctx->block,0,sizeof(ctx->block)); | memset(ctx->block,0,sizeof(ctx->block)); | ||||
ctx->bytesProcessed = 0; | |||||
ctx->bytes_processed = 0; | |||||
} | } | ||||
void sha512_update(sha512_ctx_t ctx, const uint8_t *message, size_t length) { | |||||
void decaf_sha512_update(decaf_sha512_ctx_t ctx, const uint8_t *message, size_t length) { | |||||
while (length > 0) { | while (length > 0) { | ||||
size_t grab = length, off = ctx->bytesProcessed % 128; | |||||
size_t grab = length, off = ctx->bytes_processed % 128; | |||||
if (grab > 128-off) grab = 128-off; | if (grab > 128-off) grab = 128-off; | ||||
memcpy(&ctx->block[off], message, grab); | memcpy(&ctx->block[off], message, grab); | ||||
ctx->bytesProcessed += grab; | |||||
ctx->bytes_processed += grab; | |||||
length -= grab; | length -= grab; | ||||
message += grab; | message += grab; | ||||
@@ -229,10 +229,10 @@ void sha512_update(sha512_ctx_t ctx, const uint8_t *message, size_t length) { | |||||
} | } | ||||
} | } | ||||
void sha512_final(sha512_ctx_t ctx, uint8_t *out, size_t length) { | |||||
void decaf_sha512_final(decaf_sha512_ctx_t ctx, uint8_t *out, size_t length) { | |||||
assert(length <= 512/8); | assert(length <= 512/8); | ||||
size_t off = ctx->bytesProcessed % 128, bp = ctx->bytesProcessed * 8; | |||||
size_t off = ctx->bytes_processed % 128, bp = ctx->bytes_processed * 8; | |||||
ctx->block[off] = 0x80; | ctx->block[off] = 0x80; | ||||
memset(&ctx->block[off+1], 0, 128-off-1); | memset(&ctx->block[off+1], 0, 128-off-1); | ||||
@@ -249,5 +249,5 @@ void sha512_final(sha512_ctx_t ctx, uint8_t *out, size_t length) { | |||||
out[i] = ctx->state[i/8] >> (56 - 8*(i%8)); | out[i] = ctx->state[i/8] >> (56 - 8*(i%8)); | ||||
} | } | ||||
sha512_init(ctx); | |||||
decaf_sha512_init(ctx); | |||||
} | } |
@@ -51,19 +51,19 @@ | |||||
# error platform not supported | # error platform not supported | ||||
#endif | #endif | ||||
/* The internal, non-opaque definition of the sponge struct. */ | |||||
/* The internal, non-opaque definition of the decaf_sponge struct. */ | |||||
typedef union { | typedef union { | ||||
uint64_t w[25]; uint8_t b[25*8]; | uint64_t w[25]; uint8_t b[25*8]; | ||||
} kdomain_t[1]; | } kdomain_t[1]; | ||||
typedef struct kparams_s { | |||||
uint8_t position, flags, rate, startRound, pad, ratePad, maxOut, client; /* client = maxOutRemaining for sha3 */ | |||||
} kparams_t[1]; | |||||
typedef struct decaf_kparams_s { | |||||
uint8_t position, flags, rate, start_round, pad, rate_pad, max_out, client; /* client = max_outRemaining for decaf_sha3 */ | |||||
} decaf_kparams_t[1]; | |||||
typedef struct keccak_sponge_s { | |||||
typedef struct decaf_keccak_sponge_s { | |||||
kdomain_t state; | kdomain_t state; | ||||
kparams_t params; | |||||
} keccak_sponge_s, keccak_sponge_t[1]; | |||||
decaf_kparams_t params; | |||||
} decaf_keccak_sponge_s, decaf_keccak_sponge_t[1]; | |||||
#define INTERNAL_SPONGE_STRUCT 1 | #define INTERNAL_SPONGE_STRUCT 1 | ||||
#include <decaf/shake.h> | #include <decaf/shake.h> | ||||
@@ -106,14 +106,14 @@ static inline uint64_t rol(uint64_t x, int s) { | |||||
/*** The Keccak-f[1600] permutation ***/ | /*** The Keccak-f[1600] permutation ***/ | ||||
static void | static void | ||||
__attribute__((noinline)) | __attribute__((noinline)) | ||||
keccakf(kdomain_t state, uint8_t startRound) { | |||||
keccakf(kdomain_t state, uint8_t start_round) { | |||||
uint64_t* a = state->w; | uint64_t* a = state->w; | ||||
uint64_t b[5] = {0}, t, u; | uint64_t b[5] = {0}, t, u; | ||||
uint8_t x, y, i; | uint8_t x, y, i; | ||||
for (i=0; i<25; i++) a[i] = le64toh(a[i]); | for (i=0; i<25; i++) a[i] = le64toh(a[i]); | ||||
for (i = startRound; i < 24; i++) { | |||||
for (i = start_round; i < 24; i++) { | |||||
FOR51(x, b[x] = 0; ) | FOR51(x, b[x] = 0; ) | ||||
FOR55(y, FOR51(x, b[x] ^= a[x + y]; )) | FOR55(y, FOR51(x, b[x] ^= a[x + y]; )) | ||||
FOR55(y, FOR51(x, | FOR55(y, FOR51(x, | ||||
@@ -135,57 +135,57 @@ keccakf(kdomain_t state, uint8_t startRound) { | |||||
for (i=0; i<25; i++) a[i] = htole64(a[i]); | for (i=0; i<25; i++) a[i] = htole64(a[i]); | ||||
} | } | ||||
static inline void dokeccak (keccak_sponge_t sponge) { | |||||
keccakf(sponge->state, sponge->params->startRound); | |||||
sponge->params->position = 0; | |||||
static inline void dokeccak (decaf_keccak_sponge_t decaf_sponge) { | |||||
keccakf(decaf_sponge->state, decaf_sponge->params->start_round); | |||||
decaf_sponge->params->position = 0; | |||||
} | } | ||||
void sha3_update ( | |||||
struct keccak_sponge_s * __restrict__ sponge, | |||||
void decaf_sha3_update ( | |||||
struct decaf_keccak_sponge_s * __restrict__ decaf_sponge, | |||||
const uint8_t *in, | const uint8_t *in, | ||||
size_t len | size_t len | ||||
) { | ) { | ||||
if (!len) return; | if (!len) return; | ||||
assert(sponge->params->position < sponge->params->rate); | |||||
assert(sponge->params->rate < sizeof(sponge->state)); | |||||
assert(sponge->params->flags == FLAG_ABSORBING); | |||||
assert(decaf_sponge->params->position < decaf_sponge->params->rate); | |||||
assert(decaf_sponge->params->rate < sizeof(decaf_sponge->state)); | |||||
assert(decaf_sponge->params->flags == FLAG_ABSORBING); | |||||
while (len) { | while (len) { | ||||
size_t cando = sponge->params->rate - sponge->params->position, i; | |||||
uint8_t* state = &sponge->state->b[sponge->params->position]; | |||||
size_t cando = decaf_sponge->params->rate - decaf_sponge->params->position, i; | |||||
uint8_t* state = &decaf_sponge->state->b[decaf_sponge->params->position]; | |||||
if (cando > len) { | if (cando > len) { | ||||
for (i = 0; i < len; i += 1) state[i] ^= in[i]; | for (i = 0; i < len; i += 1) state[i] ^= in[i]; | ||||
sponge->params->position += len; | |||||
decaf_sponge->params->position += len; | |||||
return; | return; | ||||
} else { | } else { | ||||
for (i = 0; i < cando; i += 1) state[i] ^= in[i]; | for (i = 0; i < cando; i += 1) state[i] ^= in[i]; | ||||
dokeccak(sponge); | |||||
dokeccak(decaf_sponge); | |||||
len -= cando; | len -= cando; | ||||
in += cando; | in += cando; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
void sha3_output ( | |||||
keccak_sponge_t sponge, | |||||
void decaf_sha3_output ( | |||||
decaf_keccak_sponge_t decaf_sponge, | |||||
uint8_t * __restrict__ out, | uint8_t * __restrict__ out, | ||||
size_t len | size_t len | ||||
) { | ) { | ||||
assert(sponge->params->position < sponge->params->rate); | |||||
assert(sponge->params->rate < sizeof(sponge->state)); | |||||
assert(decaf_sponge->params->position < decaf_sponge->params->rate); | |||||
assert(decaf_sponge->params->rate < sizeof(decaf_sponge->state)); | |||||
if (sponge->params->maxOut != 0xFF) { | |||||
assert(sponge->params->client >= len); | |||||
sponge->params->client -= len; | |||||
if (decaf_sponge->params->max_out != 0xFF) { | |||||
assert(decaf_sponge->params->client >= len); | |||||
decaf_sponge->params->client -= len; | |||||
} | } | ||||
switch (sponge->params->flags) { | |||||
switch (decaf_sponge->params->flags) { | |||||
case FLAG_SQUEEZING: break; | case FLAG_SQUEEZING: break; | ||||
case FLAG_ABSORBING: | case FLAG_ABSORBING: | ||||
{ | { | ||||
uint8_t* state = sponge->state->b; | |||||
state[sponge->params->position] ^= sponge->params->pad; | |||||
state[sponge->params->rate - 1] ^= sponge->params->ratePad; | |||||
dokeccak(sponge); | |||||
uint8_t* state = decaf_sponge->state->b; | |||||
state[decaf_sponge->params->position] ^= decaf_sponge->params->pad; | |||||
state[decaf_sponge->params->rate - 1] ^= decaf_sponge->params->rate_pad; | |||||
dokeccak(decaf_sponge); | |||||
break; | break; | ||||
} | } | ||||
default: | default: | ||||
@@ -193,82 +193,82 @@ void sha3_output ( | |||||
} | } | ||||
while (len) { | while (len) { | ||||
size_t cando = sponge->params->rate - sponge->params->position; | |||||
uint8_t* state = &sponge->state->b[sponge->params->position]; | |||||
size_t cando = decaf_sponge->params->rate - decaf_sponge->params->position; | |||||
uint8_t* state = &decaf_sponge->state->b[decaf_sponge->params->position]; | |||||
if (cando > len) { | if (cando > len) { | ||||
memcpy(out, state, len); | memcpy(out, state, len); | ||||
sponge->params->position += len; | |||||
decaf_sponge->params->position += len; | |||||
return; | return; | ||||
} else { | } else { | ||||
memcpy(out, state, cando); | memcpy(out, state, cando); | ||||
dokeccak(sponge); | |||||
dokeccak(decaf_sponge); | |||||
len -= cando; | len -= cando; | ||||
out += cando; | out += cando; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
void sha3_final ( | |||||
keccak_sponge_t sponge, | |||||
void decaf_sha3_final ( | |||||
decaf_keccak_sponge_t decaf_sponge, | |||||
uint8_t * __restrict__ out, | uint8_t * __restrict__ out, | ||||
size_t len | size_t len | ||||
) { | ) { | ||||
sha3_output(sponge,out,len); | |||||
sha3_reset(sponge); | |||||
decaf_sha3_output(decaf_sponge,out,len); | |||||
decaf_sha3_reset(decaf_sponge); | |||||
} | } | ||||
void sha3_reset ( | |||||
keccak_sponge_t sponge | |||||
void decaf_sha3_reset ( | |||||
decaf_keccak_sponge_t decaf_sponge | |||||
) { | ) { | ||||
sponge_init(sponge, sponge->params); | |||||
sponge->params->client = sponge->params->maxOut; | |||||
decaf_sponge_init(decaf_sponge, decaf_sponge->params); | |||||
decaf_sponge->params->client = decaf_sponge->params->max_out; | |||||
} | } | ||||
void sponge_destroy (keccak_sponge_t sponge) { decaf_bzero(sponge, sizeof(keccak_sponge_t)); } | |||||
void decaf_sponge_destroy (decaf_keccak_sponge_t decaf_sponge) { decaf_bzero(decaf_sponge, sizeof(decaf_keccak_sponge_t)); } | |||||
void sponge_init ( | |||||
keccak_sponge_t sponge, | |||||
const struct kparams_s *params | |||||
void decaf_sponge_init ( | |||||
decaf_keccak_sponge_t decaf_sponge, | |||||
const struct decaf_kparams_s *params | |||||
) { | ) { | ||||
memset(sponge->state, 0, sizeof(sponge->state)); | |||||
sponge->params[0] = params[0]; | |||||
sponge->params->position = 0; | |||||
memset(decaf_sponge->state, 0, sizeof(decaf_sponge->state)); | |||||
decaf_sponge->params[0] = params[0]; | |||||
decaf_sponge->params->position = 0; | |||||
} | } | ||||
void sponge_hash ( | |||||
void decaf_sponge_hash ( | |||||
const uint8_t *in, | const uint8_t *in, | ||||
size_t inlen, | size_t inlen, | ||||
uint8_t *out, | uint8_t *out, | ||||
size_t outlen, | size_t outlen, | ||||
const struct kparams_s *params | |||||
const struct decaf_kparams_s *params | |||||
) { | ) { | ||||
keccak_sponge_t sponge; | |||||
sponge_init(sponge, params); | |||||
sha3_update(sponge, in, inlen); | |||||
sha3_output(sponge, out, outlen); | |||||
sponge_destroy(sponge); | |||||
decaf_keccak_sponge_t decaf_sponge; | |||||
decaf_sponge_init(decaf_sponge, params); | |||||
decaf_sha3_update(decaf_sponge, in, inlen); | |||||
decaf_sha3_output(decaf_sponge, out, outlen); | |||||
decaf_sponge_destroy(decaf_sponge); | |||||
} | } | ||||
#define DEFSHAKE(n) \ | #define DEFSHAKE(n) \ | ||||
const struct kparams_s SHAKE##n##_params_s = \ | |||||
const struct decaf_kparams_s DECAF_SHAKE##n##_params_s = \ | |||||
{ 0, FLAG_ABSORBING, 200-n/4, 0, 0x1f, 0x80, 0xFF, 0xFF }; | { 0, FLAG_ABSORBING, 200-n/4, 0, 0x1f, 0x80, 0xFF, 0xFF }; | ||||
#define DEFSHA3(n) \ | #define DEFSHA3(n) \ | ||||
const struct kparams_s SHA3_##n##_params_s = \ | |||||
const struct decaf_kparams_s DECAF_SHA3_##n##_params_s = \ | |||||
{ 0, FLAG_ABSORBING, 200-n/4, 0, 0x06, 0x80, n/8, n/8 }; | { 0, FLAG_ABSORBING, 200-n/4, 0, 0x06, 0x80, n/8, n/8 }; | ||||
size_t sponge_default_output_bytes ( | |||||
const keccak_sponge_t s | |||||
size_t decaf_sponge_default_output_bytes ( | |||||
const decaf_keccak_sponge_t s | |||||
) { | ) { | ||||
return (s->params->maxOut == 0xFF) | |||||
return (s->params->max_out == 0xFF) | |||||
? (200-s->params->rate) | ? (200-s->params->rate) | ||||
: ((200-s->params->rate)/2); | : ((200-s->params->rate)/2); | ||||
} | } | ||||
size_t sponge_max_output_bytes ( | |||||
const keccak_sponge_t s | |||||
size_t decaf_sponge_max_output_bytes ( | |||||
const decaf_keccak_sponge_t s | |||||
) { | ) { | ||||
return (s->params->maxOut == 0xFF) | |||||
return (s->params->max_out == 0xFF) | |||||
? SIZE_MAX | ? SIZE_MAX | ||||
: ((200-s->params->rate)/2); | : ((200-s->params->rate)/2); | ||||
} | } | ||||
@@ -318,55 +318,55 @@ static void get_cpu_entropy(uint8_t *entropy, size_t len) { | |||||
#endif | #endif | ||||
} | } | ||||
static const char *SPONGERNG_NAME = "strobe::spongerng"; /* TODO: canonicalize name */ | |||||
static const char *SPONGERNG_NAME = "strobe::decaf_spongerng"; /* TODO: canonicalize name */ | |||||
void spongerng_next ( | |||||
keccak_prng_t prng, | |||||
void decaf_spongerng_next ( | |||||
decaf_keccak_prng_t prng, | |||||
uint8_t * __restrict__ out, | uint8_t * __restrict__ out, | ||||
size_t len | size_t len | ||||
) { | ) { | ||||
keccak_sponge_s *sponge = prng->sponge; | |||||
if (sponge->params->client) { | |||||
decaf_keccak_sponge_s *decaf_sponge = prng->sponge; | |||||
if (decaf_sponge->params->client) { | |||||
/* nondet */ | /* nondet */ | ||||
uint8_t cpu_entropy[32]; | uint8_t cpu_entropy[32]; | ||||
get_cpu_entropy(cpu_entropy, sizeof(cpu_entropy)); | get_cpu_entropy(cpu_entropy, sizeof(cpu_entropy)); | ||||
strobe_transact((keccak_strobe_s*)sponge,NULL,cpu_entropy,sizeof(cpu_entropy),STROBE_CW_PRNG_CPU_SEED); | |||||
strobe_transact((keccak_strobe_s*)decaf_sponge,NULL,cpu_entropy,sizeof(cpu_entropy),STROBE_CW_PRNG_CPU_SEED); | |||||
} | } | ||||
strobe_transact((keccak_strobe_s*)sponge,out,NULL,len,STROBE_CW_PRNG); | |||||
strobe_transact((keccak_strobe_s*)decaf_sponge,out,NULL,len,STROBE_CW_PRNG); | |||||
} | } | ||||
void spongerng_stir ( | |||||
keccak_prng_t sponge, | |||||
void decaf_spongerng_stir ( | |||||
decaf_keccak_prng_t decaf_sponge, | |||||
const uint8_t * __restrict__ in, | const uint8_t * __restrict__ in, | ||||
size_t len | size_t len | ||||
) { | ) { | ||||
strobe_transact((keccak_strobe_s*)sponge,NULL,in,len,STROBE_CW_PRNG_USER_SEED); | |||||
strobe_transact((keccak_strobe_s*)decaf_sponge,NULL,in,len,STROBE_CW_PRNG_USER_SEED); | |||||
} | } | ||||
static const struct kparams_s spongerng_params = { | |||||
static const struct decaf_kparams_s decaf_spongerng_params = { | |||||
0, 0, 200-256/4, 0, 0x06, 0x80, 0xFF, 0 | 0, 0, 200-256/4, 0, 0x06, 0x80, 0xFF, 0 | ||||
}; | }; | ||||
void spongerng_init_from_buffer ( | |||||
keccak_prng_t prng, | |||||
void decaf_spongerng_init_from_buffer ( | |||||
decaf_keccak_prng_t prng, | |||||
const uint8_t * __restrict__ in, | const uint8_t * __restrict__ in, | ||||
size_t len, | size_t len, | ||||
int deterministic | int deterministic | ||||
) { | ) { | ||||
keccak_sponge_s *sponge = prng->sponge; | |||||
strobe_init((keccak_strobe_s*)sponge, &spongerng_params, SPONGERNG_NAME, !deterministic); | |||||
spongerng_stir(prng, in, len); | |||||
decaf_keccak_sponge_s *decaf_sponge = prng->sponge; | |||||
strobe_init((keccak_strobe_s*)decaf_sponge, &decaf_spongerng_params, SPONGERNG_NAME, !deterministic); | |||||
decaf_spongerng_stir(prng, in, len); | |||||
} | } | ||||
decaf_error_t spongerng_init_from_file ( | |||||
keccak_prng_t prng, | |||||
decaf_error_t decaf_spongerng_init_from_file ( | |||||
decaf_keccak_prng_t prng, | |||||
const char *file, | const char *file, | ||||
size_t len, | size_t len, | ||||
int deterministic | int deterministic | ||||
) { | ) { | ||||
keccak_sponge_s *sponge = prng->sponge; | |||||
strobe_init((keccak_strobe_s*)sponge, &spongerng_params, SPONGERNG_NAME, !deterministic); | |||||
decaf_keccak_sponge_s *decaf_sponge = prng->sponge; | |||||
strobe_init((keccak_strobe_s*)decaf_sponge, &decaf_spongerng_params, SPONGERNG_NAME, !deterministic); | |||||
if (!len) return DECAF_FAILURE; | if (!len) return DECAF_FAILURE; | ||||
int fd = open(file, O_RDONLY); | int fd = open(file, O_RDONLY); | ||||
@@ -380,7 +380,7 @@ decaf_error_t spongerng_init_from_file ( | |||||
close(fd); | close(fd); | ||||
return DECAF_FAILURE; | return DECAF_FAILURE; | ||||
} | } | ||||
strobe_transact((keccak_strobe_s*)sponge,NULL,buffer,red, | |||||
strobe_transact((keccak_strobe_s*)decaf_sponge,NULL,buffer,red, | |||||
first ? STROBE_CW_PRNG_USER_SEED : (STROBE_CW_PRNG_USER_SEED | STROBE_FLAG_MORE)); | first ? STROBE_CW_PRNG_USER_SEED : (STROBE_CW_PRNG_USER_SEED | STROBE_FLAG_MORE)); | ||||
len -= red; | len -= red; | ||||
first = 0; | first = 0; | ||||
@@ -390,39 +390,39 @@ decaf_error_t spongerng_init_from_file ( | |||||
return DECAF_SUCCESS; | return DECAF_SUCCESS; | ||||
} | } | ||||
decaf_error_t spongerng_init_from_dev_urandom ( | |||||
keccak_prng_t sponge | |||||
decaf_error_t decaf_spongerng_init_from_dev_urandom ( | |||||
decaf_keccak_prng_t decaf_sponge | |||||
) { | ) { | ||||
return spongerng_init_from_file(sponge, "/dev/urandom", 64, 0); | |||||
return decaf_spongerng_init_from_file(decaf_sponge, "/dev/urandom", 64, 0); | |||||
} | } | ||||
const struct kparams_s STROBE_128 = { 0, 0, 200-128/4, 0, 0, 0, 0, 0 }; | |||||
const struct kparams_s STROBE_256 = { 0, 0, 200-256/4, 0, 0, 0, 0, 0 }; | |||||
const struct kparams_s STROBE_KEYED_256 = { 0, 0, 200-256/4, 12, 0, 0, 0, 0 }; | |||||
const struct kparams_s STROBE_KEYED_128 = { 0, 0, 200-128/4, 12, 0, 0, 0, 0 }; | |||||
const struct decaf_kparams_s STROBE_128 = { 0, 0, 200-128/4, 0, 0, 0, 0, 0 }; | |||||
const struct decaf_kparams_s STROBE_256 = { 0, 0, 200-256/4, 0, 0, 0, 0, 0 }; | |||||
const struct decaf_kparams_s STROBE_KEYED_256 = { 0, 0, 200-256/4, 12, 0, 0, 0, 0 }; | |||||
const struct decaf_kparams_s STROBE_KEYED_128 = { 0, 0, 200-128/4, 12, 0, 0, 0, 0 }; | |||||
/* Strobe is different in that its rate is padded by one byte. */ | /* Strobe is different in that its rate is padded by one byte. */ | ||||
void strobe_init( | void strobe_init( | ||||
keccak_strobe_t strobe, | keccak_strobe_t strobe, | ||||
const struct kparams_s *params, | |||||
const struct decaf_kparams_s *params, | |||||
const char *proto, | const char *proto, | ||||
uint8_t am_client | uint8_t am_client | ||||
) { | ) { | ||||
keccak_sponge_s *sponge = strobe->sponge; | |||||
sponge_init(sponge,params); | |||||
decaf_keccak_sponge_s *decaf_sponge = strobe->sponge; | |||||
decaf_sponge_init(decaf_sponge,params); | |||||
const char *a_string = "STROBE full v0.2"; | const char *a_string = "STROBE full v0.2"; | ||||
unsigned len = strlen(a_string); | unsigned len = strlen(a_string); | ||||
memcpy ( | memcpy ( | ||||
&sponge->state->b[sizeof(sponge->state)-len], | |||||
&decaf_sponge->state->b[sizeof(decaf_sponge->state)-len], | |||||
a_string, | a_string, | ||||
len | len | ||||
); | ); | ||||
strobe_transact(strobe, NULL, (const unsigned char *)proto, strlen(proto), STROBE_CW_INIT); | strobe_transact(strobe, NULL, (const unsigned char *)proto, strlen(proto), STROBE_CW_INIT); | ||||
sponge->state->b[sponge->params->rate+1] = 1; | |||||
sponge->params->client = !!am_client; | |||||
decaf_sponge->state->b[decaf_sponge->params->rate+1] = 1; | |||||
decaf_sponge->params->client = !!am_client; | |||||
} | } | ||||
static const uint8_t EXCEEDED_RATE_PAD = 0x2; | static const uint8_t EXCEEDED_RATE_PAD = 0x2; | ||||
@@ -433,17 +433,17 @@ static __inline__ uint8_t CONTROL_WORD_PAD(int cw_size) { | |||||
/* PERF vectorize */ | /* PERF vectorize */ | ||||
static void strobe_duplex ( | static void strobe_duplex ( | ||||
struct keccak_sponge_s *__restrict__ sponge, | |||||
struct decaf_keccak_sponge_s *__restrict__ decaf_sponge, | |||||
unsigned char *out, | unsigned char *out, | ||||
const unsigned char *in, | const unsigned char *in, | ||||
size_t len, | size_t len, | ||||
mode_t mode | mode_t mode | ||||
) { | ) { | ||||
unsigned int j, r = sponge->params->rate, p = sponge->params->position; | |||||
uint8_t* __restrict__ state = &sponge->state->b[0]; | |||||
unsigned int j, r = decaf_sponge->params->rate, p = decaf_sponge->params->position; | |||||
uint8_t* __restrict__ state = &decaf_sponge->state->b[0]; | |||||
/* sanity */ | /* sanity */ | ||||
assert(r < sizeof(sponge->state) && r >= p); | |||||
assert(r < sizeof(decaf_sponge->state) && r >= p); | |||||
switch (mode) { | switch (mode) { | ||||
case STROBE_MODE_PLAINTEXT: | case STROBE_MODE_PLAINTEXT: | ||||
assert(in || len==0); | assert(in || len==0); | ||||
@@ -533,11 +533,11 @@ static void strobe_duplex ( | |||||
}; | }; | ||||
if (last) { | if (last) { | ||||
sponge->params->position = p+len; | |||||
decaf_sponge->params->position = p+len; | |||||
return; | return; | ||||
} else { | } else { | ||||
state[r] ^= EXCEEDED_RATE_PAD; | state[r] ^= EXCEEDED_RATE_PAD; | ||||
keccakf(sponge->state, sponge->params->startRound); | |||||
keccakf(decaf_sponge->state, decaf_sponge->params->start_round); | |||||
len -= cando; | len -= cando; | ||||
p = 0; | p = 0; | ||||
} | } | ||||
@@ -559,10 +559,10 @@ void strobe_transact ( | |||||
size_t len, | size_t len, | ||||
uint32_t cw_flags | uint32_t cw_flags | ||||
) { | ) { | ||||
keccak_sponge_s *sponge = strobe->sponge; | |||||
decaf_keccak_sponge_s *decaf_sponge = strobe->sponge; | |||||
if ( (cw_flags & STROBE_FLAG_NONDIR) == 0 | if ( (cw_flags & STROBE_FLAG_NONDIR) == 0 | ||||
/* extraneous nots to change ints to bools :-/ */ | /* extraneous nots to change ints to bools :-/ */ | ||||
&& !(cw_flags & STROBE_FLAG_RECV) != !(sponge->params->client) ) { | |||||
&& !(cw_flags & STROBE_FLAG_RECV) != !(decaf_sponge->params->client) ) { | |||||
cw_flags ^= STROBE_FLAG_CLIENT_SENT; | cw_flags ^= STROBE_FLAG_CLIENT_SENT; | ||||
} | } | ||||
@@ -588,30 +588,30 @@ void strobe_transact ( | |||||
my_len>>48, | my_len>>48, | ||||
my_len>>56 | my_len>>56 | ||||
}; | }; | ||||
strobe_duplex(sponge, NULL, cwb, len_cw, STROBE_MODE_ABSORB_R); | |||||
if ((cw_flags & STROBE_FLAG_RUN_F) || (sponge->params->flags & FLAG_NOPARSE)) { | |||||
sponge->state->b[sponge->params->position] ^= CONTROL_WORD_PAD(len_cw); | |||||
dokeccak(sponge); | |||||
strobe_duplex(decaf_sponge, NULL, cwb, len_cw, STROBE_MODE_ABSORB_R); | |||||
if ((cw_flags & STROBE_FLAG_RUN_F) || (decaf_sponge->params->flags & FLAG_NOPARSE)) { | |||||
decaf_sponge->state->b[decaf_sponge->params->position] ^= CONTROL_WORD_PAD(len_cw); | |||||
dokeccak(decaf_sponge); | |||||
} | } | ||||
sponge->params->flags &= ~FLAG_NOPARSE; | |||||
decaf_sponge->params->flags &= ~FLAG_NOPARSE; | |||||
if (cw_flags & STROBE_FLAG_NO_LENGTH) { | if (cw_flags & STROBE_FLAG_NO_LENGTH) { | ||||
sponge->params->flags |= FLAG_NOPARSE; | |||||
decaf_sponge->params->flags |= FLAG_NOPARSE; | |||||
} | } | ||||
} | } | ||||
strobe_duplex(sponge, out, in, len, get_mode(cw_flags)); | |||||
strobe_duplex(decaf_sponge, out, in, len, get_mode(cw_flags)); | |||||
if (cw_flags & STROBE_FLAG_FORGET) { | if (cw_flags & STROBE_FLAG_FORGET) { | ||||
uint32_t len = sponge->params->rate - sponge->params->position; | |||||
if (len < STROBE_FORGET_BYTES + len_cw) len += sponge->params->rate; | |||||
uint32_t len = decaf_sponge->params->rate - decaf_sponge->params->position; | |||||
if (len < STROBE_FORGET_BYTES + len_cw) len += decaf_sponge->params->rate; | |||||
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)); | assert(!(cw_flags & STROBE_FLAG_MORE)); | ||||
strobe_duplex( | strobe_duplex( | ||||
sponge, NULL, NULL, len, | |||||
decaf_sponge, NULL, NULL, len, | |||||
STROBE_MODE_FORGET | STROBE_MODE_FORGET | ||||
); | ); | ||||
} | } | ||||
@@ -622,14 +622,14 @@ decaf_error_t strobe_verify_auth ( | |||||
const unsigned char *in, | const unsigned char *in, | ||||
uint16_t len | uint16_t len | ||||
) { | ) { | ||||
keccak_sponge_s *sponge = strobe->sponge; | |||||
if (len > sponge->params->rate) return DECAF_FAILURE; | |||||
decaf_keccak_sponge_s *decaf_sponge = strobe->sponge; | |||||
if (len > decaf_sponge->params->rate) return DECAF_FAILURE; | |||||
strobe_transact(strobe, NULL, in, len, strobe_cw_recv(STROBE_CW_MAC)); | strobe_transact(strobe, NULL, in, len, strobe_cw_recv(STROBE_CW_MAC)); | ||||
int32_t residue = 0; | int32_t residue = 0; | ||||
int i; | int i; | ||||
for (i=0; i<len; i++) { | for (i=0; i<len; i++) { | ||||
residue |= sponge->state->b[i]; | |||||
residue |= decaf_sponge->state->b[i]; | |||||
} | } | ||||
return decaf_succeed_if((residue-1)>>8); | return decaf_succeed_if((residue-1)>>8); | ||||
@@ -637,15 +637,15 @@ decaf_error_t strobe_verify_auth ( | |||||
void strobe_respec ( | void strobe_respec ( | ||||
keccak_strobe_t strobe, | keccak_strobe_t strobe, | ||||
const struct kparams_s *params | |||||
const struct decaf_kparams_s *params | |||||
) { | ) { | ||||
keccak_sponge_s *sponge = strobe->sponge; | |||||
uint8_t in[] = { params->rate, params->startRound }; | |||||
decaf_keccak_sponge_s *decaf_sponge = strobe->sponge; | |||||
uint8_t in[] = { params->rate, params->start_round }; | |||||
strobe_transact( strobe, NULL, in, sizeof(in), STROBE_CW_RESPEC_INFO ); | strobe_transact( strobe, NULL, in, sizeof(in), STROBE_CW_RESPEC_INFO ); | ||||
strobe_transact( strobe, NULL, NULL, 0, STROBE_CW_RESPEC ); | strobe_transact( strobe, NULL, NULL, 0, STROBE_CW_RESPEC ); | ||||
assert(sponge->params->position == 0); | |||||
sponge->params->rate = params->rate; | |||||
sponge->params->startRound = params->startRound; | |||||
assert(decaf_sponge->params->position == 0); | |||||
decaf_sponge->params->rate = params->rate; | |||||
decaf_sponge->params->start_round = params->start_round; | |||||
} | } | ||||
/* FUTURE: Keyak instances, etc */ | /* FUTURE: Keyak instances, etc */ |
@@ -335,7 +335,7 @@ static void macro() { | |||||
} | } | ||||
for (Benchmark b("SharedSecret",1); b.iter(); ) { | for (Benchmark b("SharedSecret",1); b.iter(); ) { | ||||
ss = s1.sharedSecret(p2,32,true); | |||||
ss = s1.shared_secret(p2,32,true); | |||||
} | } | ||||
printf("\nProtocol benchmarks:\n"); | printf("\nProtocol benchmarks:\n"); | ||||
@@ -1,6 +1,6 @@ | |||||
/** | /** | ||||
* @cond internal | * @cond internal | ||||
* @file shakesum.c | |||||
* @file decaf_shakesum.c | |||||
* @copyright | * @copyright | ||||
* Copyright (c) 2015 Cryptography Research, Inc. \n | * Copyright (c) 2015 Cryptography Research, Inc. \n | ||||
* Released under the MIT License. See LICENSE.txt for license information. | * Released under the MIT License. See LICENSE.txt for license information. | ||||
@@ -17,19 +17,19 @@ | |||||
static void usage() { | static void usage() { | ||||
fprintf( | fprintf( | ||||
stderr, | stderr, | ||||
"shakesum [shake256|shake128|sha3-224|sha3-384|sha3-512|sha512] < infile > outfile\n" | |||||
"decaf_shakesum [shake256|shake128|sha3-224|sha3-384|sha3-512|sha512] < infile > outfile\n" | |||||
); | ); | ||||
} | } | ||||
int main(int argc, char **argv) { | int main(int argc, char **argv) { | ||||
(void)argc; (void)argv; | (void)argc; (void)argv; | ||||
keccak_sponge_t sponge; | |||||
sha512_ctx_t sha512; | |||||
decaf_keccak_sponge_t sponge; | |||||
decaf_sha512_ctx_t decaf_sha512; | |||||
unsigned char buf[1024]; | unsigned char buf[1024]; | ||||
unsigned int outlen = 512; | unsigned int outlen = 512; | ||||
shake256_gen_init(sponge); | |||||
decaf_shake256_gen_init(sponge); | |||||
int use_sha512 = 0; | int use_sha512 = 0; | ||||
@@ -37,26 +37,26 @@ int main(int argc, char **argv) { | |||||
if (argc > 1) { | if (argc > 1) { | ||||
if (!strcmp(argv[1], "shake256") || !strcmp(argv[1], "SHAKE256")) { | if (!strcmp(argv[1], "shake256") || !strcmp(argv[1], "SHAKE256")) { | ||||
outlen = 512; | outlen = 512; | ||||
shake256_gen_init(sponge); | |||||
decaf_shake256_gen_init(sponge); | |||||
} else if (!strcmp(argv[1], "shake128") || !strcmp(argv[1], "SHAKE128")) { | } else if (!strcmp(argv[1], "shake128") || !strcmp(argv[1], "SHAKE128")) { | ||||
outlen = 512; | outlen = 512; | ||||
shake128_gen_init(sponge); | |||||
decaf_shake128_gen_init(sponge); | |||||
} else if (!strcmp(argv[1], "sha3-224") || !strcmp(argv[1], "SHA3-224")) { | } else if (!strcmp(argv[1], "sha3-224") || !strcmp(argv[1], "SHA3-224")) { | ||||
outlen = 224/8; | outlen = 224/8; | ||||
sha3_224_gen_init(sponge); | |||||
decaf_sha3_224_gen_init(sponge); | |||||
} else if (!strcmp(argv[1], "sha3-256") || !strcmp(argv[1], "SHA3-256")) { | } else if (!strcmp(argv[1], "sha3-256") || !strcmp(argv[1], "SHA3-256")) { | ||||
outlen = 256/8; | outlen = 256/8; | ||||
sha3_256_gen_init(sponge); | |||||
decaf_sha3_256_gen_init(sponge); | |||||
} else if (!strcmp(argv[1], "sha3-384") || !strcmp(argv[1], "SHA3-384")) { | } else if (!strcmp(argv[1], "sha3-384") || !strcmp(argv[1], "SHA3-384")) { | ||||
outlen = 384/8; | outlen = 384/8; | ||||
sha3_384_gen_init(sponge); | |||||
decaf_sha3_384_gen_init(sponge); | |||||
} else if (!strcmp(argv[1], "sha3-512") || !strcmp(argv[1], "SHA3-512")) { | } else if (!strcmp(argv[1], "sha3-512") || !strcmp(argv[1], "SHA3-512")) { | ||||
outlen = 512/8; | outlen = 512/8; | ||||
sha3_512_gen_init(sponge); | |||||
decaf_sha3_512_gen_init(sponge); | |||||
} else if (!strcmp(argv[1], "sha512") || !strcmp(argv[1], "SHA512")) { | } else if (!strcmp(argv[1], "sha512") || !strcmp(argv[1], "SHA512")) { | ||||
outlen = 512/8; | outlen = 512/8; | ||||
use_sha512 = 1; | use_sha512 = 1; | ||||
sha512_init(sha512); | |||||
decaf_sha512_init(decaf_sha512); | |||||
} else { | } else { | ||||
usage(); | usage(); | ||||
return 2; | return 2; | ||||
@@ -67,17 +67,17 @@ int main(int argc, char **argv) { | |||||
do { | do { | ||||
red = read(0, buf, sizeof(buf)); | red = read(0, buf, sizeof(buf)); | ||||
if (red>0) { | if (red>0) { | ||||
if (use_sha512) sha512_update(sha512,buf,red); | |||||
else sha3_update(sponge,buf,red); | |||||
if (use_sha512) decaf_sha512_update(decaf_sha512,buf,red); | |||||
else decaf_sha3_update(sponge,buf,red); | |||||
} | } | ||||
} while (red>0); | } while (red>0); | ||||
if (use_sha512) { | if (use_sha512) { | ||||
sha512_final(sha512,buf,outlen); | |||||
sha512_destroy(sha512); | |||||
decaf_sha512_final(decaf_sha512,buf,outlen); | |||||
decaf_sha512_destroy(decaf_sha512); | |||||
} else { | } else { | ||||
sha3_output(sponge,buf,outlen); | |||||
sponge_destroy(sponge); | |||||
decaf_sha3_output(sponge,buf,outlen); | |||||
decaf_sponge_destroy(sponge); | |||||
} | } | ||||
unsigned i; | unsigned i; | ||||
for (i=0; i<outlen; i++) { | for (i=0; i<outlen; i++) { | ||||
@@ -126,10 +126,10 @@ static void test_crypto() { | |||||
#if DECAF_CRYPTO_SHARED_SECRET_SHORT_CIRUIT | #if DECAF_CRYPTO_SHARED_SECRET_SHORT_CIRUIT | ||||
PrivateKey<Group> sk2(defrng); | PrivateKey<Group> sk2(defrng); | ||||
(void)sk1.sharedSecretNoexcept(shared,sk2.pub(),i&1); | |||||
(void)sk1.shared_secretNoexcept(shared,sk2.pub(),i&1); | |||||
#else | #else | ||||
PrivateKey<Group> sk3(rng); | PrivateKey<Group> sk3(rng); | ||||
(void)sk1.sharedSecretNoexcept(shared,sk3.pub(),i&1); | |||||
(void)sk1.shared_secretNoexcept(shared,sk3.pub(),i&1); | |||||
#endif | #endif | ||||
} | } | ||||
} | } | ||||
@@ -421,8 +421,8 @@ static void test_crypto() { | |||||
pub1.verify(message, sig); | pub1.verify(message, sig); | ||||
SecureBuffer s1(priv1.sharedSecret(pub2,32,true)); | |||||
SecureBuffer s2(priv2.sharedSecret(pub1,32,false)); | |||||
SecureBuffer s1(priv1.shared_secret(pub2,32,true)); | |||||
SecureBuffer s2(priv2.shared_secret(pub1,32,false)); | |||||
if (!memeq(s1,s2)) { | if (!memeq(s1,s2)) { | ||||
test.fail(); | test.fail(); | ||||
printf(" Shared secrets disagree on iteration %d.\n",i); | printf(" Shared secrets disagree on iteration %d.\n",i); | ||||