@@ -122,11 +122,11 @@ void | |||
decaf_255_sign_shake ( | |||
decaf_255_signature_t sig, | |||
const decaf_255_private_key_t priv, | |||
const keccak_sponge_t shake | |||
const shake256_ctx_t shake | |||
) NONNULL3 API_VIS; | |||
/** | |||
* @brief Sign a message from its SHAKE context. | |||
* @brief Sign a message. | |||
* | |||
* @param [out] sig The signature. | |||
* @param [in] priv Your private key. | |||
@@ -152,7 +152,7 @@ decaf_bool_t | |||
decaf_255_verify_shake ( | |||
const decaf_255_signature_t sig, | |||
const decaf_255_public_key_t pub, | |||
const keccak_sponge_t shake | |||
const shake256_ctx_t shake | |||
) NONNULL3 API_VIS WARN_UNUSED; | |||
/** | |||
@@ -26,7 +26,6 @@ | |||
#define NONNULL3 __attribute__((nonnull(1,2,3))) | |||
/** @endcond */ | |||
/* TODO: different containing structs for each primitive? */ | |||
#ifndef INTERNAL_SPONGE_STRUCT | |||
/** Sponge container object for the various primitives. */ | |||
typedef struct keccak_sponge_s { | |||
@@ -119,40 +118,48 @@ void sponge_hash ( | |||
/** @cond internal */ | |||
#define DECSHAKE(n) \ | |||
extern const struct kparams_s SHAKE##n##_params_s API_VIS; \ | |||
static inline void NONNULL1 shake##n##_init(keccak_sponge_t sponge) { \ | |||
typedef struct shake##n##_ctx_s { keccak_sponge_t s; } shake##n##_ctx_t[1]; \ | |||
static inline void NONNULL1 shake##n##_init(shake##n##_ctx_t sponge) { \ | |||
sponge_init(sponge->s, &SHAKE##n##_params_s); \ | |||
} \ | |||
static inline void NONNULL1 shake##n##_gen_init(keccak_sponge_t sponge) { \ | |||
sponge_init(sponge, &SHAKE##n##_params_s); \ | |||
} \ | |||
static inline void NONNULL2 shake##n##_update(keccak_sponge_t sponge, const uint8_t *in, size_t inlen ) { \ | |||
sha3_update(sponge, in, inlen); \ | |||
static inline void NONNULL2 shake##n##_update(shake##n##_ctx_t sponge, const uint8_t *in, size_t inlen ) { \ | |||
sha3_update(sponge->s, in, inlen); \ | |||
} \ | |||
static inline void NONNULL2 shake##n##_final(keccak_sponge_t sponge, uint8_t *out, size_t outlen ) { \ | |||
sha3_output(sponge, out, outlen); \ | |||
sponge_init(sponge, &SHAKE##n##_params_s); \ | |||
static inline void NONNULL2 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 NONNULL13 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 NONNULL1 shake##n##_destroy( keccak_sponge_t sponge ) { \ | |||
sponge_destroy(sponge); \ | |||
static inline void NONNULL1 shake##n##_destroy( shake##n##_ctx_t sponge ) { \ | |||
sponge_destroy(sponge->s); \ | |||
} | |||
#define DECSHA3(n) \ | |||
extern const struct kparams_s SHA3_##n##_params_s API_VIS; \ | |||
static inline void NONNULL1 sha3_##n##_init(keccak_sponge_t sponge) { \ | |||
typedef struct sha3_##n##_ctx_s { keccak_sponge_t s; } sha3_##n##_ctx_t[1]; \ | |||
static inline void NONNULL1 sha3_##n##_init(sha3_##n##_ctx_t sponge) { \ | |||
sponge_init(sponge->s, &SHA3_##n##_params_s); \ | |||
} \ | |||
static inline void NONNULL1 sha3_##n##_gen_init(keccak_sponge_t sponge) { \ | |||
sponge_init(sponge, &SHA3_##n##_params_s); \ | |||
} \ | |||
static inline void NONNULL2 sha3_##n##_update(keccak_sponge_t sponge, const uint8_t *in, size_t inlen ) { \ | |||
sha3_update(sponge, in, inlen); \ | |||
static inline void NONNULL2 sha3_##n##_update(sha3_##n##_ctx_t sponge, const uint8_t *in, size_t inlen ) { \ | |||
sha3_update(sponge->s, in, inlen); \ | |||
} \ | |||
static inline void NONNULL2 sha3_##n##_final(keccak_sponge_t sponge, uint8_t *out, size_t outlen ) { \ | |||
sha3_output(sponge, out, outlen); \ | |||
sponge_init(sponge, &SHA3_##n##_params_s); \ | |||
static inline void NONNULL2 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 NONNULL13 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 NONNULL1 sha3_##n##_destroy( keccak_sponge_t sponge ) { \ | |||
sponge_destroy(sponge); \ | |||
static inline void NONNULL1 sha3_##n##_destroy(sha3_##n##_ctx_t sponge) { \ | |||
sponge_destroy(sponge->s); \ | |||
} | |||
/** @endcond */ | |||
@@ -253,7 +260,6 @@ extern const struct kparams_s STROBE_256 API_VIS; | |||
extern const struct kparams_s STROBE_KEYED_128 API_VIS; | |||
extern const struct kparams_s STROBE_KEYED_256 API_VIS; | |||
/** TODO: remove this restriction?? */ | |||
#define STROBE_MAX_AUTH_BYTES 255 | |||
/** TODO: check "more" flags? */ | |||
@@ -81,7 +81,6 @@ const decaf_448_point_t decaf_448_point_base = {{ | |||
struct decaf_448_precomputed_s { decaf_448_point_t p[1]; }; | |||
/* FIXME: restore */ | |||
const struct decaf_448_precomputed_s *decaf_448_precomputed_base = | |||
(const struct decaf_448_precomputed_s *)decaf_448_point_base; | |||
@@ -21,7 +21,7 @@ void decaf_255_derive_private_key ( | |||
uint8_t encoded_scalar[DECAF_255_SCALAR_OVERKILL_BYTES]; | |||
decaf_255_point_t pub; | |||
keccak_sponge_t sponge; | |||
shake256_ctx_t sponge; | |||
shake256_init(sponge); | |||
shake256_update(sponge, proto, sizeof(decaf_255_symmetric_key_t)); | |||
shake256_update(sponge, (const unsigned char *)magic, strlen(magic)); | |||
@@ -77,7 +77,7 @@ decaf_255_shared_secret ( | |||
} | |||
less >>= 8; | |||
keccak_sponge_t sponge; | |||
shake256_ctx_t sponge; | |||
shake256_init(sponge); | |||
/* update the lesser */ | |||
@@ -117,7 +117,7 @@ void | |||
decaf_255_sign_shake ( | |||
decaf_255_signature_t sig, | |||
const decaf_255_private_key_t priv, | |||
const keccak_sponge_t shake | |||
const shake256_ctx_t shake | |||
) { | |||
const char *magic = "decaf_255_sign_shake"; | |||
@@ -126,7 +126,7 @@ decaf_255_sign_shake ( | |||
decaf_255_scalar_t nonce, challenge; | |||
/* Derive nonce */ | |||
keccak_sponge_t ctx; | |||
shake256_ctx_t ctx; | |||
memcpy(ctx, shake, sizeof(ctx)); | |||
shake256_update(ctx, priv->sym, sizeof(priv->sym)); | |||
shake256_update(ctx, (const unsigned char *)magic, strlen(magic)); | |||
@@ -163,7 +163,7 @@ decaf_bool_t | |||
decaf_255_verify_shake ( | |||
const decaf_255_signature_t sig, | |||
const decaf_255_public_key_t pub, | |||
const keccak_sponge_t shake | |||
const shake256_ctx_t shake | |||
) { | |||
decaf_bool_t ret; | |||
@@ -172,7 +172,7 @@ decaf_255_verify_shake ( | |||
decaf_255_scalar_t challenge, response; | |||
/* Derive challenge */ | |||
keccak_sponge_t ctx; | |||
shake256_ctx_t ctx; | |||
memcpy(ctx, shake, sizeof(ctx)); | |||
shake256_update(ctx, pub, sizeof(decaf_255_public_key_t)); | |||
shake256_update(ctx, sig, DECAF_255_SER_BYTES); | |||
@@ -201,7 +201,7 @@ decaf_255_sign ( | |||
const unsigned char *message, | |||
size_t message_len | |||
) { | |||
keccak_sponge_t ctx; | |||
shake256_ctx_t ctx; | |||
shake256_init(ctx); | |||
shake256_update(ctx, message, message_len); | |||
decaf_255_sign_shake(sig, priv, ctx); | |||
@@ -215,7 +215,7 @@ decaf_255_verify ( | |||
const unsigned char *message, | |||
size_t message_len | |||
) { | |||
keccak_sponge_t ctx; | |||
shake256_ctx_t ctx; | |||
shake256_init(ctx); | |||
shake256_update(ctx, message, message_len); | |||
decaf_bool_t ret = decaf_255_verify_shake(sig, pub, ctx); | |||
@@ -151,7 +151,8 @@ int main(int argc, char **argv) { | |||
} | |||
scalar_print("sc_r2", smadj); | |||
API_NS(scalar_sub)(smadj,API_NS(scalar_zero),API_NS(scalar_one)); /* HACK */ | |||
API_NS(scalar_sub)(smadj,API_NS(scalar_zero),API_NS(scalar_one)); /* get p-1 */ | |||
unsigned long long w = 1, plo = smadj->limb[0]+1; | |||
#if DECAF_WORD_BITS == 32 | |||
@@ -618,7 +618,7 @@ p448_mulw ( | |||
vo[1] += vmovn_u64(accum); | |||
} | |||
/* TODO: vectorize? */ | |||
/* PERF: vectorize? */ | |||
void | |||
p448_strong_reduce ( | |||
p448_t *a | |||
@@ -7,10 +7,6 @@ | |||
#include <stdint.h> | |||
/* TODO: non x86-64 versions of these. | |||
* FUTURE: autogenerate | |||
*/ | |||
static __inline__ __uint128_t widemul(const uint64_t *a, const uint64_t *b) { | |||
#ifndef __BMI2__ | |||
uint64_t c,d; | |||
@@ -669,11 +669,13 @@ decaf_bool_t strobe_prng ( | |||
size_t len, | |||
uint8_t more | |||
) { | |||
/* FIXME: length?? */ | |||
unsigned char control[] = { PRNG }; | |||
unsigned char control[9] = { PRNG }; | |||
int i; | |||
for (i=0; i<8; i++) control[i+1] = len>>(8*i); | |||
decaf_bool_t ret = strobe_control_word(sponge, control, sizeof(control), more); | |||
strobe_duplex(sponge, out, NULL, len); | |||
// /** TODO: orly? */ | |||
// TODO: forget as follows? this breaks "more" | |||
// unsigned char control2[] = { 0, STROBE_FORGET_BYTES, TAGFORGET }; | |||
// ret &= strobe_control_word(sponge, control2, sizeof(control2)); | |||
// strobe_forget(sponge, STROBE_FORGET_BYTES); | |||
@@ -681,7 +683,6 @@ decaf_bool_t strobe_prng ( | |||
return ret; | |||
} | |||
/* TODO: remove reliance on decaf? */ | |||
decaf_bool_t strobe_verify_auth ( | |||
keccak_sponge_t sponge, | |||
const unsigned char *in, | |||
@@ -720,4 +721,4 @@ decaf_bool_t strobe_respec ( | |||
return ret; | |||
} | |||
/* TODO: Keyak instances, etc */ | |||
/* FUTURE: Keyak instances, etc */ |
@@ -20,28 +20,28 @@ int main(int argc, char **argv) { | |||
unsigned char buf[1024]; | |||
unsigned int outlen = 512; | |||
shake256_init(sponge); | |||
shake256_gen_init(sponge); | |||
/* Sloppy. Real utility would parse --algo, --size ... */ | |||
if (argc > 1) { | |||
if (!strcmp(argv[1], "shake256") || !strcmp(argv[1], "SHAKE256")) { | |||
outlen = 512; | |||
shake256_init(sponge); | |||
shake256_gen_init(sponge); | |||
} else if (!strcmp(argv[1], "shake128") || !strcmp(argv[1], "SHAKE128")) { | |||
outlen = 512; | |||
shake128_init(sponge); | |||
shake128_gen_init(sponge); | |||
} else if (!strcmp(argv[1], "sha3-224") || !strcmp(argv[1], "SHA3-224")) { | |||
outlen = 224/8; | |||
sha3_224_init(sponge); | |||
sha3_224_gen_init(sponge); | |||
} else if (!strcmp(argv[1], "sha3-256") || !strcmp(argv[1], "SHA3-256")) { | |||
outlen = 256/8; | |||
sha3_256_init(sponge); | |||
sha3_256_gen_init(sponge); | |||
} else if (!strcmp(argv[1], "sha3-384") || !strcmp(argv[1], "SHA3-384")) { | |||
outlen = 384/8; | |||
sha3_384_init(sponge); | |||
sha3_384_gen_init(sponge); | |||
} else if (!strcmp(argv[1], "sha3-512") || !strcmp(argv[1], "SHA3-512")) { | |||
outlen = 512/8; | |||
sha3_512_init(sponge); | |||
sha3_512_gen_init(sponge); | |||
} | |||
} | |||