@@ -44,7 +44,7 @@ FIELD ?= p25519 | |||||
WARNFLAGS = -pedantic -Wall -Wextra -Werror -Wunreachable-code \ | WARNFLAGS = -pedantic -Wall -Wextra -Werror -Wunreachable-code \ | ||||
-Wmissing-declarations -Wunused-function -Wno-overlength-strings $(EXWARN) | -Wmissing-declarations -Wunused-function -Wno-overlength-strings $(EXWARN) | ||||
INCFLAGS = -Isrc/include -Isrc/public_include -Isrc/$(FIELD) -Isrc/$(FIELD)/$(ARCH) | |||||
INCFLAGS = -Isrc/include -Isrc/public_include | |||||
LANGFLAGS = -std=c99 -fno-strict-aliasing | LANGFLAGS = -std=c99 -fno-strict-aliasing | ||||
LANGXXFLAGS = -fno-strict-aliasing | LANGXXFLAGS = -fno-strict-aliasing | ||||
GENFLAGS = -ffunction-sections -fdata-sections -fvisibility=hidden -fomit-frame-pointer -fPIC | GENFLAGS = -ffunction-sections -fdata-sections -fvisibility=hidden -fomit-frame-pointer -fPIC | ||||
@@ -83,10 +83,16 @@ BUILDPYS= $(SAGES:test/%.sage=$(BUILD_PY)/%.py) | |||||
HEADERS= Makefile $(shell find src test -name "*.h") $(shell find . -name "*.hxx") $(BUILD_OBJ)/timestamp | HEADERS= Makefile $(shell find src test -name "*.h") $(shell find . -name "*.hxx") $(BUILD_OBJ)/timestamp | ||||
DECAFCOMPONENTS= $(BUILD_OBJ)/$(DECAF).o $(BUILD_OBJ)/shake.o $(BUILD_OBJ)/decaf_crypto.o \ | |||||
$(BUILD_OBJ)/$(FIELD).o $(BUILD_OBJ)/f_arithmetic.o $(BUILD_OBJ)/utils.o | |||||
# components needed by the table generators | |||||
GENCOMPONENTS= \ | |||||
$(BUILD_OBJ)/$(DECAF)_ed25519.o $(BUILD_OBJ)/p25519_impl.o $(BUILD_OBJ)/p25519_arithmetic.o \ | |||||
$(BUILD_OBJ)/utils.o \ | |||||
#$(BUILD_OBJ)/p448_impl.o $(BUILD_OBJ)/p448_arithmetic.o | |||||
# components needed by the lib | |||||
DECAFCOMPONENTS= $(BUILD_OBJ)/shake.o $(BUILD_OBJ)/decaf_crypto.o $(GENCOMPONENTS) | |||||
ifeq ($(DECAF),decaf_fast) | ifeq ($(DECAF),decaf_fast) | ||||
DECAFCOMPONENTS += $(BUILD_OBJ)/decaf_tables.o | |||||
DECAFCOMPONENTS += $(BUILD_OBJ)/decaf_tables_ed25519.o | |||||
endif | endif | ||||
BENCHCOMPONENTS = $(BUILD_OBJ)/bench.o $(BUILD_OBJ)/shake.o | BENCHCOMPONENTS = $(BUILD_OBJ)/bench.o $(BUILD_OBJ)/shake.o | ||||
@@ -143,15 +149,39 @@ $(BUILD_OBJ)/timestamp: | |||||
$(BUILD_OBJ)/%.o: $(BUILD_ASM)/%.s | $(BUILD_OBJ)/%.o: $(BUILD_ASM)/%.s | ||||
$(ASM) $(ASFLAGS) -c -o $@ $< | $(ASM) $(ASFLAGS) -c -o $@ $< | ||||
$(BUILD_IBIN)/decaf_gen_tables: $(BUILD_OBJ)/decaf_gen_tables.o \ | |||||
$(BUILD_OBJ)/$(DECAF).o $(BUILD_OBJ)/$(FIELD).o $(BUILD_OBJ)/f_arithmetic.o $(BUILD_OBJ)/utils.o | |||||
# I don't know why this rule is necessary... bug in make, or obscure pattern matching rule? | |||||
$(BUILD_OBJ)/decaf_gen_tables_%.o: $(BUILD_ASM)/decaf_gen_tables_%.s | |||||
$(ASM) $(ASFLAGS) -c -o $@ $< | |||||
$(BUILD_IBIN)/decaf_gen_tables_%: $(BUILD_OBJ)/decaf_gen_tables_%.o $(GENCOMPONENTS) | |||||
$(LD) $(LDFLAGS) -o $@ $^ | $(LD) $(LDFLAGS) -o $@ $^ | ||||
$(BUILD_C)/decaf_tables.c: $(BUILD_IBIN)/decaf_gen_tables | |||||
$(BUILD_C)/decaf_tables_%.c: $(BUILD_IBIN)/decaf_gen_tables_% | |||||
./$< > $@ | ./$< > $@ | ||||
$(BUILD_ASM)/decaf_tables.s: $(BUILD_C)/decaf_tables.c $(HEADERS) | |||||
$(CC) $(CFLAGS) -S -c -o $@ $< | |||||
$(BUILD_ASM)/decaf_tables_%.s: $(BUILD_C)/decaf_tables_%.c $(HEADERS) | |||||
$(CC) $(CFLAGS) -S -c -o $@ $< \ | |||||
-I src/curve_$*/ -I src/curve_$*/field -I src/curve_$*/field/$(ARCH) \ | |||||
$(BUILD_ASM)/decaf_gen_tables_%.s: src/decaf_gen_tables.c $(HEADERS) | |||||
$(CC) $(CFLAGS) \ | |||||
-I src/curve_$*/ -I src/curve_$*/field -I src/curve_$*/field/$(ARCH) \ | |||||
-S -c -o $@ $< | |||||
$(BUILD_ASM)/decaf_fast_%.s: src/decaf_fast.c $(HEADERS) | |||||
$(CC) $(CFLAGS) \ | |||||
-I src/curve_$*/ -I src/curve_$*/field -I src/curve_$*/field/$(ARCH) \ | |||||
-S -c -o $@ $< | |||||
$(BUILD_ASM)/%_arithmetic.s: src/%/f_arithmetic.c $(HEADERS) | |||||
$(CC) $(CFLAGS) \ | |||||
-I src/$* -I src/$*/$(ARCH) \ | |||||
-S -c -o $@ $< | |||||
$(BUILD_ASM)/%_impl.s: src/%/$(ARCH)/f_impl.c $(HEADERS) | |||||
$(CC) $(CFLAGS) \ | |||||
-I src/$* -I src/$*/$(ARCH) \ | |||||
-S -c -o $@ $< | |||||
$(BUILD_ASM)/%.s: src/%.c $(HEADERS) | $(BUILD_ASM)/%.s: src/%.c $(HEADERS) | ||||
$(CC) $(CFLAGS) -S -c -o $@ $< | $(CC) $(CFLAGS) -S -c -o $@ $< | ||||
@@ -165,12 +195,6 @@ $(BUILD_ASM)/%.s: test/%.c $(HEADERS) | |||||
$(BUILD_ASM)/%.s: test/%.cxx $(HEADERS) | $(BUILD_ASM)/%.s: test/%.cxx $(HEADERS) | ||||
$(CXX) $(CXXFLAGS) -S -c -o $@ $< | $(CXX) $(CXXFLAGS) -S -c -o $@ $< | ||||
$(BUILD_ASM)/%.s: src/$(FIELD)/$(ARCH)/%.c $(HEADERS) | |||||
$(CC) $(CFLAGS) -S -c -o $@ $< | |||||
$(BUILD_ASM)/%.s: src/$(FIELD)/%.c $(HEADERS) | |||||
$(CC) $(CFLAGS) -S -c -o $@ $< | |||||
# The sage test scripts | # The sage test scripts | ||||
sage: $(BUILDPYS) | sage: $(BUILDPYS) | ||||
@@ -191,29 +215,29 @@ $(BUILDPYS): $(SAGES) $(BUILD_OBJ)/timestamp | |||||
$(BUILD_DOC)/timestamp: | $(BUILD_DOC)/timestamp: | ||||
mkdir -p `dirname $@` | mkdir -p `dirname $@` | ||||
touch $@ | touch $@ | ||||
doc: Doxyfile $(BUILD_OBJ)/timestamp $(HEADERS) src/*.c src/$(FIELD)/$(ARCH)/*.c src/$(FIELD)/$(ARCH)/*.h | |||||
doxygen > /dev/null | |||||
# The eBATS benchmarking script | |||||
bat: $(BATNAME) | |||||
$(BATNAME): include/* src/* src/*/* test/batarch.map $(BUILD_C)/decaf_tables.c # TODO tables some other way | |||||
rm -fr $@ | |||||
for prim in dh sign; do \ | |||||
targ="$@/crypto_$$prim/ed448goldilocks_decaf"; \ | |||||
(while read arch where; do \ | |||||
mkdir -p $$targ/`basename $$arch`; \ | |||||
cp include/*.h $(BUILD_C)/decaf_tables.c src/decaf_fast.c src/decaf_crypto.c src/shake.c src/include/*.h src/bat/$$prim.c src/p448/$$where/*.c src/p448/$$where/*.h src/p448/*.c src/p448/*.h $$targ/`basename $$arch`; \ | |||||
cp src/bat/api_$$prim.h $$targ/`basename $$arch`/api.h; \ | |||||
perl -p -i -e 's/SYSNAME/'`basename $(BATNAME)`_`basename $$arch`'/g' $$targ/`basename $$arch`/api.h; \ | |||||
perl -p -i -e 's/__TODAY__/'$(TODAY)'/g' $$targ/`basename $$arch`/api.h; \ | |||||
done \ | |||||
) < test/batarch.map; \ | |||||
echo 'Mike Hamburg' > $$targ/designers; \ | |||||
echo 'Ed448-Goldilocks Decaf sign and dh' > $$targ/description; \ | |||||
done | |||||
(cd $(BATNAME)/.. && tar czf $(BATBASE).tgz $(BATBASE) ) | |||||
# | |||||
# doc: Doxyfile $(BUILD_OBJ)/timestamp $(HEADERS) src/*.c src/$(FIELD)/$(ARCH)/*.c src/$(FIELD)/$(ARCH)/*.h | |||||
# doxygen > /dev/null | |||||
# # The eBATS benchmarking script | |||||
# bat: $(BATNAME) | |||||
# | |||||
# $(BATNAME): include/* src/* src/*/* test/batarch.map $(BUILD_C)/decaf_tables.c # TODO tables some other way | |||||
# rm -fr $@ | |||||
# for prim in dh sign; do \ | |||||
# targ="$@/crypto_$$prim/ed448goldilocks_decaf"; \ | |||||
# (while read arch where; do \ | |||||
# mkdir -p $$targ/`basename $$arch`; \ | |||||
# cp include/*.h $(BUILD_C)/decaf_tables.c src/decaf_fast.c src/decaf_crypto.c src/shake.c src/include/*.h src/bat/$$prim.c src/p448/$$where/*.c src/p448/$$where/*.h src/p448/*.c src/p448/*.h $$targ/`basename $$arch`; \ | |||||
# cp src/bat/api_$$prim.h $$targ/`basename $$arch`/api.h; \ | |||||
# perl -p -i -e 's/SYSNAME/'`basename $(BATNAME)`_`basename $$arch`'/g' $$targ/`basename $$arch`/api.h; \ | |||||
# perl -p -i -e 's/__TODAY__/'$(TODAY)'/g' $$targ/`basename $$arch`/api.h; \ | |||||
# done \ | |||||
# ) < test/batarch.map; \ | |||||
# echo 'Mike Hamburg' > $$targ/designers; \ | |||||
# echo 'Ed448-Goldilocks Decaf sign and dh' > $$targ/description; \ | |||||
# done | |||||
# (cd $(BATNAME)/.. && tar czf $(BATBASE).tgz $(BATBASE) ) | |||||
# Finds todo items in .h and .c files | # Finds todo items in .h and .c files | ||||
TODO_TYPES ?= HACK TODO FIXME BUG XXX PERF FUTURE REMOVE MAGIC | TODO_TYPES ?= HACK TODO FIXME BUG XXX PERF FUTURE REMOVE MAGIC | ||||
@@ -0,0 +1,35 @@ | |||||
/* Rename table for eventual factoring into .c.inc, MSR ECC style */ | |||||
#define SCALAR_LIMBS DECAF_255_SCALAR_LIMBS | |||||
#define SCALAR_BITS DECAF_255_SCALAR_BITS | |||||
#define NLIMBS DECAF_255_LIMBS | |||||
#define API_NS(_id) decaf_255_##_id | |||||
#define API_NS2(_pref,_id) _pref##_decaf_255_##_id | |||||
#define scalar_t decaf_255_scalar_t | |||||
#define point_t decaf_255_point_t | |||||
#define precomputed_s decaf_255_precomputed_s | |||||
#define SER_BYTES DECAF_255_SER_BYTES | |||||
#define IMAGINE_TWIST 1 | |||||
#define P_MOD_8 5 | |||||
#define COFACTOR 8 | |||||
static const int EDWARDS_D = -121665; | |||||
static const scalar_t sc_p = {{{ | |||||
SC_LIMB(0x5812631a5cf5d3ed), | |||||
SC_LIMB(0x14def9dea2f79cd6), | |||||
SC_LIMB(0), | |||||
SC_LIMB(0x1000000000000000) | |||||
}}}; | |||||
/* sqrt(9) = 3 from the curve spec. Not exported, but used by pregen tool. */ | |||||
const unsigned char base_point_ser_for_pregen[SER_BYTES] = { | |||||
3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 | |||||
}; | |||||
const gf SQRT_ONE_MINUS_D = {FIELD_LITERAL( | |||||
0x6db8831bbddec, | |||||
0x38d7b56c9c165, | |||||
0x016b221394bdc, | |||||
0x7540f7816214a, | |||||
0x0a0d85b4032b1 | |||||
)}; |
@@ -0,0 +1 @@ | |||||
../p25519/ |
@@ -0,0 +1,29 @@ | |||||
#define SCALAR_LIMBS DECAF_448_SCALAR_LIMBS | |||||
#define SCALAR_BITS DECAF_448_SCALAR_BITS | |||||
#define NLIMBS DECAF_448_LIMBS | |||||
#define API_NS(_id) decaf_448_##_id | |||||
#define API_NS2(_pref,_id) _pref##_decaf_448_##_id | |||||
#define scalar_t decaf_448_scalar_t | |||||
#define point_t decaf_448_point_t | |||||
#define precomputed_s decaf_448_precomputed_s | |||||
#define SER_BYTES DECAF_448_SER_BYTES | |||||
#define IMAGINE_TWIST 0 | |||||
#define P_MOD_8 7 | |||||
#define COFACTOR 4 | |||||
static const int EDWARDS_D = -39081; | |||||
static const scalar_t sc_p = {{{ | |||||
SC_LIMB(0x2378c292ab5844f3), | |||||
SC_LIMB(0x216cc2728dc58f55), | |||||
SC_LIMB(0xc44edb49aed63690), | |||||
SC_LIMB(0xffffffff7cca23e9), | |||||
SC_LIMB(0xffffffffffffffff), | |||||
SC_LIMB(0xffffffffffffffff), | |||||
SC_LIMB(0x3fffffffffffffff) | |||||
}}}; | |||||
/* sqrt(5) = 2phi-1 from the curve spec. Not exported, but used by pregen tool. */ | |||||
const unsigned char base_point_ser_for_pregen[SER_BYTES] = { | |||||
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1 | |||||
}; |
@@ -0,0 +1 @@ | |||||
../p448/ |
@@ -16,26 +16,35 @@ | |||||
#include "decaf_config.h" | #include "decaf_config.h" | ||||
#define WBITS DECAF_WORD_BITS | #define WBITS DECAF_WORD_BITS | ||||
/* Rename table for eventual factoring into .c.inc, MSR ECC style */ | |||||
#define SCALAR_LIMBS DECAF_255_SCALAR_LIMBS | |||||
#define SCALAR_BITS DECAF_255_SCALAR_BITS | |||||
#define NLIMBS DECAF_255_LIMBS | |||||
#define API_NS(_id) decaf_255_##_id | |||||
#define API_NS2(_pref,_id) _pref##_decaf_255_##_id | |||||
#define scalar_t decaf_255_scalar_t | |||||
#define point_t decaf_255_point_t | |||||
#define precomputed_s decaf_255_precomputed_s | |||||
#define SER_BYTES DECAF_255_SER_BYTES | |||||
#if WBITS == 64 | #if WBITS == 64 | ||||
typedef __int128_t decaf_sdword_t; | |||||
#define SC_LIMB(x) (x##ull) | |||||
typedef __int128_t decaf_sdword_t; | |||||
#define SC_LIMB(x) (x##ull) | |||||
#elif WBITS == 32 | #elif WBITS == 32 | ||||
typedef int64_t decaf_sdword_t; | |||||
#define SC_LIMB(x) (x##ull)&((1ull<<32)-1), (x##ull)>>32 | |||||
typedef int64_t decaf_sdword_t; | |||||
#define SC_LIMB(x) (x##ull)&((1ull<<32)-1), (x##ull)>>32 | |||||
#else | #else | ||||
#error "Only supporting 32- and 64-bit platforms right now" | |||||
#error "Only supporting 32- and 64-bit platforms right now" | |||||
#endif | |||||
/* Include the curve data here */ | |||||
#include "curve_data.inc.c" | |||||
#if IMAGINE_TWIST && (P_MOD_8 != 5) | |||||
#error "Cannot use IMAGINE_TWIST except for p == 5 mod 8" | |||||
#endif | |||||
#if (COFACTOR != 8) && (COFACTOR != 4) | |||||
#error "COFACTOR must be 4 or 8" | |||||
#endif | |||||
#if IMAGINE_TWIST | |||||
extern const gf SQRT_MINUS_ONE; | |||||
#endif | |||||
#if COFACTOR == 8 | |||||
extern const gf SQRT_ONE_MINUS_D; /* TODO: Intern this? */ | |||||
#endif | #endif | ||||
#define sv static void | #define sv static void | ||||
@@ -43,23 +52,9 @@ typedef int64_t decaf_sdword_t; | |||||
#define siv static inline void __attribute__((always_inline)) | #define siv static inline void __attribute__((always_inline)) | ||||
static const gf ZERO = {{{0}}}, ONE = {{{1}}}; | static const gf ZERO = {{{0}}}, ONE = {{{1}}}; | ||||
static const int EDWARDS_D = -121665; | |||||
static const scalar_t sc_p = {{{ | |||||
SC_LIMB(0x5812631a5cf5d3ed), | |||||
SC_LIMB(0x14def9dea2f79cd6), | |||||
SC_LIMB(0), | |||||
SC_LIMB(0x1000000000000000) | |||||
}}}; | |||||
const scalar_t API_NS(scalar_one) = {{{1}}}, API_NS(scalar_zero) = {{{0}}}; | const scalar_t API_NS(scalar_one) = {{{1}}}, API_NS(scalar_zero) = {{{0}}}; | ||||
extern const scalar_t sc_r2; | |||||
extern const decaf_word_t MONTGOMERY_FACTOR; | |||||
/* sqrt(9) = 3 from the curve spec. Not exported, but used by pregen tool. */ | |||||
const unsigned char base_point_ser_for_pregen[SER_BYTES] = { | |||||
3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 | |||||
}; | |||||
extern const scalar_t API_NS(sc_r2); | |||||
extern const decaf_word_t API_NS(MONTGOMERY_FACTOR); | |||||
extern const point_t API_NS(point_base); | extern const point_t API_NS(point_base); | ||||
@@ -77,6 +72,7 @@ const precomputed_s *API_NS(precomputed_base) = | |||||
const size_t API_NS2(sizeof,precomputed_s) = sizeof(precomputed_s); | const size_t API_NS2(sizeof,precomputed_s) = sizeof(precomputed_s); | ||||
const size_t API_NS2(alignof,precomputed_s) = 32; | const size_t API_NS2(alignof,precomputed_s) = 32; | ||||
/* FIXME PERF: Vectorize vs unroll */ | |||||
#ifdef __clang__ | #ifdef __clang__ | ||||
#if 100*__clang_major__ + __clang_minor__ > 305 | #if 100*__clang_major__ + __clang_minor__ > 305 | ||||
#define UNROLL _Pragma("clang loop unroll(full)") // PERF FIXME: vectorize? | #define UNROLL _Pragma("clang loop unroll(full)") // PERF FIXME: vectorize? | ||||
@@ -222,7 +218,7 @@ snv sc_montmul ( | |||||
} | } | ||||
accum[j] = chain; | accum[j] = chain; | ||||
mand = accum[0] * MONTGOMERY_FACTOR; | |||||
mand = accum[0] * API_NS(MONTGOMERY_FACTOR); | |||||
chain = 0; | chain = 0; | ||||
mier = sc_p->limb; | mier = sc_p->limb; | ||||
for (j=0; j<SCALAR_LIMBS; j++) { | for (j=0; j<SCALAR_LIMBS; j++) { | ||||
@@ -245,7 +241,7 @@ void API_NS(scalar_mul) ( | |||||
const scalar_t b | const scalar_t b | ||||
) { | ) { | ||||
sc_montmul(out,a,b); | sc_montmul(out,a,b); | ||||
sc_montmul(out,out,sc_r2); | |||||
sc_montmul(out,out,API_NS(sc_r2)); | |||||
} | } | ||||
/* PERF: could implement this */ | /* PERF: could implement this */ | ||||
@@ -263,7 +259,7 @@ decaf_bool_t API_NS(scalar_invert) ( | |||||
#if 0 | #if 0 | ||||
/* FIELD MAGIC. TODO PERF: not updated for 25519 */ | /* FIELD MAGIC. TODO PERF: not updated for 25519 */ | ||||
scalar_t chain[7], tmp; | scalar_t chain[7], tmp; | ||||
sc_montmul(chain[0],a,sc_r2); | |||||
sc_montmul(chain[0],a,API_NS(sc_r2)); | |||||
unsigned int i,j; | unsigned int i,j; | ||||
/* Addition chain generated by a not-too-clever SAGE script. First part: compute a^(2^222-1) */ | /* Addition chain generated by a not-too-clever SAGE script. First part: compute a^(2^222-1) */ | ||||
@@ -311,8 +307,8 @@ decaf_bool_t API_NS(scalar_invert) ( | |||||
#else | #else | ||||
scalar_t b, ma; | scalar_t b, ma; | ||||
int i; | int i; | ||||
sc_montmul(b,API_NS(scalar_one),sc_r2); | |||||
sc_montmul(ma,a,sc_r2); | |||||
sc_montmul(b,API_NS(scalar_one),API_NS(sc_r2)); | |||||
sc_montmul(ma,a,API_NS(sc_r2)); | |||||
for (i=SCALAR_BITS-1; i>=0; i--) { | for (i=SCALAR_BITS-1; i>=0; i--) { | ||||
sc_montsqr(b,b); | sc_montsqr(b,b); | ||||
@@ -403,8 +399,6 @@ const point_t API_NS(point_identity) = {{{{{0}}},{{{1}}},{{{1}}},{{{0}}}}}; | |||||
static void gf_encode ( unsigned char ser[SER_BYTES], gf a ) { | static void gf_encode ( unsigned char ser[SER_BYTES], gf a ) { | ||||
gf_serialize(ser, (gf_s *)a); | gf_serialize(ser, (gf_s *)a); | ||||
} | } | ||||
extern const gf SQRT_MINUS_ONE, SQRT_ONE_MINUS_D; /* Intern this? */ | |||||
static void deisogenize ( | static void deisogenize ( | ||||
gf_s *__restrict__ s, | gf_s *__restrict__ s, | ||||
@@ -416,11 +410,13 @@ static void deisogenize ( | |||||
) { | ) { | ||||
gf c, d, x, t; | gf c, d, x, t; | ||||
gf_s *b = s, *a = minus_t_over_s; | gf_s *b = s, *a = minus_t_over_s; | ||||
#if IMAGINE_TWIST | |||||
gf_mul ( x, p->x, SQRT_MINUS_ONE); | gf_mul ( x, p->x, SQRT_MINUS_ONE); | ||||
gf_mul ( t, p->t, SQRT_MINUS_ONE); | gf_mul ( t, p->t, SQRT_MINUS_ONE); | ||||
gf_sub ( x, ZERO, x ); | gf_sub ( x, ZERO, x ); | ||||
gf_sub ( t, ZERO, t ); | gf_sub ( t, ZERO, t ); | ||||
#endif | |||||
gf DEBUG; | gf DEBUG; | ||||
gf_add ( a, p->z, x ); | gf_add ( a, p->z, x ); | ||||
@@ -437,6 +433,7 @@ static void deisogenize ( | |||||
gf_mul ( b, a, d ); /* 1/tz */ | gf_mul ( b, a, d ); /* 1/tz */ | ||||
decaf_bool_t rotate; | decaf_bool_t rotate; | ||||
#if (COFACTOR == 8) | |||||
{ | { | ||||
gf e; | gf e; | ||||
gf_sqr(e, p->z); | gf_sqr(e, p->z); | ||||
@@ -447,7 +444,9 @@ static void deisogenize ( | |||||
cond_sel ( a, a, SQRT_ONE_MINUS_D, rotate ); | cond_sel ( a, a, SQRT_ONE_MINUS_D, rotate ); | ||||
cond_sel ( x, p->y, x, rotate ); | cond_sel ( x, p->y, x, rotate ); | ||||
} | } | ||||
#else | |||||
rotate = 0; | |||||
#endif | |||||
gf_mul ( c, a, d ); // new "osx" | gf_mul ( c, a, d ); // new "osx" | ||||
gf_mul ( a, c, p->z ); | gf_mul ( a, c, p->z ); | ||||
@@ -503,24 +502,45 @@ decaf_bool_t API_NS(point_decode) ( | |||||
gf_add ( p->z, ONE, a); /* Z = 1+s^2 */ | gf_add ( p->z, ONE, a); /* Z = 1+s^2 */ | ||||
succ &= ~gf_eq( p->z, ZERO ); /* FUTURE: unnecessary? */ | succ &= ~gf_eq( p->z, ZERO ); /* FUTURE: unnecessary? */ | ||||
#if COFACTOR == 8 | |||||
gf_mul ( a, p->z, d); /* t(1+s^2) / s(1-s^2) = 2/xy */ | gf_mul ( a, p->z, d); /* t(1+s^2) / s(1-s^2) = 2/xy */ | ||||
succ &= ~lobit(a); /* = ~hibit(a/2), since hibit(x) = lobit(2x) */ | succ &= ~lobit(a); /* = ~hibit(a/2), since hibit(x) = lobit(2x) */ | ||||
#endif | |||||
gf_mul ( a, f, b ); /* y = (1-s^2) / t */ | gf_mul ( a, f, b ); /* y = (1-s^2) / t */ | ||||
gf_mul ( p->y, p->z, a ); /* Y = yZ */ | gf_mul ( p->y, p->z, a ); /* Y = yZ */ | ||||
gf_add ( a, s, s ); | |||||
gf_mul(p->x, a, SQRT_MINUS_ONE); /* Curve25519 */ | |||||
#if IMAGINE_TWIST | |||||
gf_add ( b, s, s ); | |||||
gf_mul(p->x, b, SQRT_MINUS_ONE); /* Curve25519 */ | |||||
#else | |||||
gf_add ( p->x, s, s ); | |||||
#endif | |||||
gf_mul ( p->t, p->x, a ); /* T = 2s (1-as^2)/t */ | gf_mul ( p->t, p->x, a ); /* T = 2s (1-as^2)/t */ | ||||
p->y->limb[0] -= zero; | p->y->limb[0] -= zero; | ||||
/* Curve25519 */ | |||||
assert(API_NS(point_valid)(p) | ~succ); | assert(API_NS(point_valid)(p) | ~succ); | ||||
return succ; | return succ; | ||||
} | } | ||||
#if IMAGINE_TWIST | |||||
#define TWISTED_D (-(EDWARDS_D)) | |||||
#else | |||||
#define TWISTED_D ((EDWARDS_D)-1) | |||||
#endif | |||||
#if TWISTED_D < 0 | |||||
#define EFF_D (-(TWISTED_D)) | |||||
#define NEG_D 1 | |||||
#else | |||||
#define EFF_D TWISTED_D | |||||
#define NEG_D 0 | |||||
#endif | |||||
void API_NS(point_sub) ( | void API_NS(point_sub) ( | ||||
point_t p, | point_t p, | ||||
const point_t q, | const point_t q, | ||||
@@ -534,13 +554,18 @@ void API_NS(point_sub) ( | |||||
gf_add_nr ( b, q->y, q->x ); | gf_add_nr ( b, q->y, q->x ); | ||||
gf_mul ( p->y, d, b ); | gf_mul ( p->y, d, b ); | ||||
gf_mul ( b, r->t, q->t ); | gf_mul ( b, r->t, q->t ); | ||||
gf_mulw_sgn ( p->x, b, -2*EDWARDS_D ); | |||||
gf_mulw_sgn ( p->x, b, 2*EFF_D ); | |||||
gf_add_nr ( b, a, p->y ); | gf_add_nr ( b, a, p->y ); | ||||
gf_sub_nr ( c, p->y, a ); | gf_sub_nr ( c, p->y, a ); | ||||
gf_mul ( a, q->z, r->z ); | gf_mul ( a, q->z, r->z ); | ||||
gf_add_nr ( a, a, a ); | gf_add_nr ( a, a, a ); | ||||
#if NEG_D | |||||
gf_sub_nr ( p->y, a, p->x ); | |||||
gf_add_nr ( a, a, p->x ); | |||||
#else | |||||
gf_add_nr ( p->y, a, p->x ); | gf_add_nr ( p->y, a, p->x ); | ||||
gf_sub_nr ( a, a, p->x ); | gf_sub_nr ( a, a, p->x ); | ||||
#endif | |||||
gf_mul ( p->z, a, p->y ); | gf_mul ( p->z, a, p->y ); | ||||
gf_mul ( p->x, p->y, c ); | gf_mul ( p->x, p->y, c ); | ||||
gf_mul ( p->y, a, b ); | gf_mul ( p->y, a, b ); | ||||
@@ -560,13 +585,18 @@ void API_NS(point_add) ( | |||||
gf_add_nr ( b, q->y, q->x ); | gf_add_nr ( b, q->y, q->x ); | ||||
gf_mul ( p->y, d, b ); | gf_mul ( p->y, d, b ); | ||||
gf_mul ( b, r->t, q->t ); | gf_mul ( b, r->t, q->t ); | ||||
gf_mulw_sgn ( p->x, b, -2*EDWARDS_D ); | |||||
gf_mulw_sgn ( p->x, b, 2*EFF_D ); | |||||
gf_add_nr ( b, a, p->y ); | gf_add_nr ( b, a, p->y ); | ||||
gf_sub_nr ( c, p->y, a ); | gf_sub_nr ( c, p->y, a ); | ||||
gf_mul ( a, q->z, r->z ); | gf_mul ( a, q->z, r->z ); | ||||
gf_add_nr ( a, a, a ); | gf_add_nr ( a, a, a ); | ||||
#if NEG_D | |||||
gf_add_nr ( p->y, a, p->x ); | |||||
gf_sub_nr ( a, a, p->x ); | |||||
#else | |||||
gf_sub_nr ( p->y, a, p->x ); | gf_sub_nr ( p->y, a, p->x ); | ||||
gf_add_nr ( a, a, p->x ); | gf_add_nr ( a, a, p->x ); | ||||
#endif | |||||
gf_mul ( p->z, a, p->y ); | gf_mul ( p->z, a, p->y ); | ||||
gf_mul ( p->x, p->y, c ); | gf_mul ( p->x, p->y, c ); | ||||
gf_mul ( p->y, a, b ); | gf_mul ( p->y, a, b ); | ||||
@@ -678,7 +708,7 @@ void API_NS(scalar_decode_long)( | |||||
while (i) { | while (i) { | ||||
i -= SER_BYTES; | i -= SER_BYTES; | ||||
sc_montmul(t1,t1,sc_r2); | |||||
sc_montmul(t1,t1,API_NS(sc_r2)); | |||||
ignore_result( API_NS(scalar_decode)(t2, ser+i) ); | ignore_result( API_NS(scalar_decode)(t2, ser+i) ); | ||||
API_NS(scalar_add)(t1, t1, t2); | API_NS(scalar_add)(t1, t1, t2); | ||||
} | } | ||||
@@ -715,7 +745,7 @@ static void pt_to_pniels ( | |||||
) { | ) { | ||||
gf_sub ( b->n->a, a->y, a->x ); | gf_sub ( b->n->a, a->y, a->x ); | ||||
gf_add ( b->n->b, a->x, a->y ); | gf_add ( b->n->b, a->x, a->y ); | ||||
gf_mulw_sgn ( b->n->c, a->t, -2*EDWARDS_D ); | |||||
gf_mulw_sgn ( b->n->c, a->t, 2*EFF_D ); | |||||
gf_add ( b->z, a->z, a->z ); | gf_add ( b->z, a->z, a->z ); | ||||
} | } | ||||
@@ -967,13 +997,21 @@ decaf_bool_t API_NS(point_eq) ( const point_t p, const point_t q ) { | |||||
gf_mul ( b, q->y, p->x ); | gf_mul ( b, q->y, p->x ); | ||||
decaf_bool_t succ = gf_eq(a,b); | decaf_bool_t succ = gf_eq(a,b); | ||||
/* Interesting note: the 4tor would normally be rotation. | |||||
* But because of the *i twist, it's actually | |||||
* (x,y) <-> (iy,ix) | |||||
*/ | |||||
gf_mul ( a, p->y, q->y ); | |||||
gf_mul ( b, q->x, p->x ); | |||||
succ |= gf_eq(a,b); | |||||
#if (COFACTOR == 8) && IMAGINE_TWIST | |||||
gf_mul ( a, p->y, q->y ); | |||||
gf_mul ( b, q->x, p->x ); | |||||
#if !(IMAGINE_TWIST) | |||||
gf_sub ( a, ZERO, a ); | |||||
#else | |||||
/* Interesting note: the 4tor would normally be rotation. | |||||
* But because of the *i twist, it's actually | |||||
* (x,y) <-> (iy,ix) | |||||
*/ | |||||
/* No code, just a comment. */ | |||||
#endif | |||||
succ |= gf_eq(a,b); | |||||
#endif | |||||
return succ; | return succ; | ||||
} | } | ||||
@@ -987,8 +1025,12 @@ void API_NS(point_from_hash_nonuniform) ( | |||||
gf_deser(r0,ser); | gf_deser(r0,ser); | ||||
gf_strong_reduce(r0); | gf_strong_reduce(r0); | ||||
gf_sqr(a,r0); | gf_sqr(a,r0); | ||||
//gf_sub(r,ZERO,a); /*gf_mulw_sgn(r,a,QUADRATIC_NONRESIDUE);*/ | |||||
gf_mul(r,a,SQRT_MINUS_ONE); | |||||
#if P_MOD_8 == 5 | |||||
/* r = QNR * a */ | |||||
gf_mul(r,a,SQRT_MINUS_ONE); | |||||
#else | |||||
gf_sub(r,ZERO,a); | |||||
#endif | |||||
gf_mulw_sgn(dee,ONE,EDWARDS_D); | gf_mulw_sgn(dee,ONE,EDWARDS_D); | ||||
gf_mulw_sgn(c,r,EDWARDS_D); | gf_mulw_sgn(c,r,EDWARDS_D); | ||||
@@ -1044,8 +1086,10 @@ void API_NS(point_from_hash_nonuniform) ( | |||||
cond_sel(b,c,ONE,gf_eq(c,ZERO)); /* 0,0 -> 1,0 */ | cond_sel(b,c,ONE,gf_eq(c,ZERO)); /* 0,0 -> 1,0 */ | ||||
/* isogenize */ | /* isogenize */ | ||||
#if IMAGINE_TWIST | |||||
gf_mul(c,a,SQRT_MINUS_ONE); | gf_mul(c,a,SQRT_MINUS_ONE); | ||||
gf_cpy(a,c); // TODO rename | gf_cpy(a,c); // TODO rename | ||||
#endif | |||||
gf_sqr(c,a); /* s^2 */ | gf_sqr(c,a); /* s^2 */ | ||||
gf_add(a,a,a); /* 2s */ | gf_add(a,a,a); /* 2s */ | ||||
@@ -1061,7 +1105,7 @@ void API_NS(point_from_hash_nonuniform) ( | |||||
decaf_bool_t | decaf_bool_t | ||||
API_NS(invert_elligator_nonuniform) ( | API_NS(invert_elligator_nonuniform) ( | ||||
unsigned char recovered_hash[DECAF_255_SER_BYTES], | |||||
unsigned char recovered_hash[SER_BYTES], | |||||
const point_t p, | const point_t p, | ||||
uint16_t hint_ | uint16_t hint_ | ||||
) { | ) { | ||||
@@ -1087,17 +1131,23 @@ API_NS(invert_elligator_nonuniform) ( | |||||
} | } | ||||
gf_mulw_sgn(d,c,2*EDWARDS_D-1); /* $d = (2d-a)s^2 */ | gf_mulw_sgn(d,c,2*EDWARDS_D-1); /* $d = (2d-a)s^2 */ | ||||
gf_add(a,d,b); /* num? */ | |||||
gf_add(a,b,d); /* num? */ | |||||
gf_sub(d,d,b); /* den? */ | gf_sub(d,d,b); /* den? */ | ||||
gf_mul(b,a,d); /* n*d */ | gf_mul(b,a,d); /* n*d */ | ||||
cond_sel(a,d,a,sgn_s); | cond_sel(a,d,a,sgn_s); | ||||
#if P_MOD_8 == 5 | |||||
gf_mul(d,b,SQRT_MINUS_ONE); | gf_mul(d,b,SQRT_MINUS_ONE); | ||||
#else | |||||
gf_sub(d,ZERO,b); | |||||
#endif | |||||
decaf_bool_t succ = gf_isqrt_chk(c,d,DECAF_TRUE); | decaf_bool_t succ = gf_isqrt_chk(c,d,DECAF_TRUE); | ||||
gf_mul(b,a,c); | gf_mul(b,a,c); | ||||
cond_neg(b, sgn_r0^hibit(b)); | cond_neg(b, sgn_r0^hibit(b)); | ||||
succ &= ~(gf_eq(b,ZERO) & sgn_r0); | succ &= ~(gf_eq(b,ZERO) & sgn_r0); | ||||
#if COFACTOR == 8 | |||||
succ &= ~(is_identity & sgn_ed_T); /* NB: there are no preimages of rotated identity. */ | succ &= ~(is_identity & sgn_ed_T); /* NB: there are no preimages of rotated identity. */ | ||||
#endif | |||||
gf_encode(recovered_hash, b); | gf_encode(recovered_hash, b); | ||||
/* TODO: deal with overflow flag */ | /* TODO: deal with overflow flag */ | ||||
@@ -1137,7 +1187,7 @@ decaf_bool_t API_NS(point_valid) ( | |||||
gf_sqr(b,p->y); | gf_sqr(b,p->y); | ||||
gf_sub(a,b,a); | gf_sub(a,b,a); | ||||
gf_sqr(b,p->t); | gf_sqr(b,p->t); | ||||
gf_mulw_sgn(c,b,-EDWARDS_D); | |||||
gf_mulw_sgn(c,b,TWISTED_D); | |||||
gf_sqr(b,p->z); | gf_sqr(b,p->z); | ||||
gf_add(b,b,c); | gf_add(b,b,c); | ||||
out &= gf_eq(a,b); | out &= gf_eq(a,b); | ||||
@@ -1149,18 +1199,18 @@ void API_NS(point_debugging_torque) ( | |||||
point_t q, | point_t q, | ||||
const point_t p | const point_t p | ||||
) { | ) { | ||||
#if 0 | |||||
gf_sub(q->x,ZERO,p->x); | |||||
gf_sub(q->y,ZERO,p->y); | |||||
gf_cpy(q->z,p->z); | |||||
gf_cpy(q->t,p->t); | |||||
#else | |||||
#if COFACTOR == 8 | |||||
gf tmp; | gf tmp; | ||||
gf_mul(tmp,p->x,SQRT_MINUS_ONE); | gf_mul(tmp,p->x,SQRT_MINUS_ONE); | ||||
gf_mul(q->x,p->y,SQRT_MINUS_ONE); | gf_mul(q->x,p->y,SQRT_MINUS_ONE); | ||||
gf_cpy(q->y,tmp); | gf_cpy(q->y,tmp); | ||||
gf_cpy(q->z,p->z); | gf_cpy(q->z,p->z); | ||||
gf_sub(q->t,ZERO,p->t); | gf_sub(q->t,ZERO,p->t); | ||||
#else | |||||
gf_sub(q->x,ZERO,p->x); | |||||
gf_sub(q->y,ZERO,p->y); | |||||
gf_cpy(q->z,p->z); | |||||
gf_cpy(q->t,p->t); | |||||
#endif | #endif | ||||
} | } | ||||
@@ -22,8 +22,8 @@ | |||||
const gf API_NS(precomputed_base_as_fe)[1]; | const gf API_NS(precomputed_base_as_fe)[1]; | ||||
const API_NS(scalar_t) API_NS(precomputed_scalarmul_adjustment); | const API_NS(scalar_t) API_NS(precomputed_scalarmul_adjustment); | ||||
const API_NS(scalar_t) API_NS(point_scalarmul_adjustment); | const API_NS(scalar_t) API_NS(point_scalarmul_adjustment); | ||||
const API_NS(scalar_t) sc_r2 = {{{0}}}; | |||||
const decaf_word_t MONTGOMERY_FACTOR = 0; | |||||
const API_NS(scalar_t) API_NS(sc_r2) = {{{0}}}; | |||||
const decaf_word_t API_NS(MONTGOMERY_FACTOR) = 0; | |||||
const unsigned char base_point_ser_for_pregen[DECAF_255_SER_BYTES]; | const unsigned char base_point_ser_for_pregen[DECAF_255_SER_BYTES]; | ||||
const API_NS(point_t) API_NS(point_base); | const API_NS(point_t) API_NS(point_base); | ||||
@@ -147,7 +147,7 @@ int main(int argc, char **argv) { | |||||
for (i=0; i<sizeof(API_NS(scalar_t))*8*2; i++) { | for (i=0; i<sizeof(API_NS(scalar_t))*8*2; i++) { | ||||
API_NS(scalar_add)(smadj,smadj,smadj); | API_NS(scalar_add)(smadj,smadj,smadj); | ||||
} | } | ||||
scalar_print("sc_r2", smadj); | |||||
scalar_print("API_NS(sc_r2)", smadj); | |||||
API_NS(scalar_sub)(smadj,API_NS(scalar_zero),API_NS(scalar_one)); /* get p-1 */ | API_NS(scalar_sub)(smadj,API_NS(scalar_zero),API_NS(scalar_one)); /* get p-1 */ | ||||
@@ -159,7 +159,7 @@ int main(int argc, char **argv) { | |||||
for (i=0; i<6; i++) { | for (i=0; i<6; i++) { | ||||
w *= w*plo + 2; | w *= w*plo + 2; | ||||
} | } | ||||
printf("const decaf_word_t MONTGOMERY_FACTOR = (decaf_word_t)0x%016llxull;\n\n", w); | |||||
printf("const decaf_word_t API_NS(MONTGOMERY_FACTOR) = (decaf_word_t)0x%016llxull;\n\n", w); | |||||
return 0; | return 0; | ||||
} | } |
@@ -2,7 +2,7 @@ | |||||
* Released under the MIT License. See LICENSE.txt for license information. | * Released under the MIT License. See LICENSE.txt for license information. | ||||
*/ | */ | ||||
#include "p25519.h" | |||||
#include "f_impl.h" | |||||
static __inline__ __uint128_t widemul( | static __inline__ __uint128_t widemul( | ||||
const uint64_t a, | const uint64_t a, |
@@ -2,7 +2,7 @@ | |||||
* Released under the MIT License. See LICENSE.txt for license information. | * Released under the MIT License. See LICENSE.txt for license information. | ||||
*/ | */ | ||||
#include "p25519.h" | |||||
#include "f_impl.h" | |||||
#include "x86-64-arith.h" | #include "x86-64-arith.h" | ||||
static inline uint64_t shr(__uint128_t x, int n) { | static inline uint64_t shr(__uint128_t x, int n) { |
@@ -18,14 +18,6 @@ const gf_25519_t P25519_SQRT_MINUS_ONE = {FIELD_LITERAL( | |||||
0x2b8324804fc1d | 0x2b8324804fc1d | ||||
)}; | )}; | ||||
const gf_25519_t SQRT_ONE_MINUS_D = {FIELD_LITERAL( // FIXME MAGIC goes elsewhere? | |||||
0x6db8831bbddec, | |||||
0x38d7b56c9c165, | |||||
0x016b221394bdc, | |||||
0x7540f7816214a, | |||||
0x0a0d85b4032b1 | |||||
)}; | |||||
static const gf_25519_t ONE = {FIELD_LITERAL( // FIXME copy-pasted | static const gf_25519_t ONE = {FIELD_LITERAL( // FIXME copy-pasted | ||||
1,0,0,0,0 | 1,0,0,0,0 | ||||
)}; | )}; | ||||
@@ -12,7 +12,7 @@ | |||||
#include "constant_time.h" | #include "constant_time.h" | ||||
#include <string.h> | #include <string.h> | ||||
#include "p25519.h" | |||||
#include "f_impl.h" | |||||
#define GF_LIT_LIMB_BITS 51 | #define GF_LIT_LIMB_BITS 51 | ||||
#define GF_BITS 255 | #define GF_BITS 255 | ||||
#define gf gf_25519_t | #define gf gf_25519_t | ||||
@@ -3,7 +3,7 @@ | |||||
*/ | */ | ||||
#include "word.h" | #include "word.h" | ||||
#include "p448.h" | |||||
#include "f_impl.h" | |||||
static inline mask_t __attribute__((always_inline)) | static inline mask_t __attribute__((always_inline)) | ||||
is_zero ( | is_zero ( |
@@ -3,7 +3,7 @@ | |||||
*/ | */ | ||||
#include "word.h" | #include "word.h" | ||||
#include "p448.h" | |||||
#include "f_impl.h" | |||||
static inline mask_t __attribute__((always_inline)) | static inline mask_t __attribute__((always_inline)) | ||||
is_zero ( | is_zero ( |
@@ -3,7 +3,7 @@ | |||||
*/ | */ | ||||
#include "word.h" | #include "word.h" | ||||
#include "p448.h" | |||||
#include "f_impl.h" | |||||
static inline mask_t __attribute__((always_inline)) | static inline mask_t __attribute__((always_inline)) | ||||
is_zero ( | is_zero ( |
@@ -2,7 +2,7 @@ | |||||
* Released under the MIT License. See LICENSE.txt for license information. | * Released under the MIT License. See LICENSE.txt for license information. | ||||
*/ | */ | ||||
#include "p448.h" | |||||
#include "f_impl.h" | |||||
static __inline__ __uint128_t widemul( | static __inline__ __uint128_t widemul( | ||||
const uint64_t a, | const uint64_t a, |
@@ -2,7 +2,7 @@ | |||||
* Released under the MIT License. See LICENSE.txt for license information. | * Released under the MIT License. See LICENSE.txt for license information. | ||||
*/ | */ | ||||
#include "p448.h" | |||||
#include "f_impl.h" | |||||
#include "x86-64-arith.h" | #include "x86-64-arith.h" | ||||
void | void |
@@ -12,10 +12,10 @@ | |||||
void | void | ||||
gf_isr ( | gf_isr ( | ||||
gf_a_t a, | |||||
const gf_a_t x | |||||
gf a, | |||||
const gf x | |||||
) { | ) { | ||||
gf_a_t L0, L1, L2; | |||||
gf L0, L1, L2; | |||||
gf_sqr ( L1, x ); | gf_sqr ( L1, x ); | ||||
gf_mul ( L2, x, L1 ); | gf_mul ( L2, x, L1 ); | ||||
gf_sqr ( L1, L2 ); | gf_sqr ( L1, L2 ); | ||||
@@ -12,7 +12,7 @@ | |||||
#include "constant_time.h" | #include "constant_time.h" | ||||
#include <string.h> | #include <string.h> | ||||
#include "p448.h" | |||||
#include "f_impl.h" | |||||
#define GF_LIT_LIMB_BITS 56 | #define GF_LIT_LIMB_BITS 56 | ||||
#define GF_BITS 448 | #define GF_BITS 448 | ||||
#define gf p448_t | #define gf p448_t | ||||
@@ -2,7 +2,7 @@ | |||||
* Released under the MIT License. See LICENSE.txt for license information. | * Released under the MIT License. See LICENSE.txt for license information. | ||||
*/ | */ | ||||
#include "p480.h" | |||||
#include "f_impl.h" | |||||
#include "x86-64-arith.h" | #include "x86-64-arith.h" | ||||
void | void |
@@ -12,7 +12,7 @@ | |||||
#include "constant_time.h" | #include "constant_time.h" | ||||
#include <string.h> | #include <string.h> | ||||
#include "p480.h" | |||||
#include "f_impl.h" | |||||
#define GF_LIT_LIMB_BITS 60 | #define GF_LIT_LIMB_BITS 60 | ||||
#define GF_BITS 480 | #define GF_BITS 480 | ||||
#define gf p480_t | #define gf p480_t | ||||
@@ -2,7 +2,7 @@ | |||||
* Released under the MIT License. See LICENSE.txt for license information. | * Released under the MIT License. See LICENSE.txt for license information. | ||||
*/ | */ | ||||
#include "p521.h" | |||||
#include "f_impl.h" | |||||
static __inline__ __uint128_t widemul( | static __inline__ __uint128_t widemul( | ||||
const uint64_t a, | const uint64_t a, |
@@ -2,7 +2,7 @@ | |||||
* Released under the MIT License. See LICENSE.txt for license information. | * Released under the MIT License. See LICENSE.txt for license information. | ||||
*/ | */ | ||||
#include "p521.h" | |||||
#include "f_impl.h" | |||||
typedef struct { | typedef struct { | ||||
uint64x3_t lo, hi, hier; | uint64x3_t lo, hi, hier; |
@@ -12,7 +12,7 @@ | |||||
#include <string.h> | #include <string.h> | ||||
#include "constant_time.h" | #include "constant_time.h" | ||||
#include "p521.h" | |||||
#include "f_impl.h" | |||||
#define GF_LIT_LIMB_BITS 58 | #define GF_LIT_LIMB_BITS 58 | ||||
#define GF_BITS 521 | #define GF_BITS 521 | ||||
#define gf p521_t | #define gf p521_t | ||||