@@ -64,7 +64,7 @@ ASFLAGS = $(ARCHFLAGS) $(XASFLAGS) | |||
.PHONY: clean all test bench todo doc lib bat | |||
.PRECIOUS: build/%.s | |||
HEADERS= Makefile $(shell find . -name "*.h") $(shell find . -name "*.hxx") build/timestamp | |||
HEADERS= Makefile $(shell find src include test -name "*.h") $(shell find . -name "*.hxx") build/timestamp | |||
DECAFCOMPONENTS= build/$(DECAF).o build/shake.o build/decaf_crypto.o \ | |||
@@ -11,6 +11,7 @@ | |||
#include <string.h> | |||
#include "api.h" | |||
#include "crypto_sign.h" | |||
#include "randombytes.h" | |||
int crypto_sign_keypair ( | |||
unsigned char pk[PUBLICKEY_BYTES], | |||
@@ -35,7 +36,7 @@ int crypto_sign ( | |||
unsigned char sig[SIGNATURE_BYTES]; | |||
decaf_448_sign( | |||
sig, | |||
(const struct goldilocks_private_key_t *)sk, | |||
(const decaf_448_private_key_s *)sk, | |||
m, mlen | |||
); | |||
memmove(sm + SIGNATURE_BYTES, m, mlen); | |||
@@ -30,12 +30,9 @@ | |||
#if WBITS == 64 | |||
typedef __int128_t decaf_sdword_t; | |||
#define LIMB(x) (x##ull) | |||
#define SC_LIMB(x) (x##ull) | |||
#elif WBITS == 32 | |||
typedef int64_t decaf_sdword_t; | |||
#define LBITS 28 /* MAGIC */ | |||
#define LIMB(x) (x##ull)&((1ull<<LBITS)-1), (x##ull)>>LBITS | |||
#define SC_LIMB(x) (x##ull)&((1ull<<32)-1), (x##ull)>>32 | |||
#else | |||
#error "Only supporting 32- and 64-bit platforms right now" | |||
@@ -85,28 +82,23 @@ static const decaf_word_t MONTGOMERY_FACTOR = (decaf_word_t)(0x3bd440fae918bc5ul | |||
/** base = twist of Goldilocks base point (~,19). */ | |||
#ifndef FIELD_LITERAL | |||
# define FIELD_LITERAL(a,b,c,d,e,f,g,h) \ | |||
LIMB(a),LIMB(b),LIMB(c),LIMB(d),LIMB(e),LIMB(f),LIMB(g),LIMB(h) | |||
#endif | |||
const point_t API_NS(point_base) = {{ | |||
{{{ FIELD_LITERAL( | |||
{ FIELD_LITERAL( | |||
0xb39a2d57e08c7b,0xb38639c75ff281, | |||
0x2ec981082b3288,0x99fe8607e5237c, | |||
0x0e33fbb1fadd1f,0xe714f67055eb4a, | |||
0xc9ae06d64067dd,0xf7be45054760fa )}}}, | |||
{{{ FIELD_LITERAL( | |||
0xc9ae06d64067dd,0xf7be45054760fa )}, | |||
{ FIELD_LITERAL( | |||
0xbd8715f551617f,0x8c17fbeca8f5fc, | |||
0xaae0eec209c06f,0xce41ad80cbe6b8, | |||
0xdf360b5c828c00,0xaf25b6bbb40e3b, | |||
0x8ed37f0ce4ed31,0x72a1c3214557b9 )}}}, | |||
{{{ 1 }}}, | |||
{{{ FIELD_LITERAL( | |||
0x8ed37f0ce4ed31,0x72a1c3214557b9 )}, | |||
{{{ 1 }}}, | |||
{ FIELD_LITERAL( | |||
0x97ca9c8ed8bde9,0xf0b780da83304c, | |||
0x0d79c0a7729a69,0xc18d3f24aebc1c, | |||
0x1fbb5389b3fda5,0xbb24f674635948, | |||
0x723a55709a3983,0xe1c0107a823dd4 )}}} | |||
0x723a55709a3983,0xe1c0107a823dd4 )} | |||
}}; | |||
/* Projective Niels coordinates */ | |||
@@ -116,9 +108,9 @@ typedef struct { niels_t n; gf z; } pniels_s, pniels_t[1]; | |||
/* Precomputed base */ | |||
struct precomputed_s { niels_t table [DECAF_COMBS_N<<(DECAF_COMBS_T-1)]; }; | |||
extern const decaf_word_t API_NS(precomputed_base_as_words)[]; | |||
extern const field_t API_NS(precomputed_base_as_fe)[]; | |||
const precomputed_s *API_NS(precomputed_base) = | |||
(const precomputed_s *) &API_NS(precomputed_base_as_words); | |||
(const precomputed_s *) &API_NS(precomputed_base_as_fe); | |||
const size_t API_NS2(sizeof,precomputed_s) = sizeof(precomputed_s); | |||
const size_t API_NS2(alignof,precomputed_s) = 32; | |||
@@ -1497,8 +1489,8 @@ sv prepare_wnaf_table( | |||
} | |||
} | |||
extern const decaf_word_t API_NS(precomputed_wnaf_as_words)[]; | |||
static const niels_t *API_NS(wnaf_base) = (const niels_t *)API_NS(precomputed_wnaf_as_words); | |||
extern const field_t API_NS(precomputed_wnaf_as_fe)[]; | |||
static const niels_t *API_NS(wnaf_base) = (const niels_t *)API_NS(precomputed_wnaf_as_fe); | |||
const size_t API_NS2(sizeof,precomputed_wnafs) __attribute((visibility("hidden"))) | |||
= sizeof(niels_t)<<DECAF_WNAF_FIXED_TABLE_BITS; | |||
@@ -13,17 +13,18 @@ | |||
#include <stdlib.h> | |||
#include "decaf.h" | |||
#include "decaf_448_config.h" /* MAGIC */ | |||
#include "field.h" | |||
#define API_NS(_id) decaf_448_##_id | |||
#define API_NS2(_pref,_id) _pref##_decaf_448_##_id | |||
/* To satisfy linker. */ | |||
const decaf_word_t API_NS(precomputed_base_as_words)[1]; | |||
const field_t API_NS(precomputed_base_as_fe)[1]; | |||
const API_NS(scalar_t) API_NS(precomputed_scalarmul_adjustment); | |||
const API_NS(scalar_t) API_NS(point_scalarmul_adjustment); | |||
struct niels_s; | |||
const decaf_word_t *API_NS(precomputed_wnaf_as_words); | |||
const field_t *API_NS(precomputed_wnaf_as_fe); | |||
extern const size_t API_NS2(sizeof,precomputed_wnafs); | |||
void API_NS(precompute_wnafs) ( | |||
@@ -41,6 +42,29 @@ static void scalar_print(const char *name, const API_NS(scalar_t) sc) { | |||
printf("}}};\n\n"); | |||
} | |||
static void field_print(const field_t *f) { | |||
const int FIELD_SER_BYTES = (FIELD_BITS + 7) / 8; | |||
unsigned char ser[FIELD_SER_BYTES]; | |||
field_serialize(ser,f); | |||
int b=0, i, comma=0; | |||
unsigned long long limb = 0; | |||
printf("FIELD_LITERAL("); | |||
for (i=0; i<FIELD_SER_BYTES; i++) { | |||
limb |= ((uint64_t)ser[i])<<b; | |||
b += 8; | |||
if (b >= FIELD_LIT_LIMB_BITS) { | |||
limb &= (1ull<<FIELD_LIT_LIMB_BITS) -1; | |||
b -= FIELD_LIT_LIMB_BITS; | |||
if (comma) printf(","); | |||
comma = 1; | |||
printf("0x%016llx", limb); | |||
limb = ((uint64_t)ser[i])>>(8-b); | |||
} | |||
} | |||
printf(")"); | |||
assert(b<8); | |||
} | |||
int main(int argc, char **argv) { | |||
(void)argc; (void)argv; | |||
@@ -54,34 +78,31 @@ int main(int argc, char **argv) { | |||
if (ret || !preWnaf) return 1; | |||
API_NS(precompute_wnafs)(preWnaf, API_NS(point_base)); | |||
const decaf_word_t *output = (const decaf_word_t *)pre; | |||
const field_t *output = (const field_t *)pre; | |||
unsigned i; | |||
printf("/** @warning: this file was automatically generated. */\n"); | |||
printf("#include \"field.h\"\n\n"); | |||
printf("#include \"decaf.h\"\n\n"); | |||
printf("#define API_NS(_id) decaf_448_##_id\n"); | |||
printf("#define API_NS2(_pref,_id) _pref##_decaf_448_##_id\n"); | |||
printf("const decaf_word_t API_NS(precomputed_base_as_words)[%d]\n", | |||
(int)(API_NS2(sizeof,precomputed_s) / sizeof(decaf_word_t))); | |||
printf("const field_t API_NS(precomputed_base_as_fe)[%d]\n", | |||
(int)(API_NS2(sizeof,precomputed_s) / sizeof(field_t))); | |||
printf("__attribute__((aligned(%d),visibility(\"hidden\"))) = {\n ", (int)API_NS2(alignof,precomputed_s)); | |||
for (i=0; i < API_NS2(sizeof,precomputed_s); i+=sizeof(decaf_word_t)) { | |||
if (i && (i%8==0)) printf(",\n "); | |||
else if (i) printf(", "); | |||
printf("0x%0*llxull", (int)sizeof(decaf_word_t)*2, (unsigned long long)*output ); | |||
output++; | |||
for (i=0; i < API_NS2(sizeof,precomputed_s); i+=sizeof(field_t)) { | |||
if (i) printf(",\n "); | |||
field_print(output++); | |||
} | |||
printf("\n};\n"); | |||
output = (const decaf_word_t *)preWnaf; | |||
printf("const decaf_word_t API_NS(precomputed_wnaf_as_words)[%d]\n", | |||
(int)(API_NS2(sizeof,precomputed_wnafs) / sizeof(decaf_word_t))); | |||
output = (const field_t *)preWnaf; | |||
printf("const field_t API_NS(precomputed_wnaf_as_fe)[%d]\n", | |||
(int)(API_NS2(sizeof,precomputed_wnafs) / sizeof(field_t))); | |||
printf("__attribute__((aligned(%d),visibility(\"hidden\"))) = {\n ", (int)API_NS2(alignof,precomputed_s)); | |||
for (i=0; i < API_NS2(sizeof,precomputed_wnafs); i+=sizeof(decaf_word_t)) { | |||
if (i && (i%8==0)) printf(",\n "); | |||
else if (i) printf(", "); | |||
printf("0x%0*llxull", (int)sizeof(decaf_word_t)*2, (unsigned long long)*output ); | |||
output++; | |||
for (i=0; i < API_NS2(sizeof,precomputed_wnafs); i+=sizeof(field_t)) { | |||
if (i) printf(",\n "); | |||
field_print(output++); | |||
} | |||
printf("\n};\n"); | |||
@@ -13,6 +13,11 @@ typedef struct p448_t { | |||
uint32_t limb[16]; | |||
} __attribute__((aligned(32))) p448_t; | |||
#define LBITS 28 | |||
#define LIMB(x) (x##ull)&((1ull<<LBITS)-1), (x##ull)>>LBITS | |||
#define FIELD_LITERAL(a,b,c,d,e,f,g,h) \ | |||
{{LIMB(a),LIMB(b),LIMB(c),LIMB(d),LIMB(e),LIMB(f),LIMB(g),LIMB(h)}} | |||
#ifdef __cplusplus | |||
extern "C" { | |||
#endif | |||
@@ -13,6 +13,11 @@ typedef struct p448_t { | |||
uint32_t limb[16]; | |||
} __attribute__((aligned(32))) p448_t; | |||
#define LBITS 28 | |||
#define LIMB(x) (x##ull)&((1ull<<LBITS)-1), (x##ull)>>LBITS | |||
#define FIELD_LITERAL(a,b,c,d,e,f,g,h) \ | |||
{{LIMB(a),LIMB(b),LIMB(c),LIMB(d),LIMB(e),LIMB(f),LIMB(g),LIMB(h)}} | |||
#ifdef __cplusplus | |||
extern "C" { | |||
#endif | |||
@@ -15,13 +15,14 @@ typedef struct p448_t { | |||
#define LIMBPERM(x) (((x)<<1 | (x)>>3) & 15) | |||
#define USE_NEON_PERM 1 | |||
#define LBITS 28 | |||
#define LIMBHI(x) ((x##ull)>>LBITS) | |||
#define LIMBLO(x) ((x##ull)&((1ull<<LBITS)-1)) | |||
# define FIELD_LITERAL(a,b,c,d,e,f,g,h) \ | |||
LIMBLO(a),LIMBLO(e), LIMBHI(a),LIMBHI(e), \ | |||
LIMBLO(b),LIMBLO(f), LIMBHI(b),LIMBHI(f), \ | |||
LIMBLO(c),LIMBLO(g), LIMBHI(c),LIMBHI(g), \ | |||
LIMBLO(d),LIMBLO(h), LIMBHI(d),LIMBHI(h) | |||
{{LIMBLO(a),LIMBLO(e), LIMBHI(a),LIMBHI(e), \ | |||
LIMBLO(b),LIMBLO(f), LIMBHI(b),LIMBHI(f), \ | |||
LIMBLO(c),LIMBLO(g), LIMBHI(c),LIMBHI(g), \ | |||
LIMBLO(d),LIMBLO(h), LIMBHI(d),LIMBHI(h)}} | |||
#ifdef __cplusplus | |||
extern "C" { | |||
@@ -14,6 +14,9 @@ typedef struct p448_t { | |||
uint64_t limb[8]; | |||
} __attribute__((aligned(32))) p448_t; | |||
#define LBITS 56 | |||
#define FIELD_LITERAL(a,b,c,d,e,f,g,h) {{a,b,c,d,e,f,g,h}} | |||
#ifdef __cplusplus | |||
extern "C" { | |||
#endif | |||
@@ -13,6 +13,9 @@ typedef struct p448_t { | |||
uint64_t limb[8]; | |||
} __attribute__((aligned(32))) p448_t; | |||
#define LBITS 56 | |||
#define FIELD_LITERAL(a,b,c,d,e,f,g,h) {{a,b,c,d,e,f,g,h}} | |||
#ifdef __cplusplus | |||
extern "C" { | |||
#endif | |||
@@ -13,6 +13,7 @@ | |||
#include <string.h> | |||
#include "p448.h" | |||
#define FIELD_LIT_LIMB_BITS 56 | |||
#define FIELD_BITS 448 | |||
#define field_t p448_t | |||
#define field_mul p448_mul | |||
@@ -13,6 +13,7 @@ | |||
#include <string.h> | |||
#include "p480.h" | |||
#define FIELD_LIT_LIMB_BITS 60 | |||
#define FIELD_BITS 480 | |||
#define field_t p480_t | |||
#define field_mul p480_mul | |||
@@ -13,6 +13,7 @@ | |||
#include "constant_time.h" | |||
#include "p521.h" | |||
#define FIELD_LIT_LIMB_BITS 58 | |||
#define FIELD_BITS 521 | |||
#define field_t p521_t | |||
#define field_mul p521_mul | |||