@@ -78,7 +78,7 @@ GEN_HEADERS=\ | |||||
HEADERS= Makefile $(shell find src test -name "*.h") $(BUILD_OBJ)/timestamp $(GEN_HEADERS) | HEADERS= Makefile $(shell find src test -name "*.h") $(BUILD_OBJ)/timestamp $(GEN_HEADERS) | ||||
# components needed by the lib | # components needed by the lib | ||||
LIBCOMPONENTS = $(BUILD_OBJ)/utils.o $(BUILD_OBJ)/shake.o $(BUILD_OBJ)/decaf_crypto_ed25519.o $(BUILD_OBJ)/decaf_crypto_ed448goldilocks.o # and per-field components | |||||
LIBCOMPONENTS = $(BUILD_OBJ)/utils.o $(BUILD_OBJ)/shake.o $(BUILD_OBJ)/decaf_crypto_curve25519.o $(BUILD_OBJ)/decaf_crypto_ed448goldilocks.o # and per-field components | |||||
BENCHCOMPONENTS = $(BUILD_OBJ)/bench.o $(BUILD_OBJ)/shake.o | BENCHCOMPONENTS = $(BUILD_OBJ)/bench.o $(BUILD_OBJ)/shake.o | ||||
@@ -167,24 +167,24 @@ $$(BUILD_C)/decaf_tables_$(1).c: $$(BUILD_IBIN)/decaf_gen_tables_$(1) | |||||
$$(BUILD_ASM)/decaf_tables_$(1).s: $$(BUILD_C)/decaf_tables_$(1).c $$(HEADERS) | $$(BUILD_ASM)/decaf_tables_$(1).s: $$(BUILD_C)/decaf_tables_$(1).c $$(HEADERS) | ||||
$$(CC) $$(CFLAGS) -S -c -o $$@ $$< \ | $$(CC) $$(CFLAGS) -S -c -o $$@ $$< \ | ||||
-I src/curve_$(1)/ -I src/$(2) -I src/$(2)/$$(ARCH_FOR_$(2)) -I src/include/$$(ARCH_FOR_$(2)) \ | |||||
-I build/obj/curve_$(1)/ -I src/$(2) -I src/$(2)/$$(ARCH_FOR_$(2)) -I src/include/$$(ARCH_FOR_$(2)) \ | |||||
-I $(BUILD_H)/curve_$(1) -I $(BUILD_H)/$(2) -I $(BUILD_H)/$(2)/$$(ARCH_FOR_$(2)) | -I $(BUILD_H)/curve_$(1) -I $(BUILD_H)/$(2) -I $(BUILD_H)/$(2)/$$(ARCH_FOR_$(2)) | ||||
$$(BUILD_ASM)/decaf_gen_tables_$(1).s: src/decaf_gen_tables.c $$(HEADERS) | $$(BUILD_ASM)/decaf_gen_tables_$(1).s: src/decaf_gen_tables.c $$(HEADERS) | ||||
$$(CC) $$(CFLAGS) \ | $$(CC) $$(CFLAGS) \ | ||||
-I src/curve_$(1) -I src/$(2) -I src/$(2)/$$(ARCH_FOR_$(2)) -I src/include/$$(ARCH_FOR_$(2)) \ | |||||
-I build/obj/curve_$(1) -I src/$(2) -I src/$(2)/$$(ARCH_FOR_$(2)) -I src/include/$$(ARCH_FOR_$(2)) \ | |||||
-I $(BUILD_H)/curve_$(1) -I $(BUILD_H)/$(2) -I $(BUILD_H)/$(2)/$$(ARCH_FOR_$(2)) \ | -I $(BUILD_H)/curve_$(1) -I $(BUILD_H)/$(2) -I $(BUILD_H)/$(2)/$$(ARCH_FOR_$(2)) \ | ||||
-S -c -o $$@ $$< | -S -c -o $$@ $$< | ||||
$$(BUILD_ASM)/decaf_$(1).s: src/decaf.c $$(HEADERS) | $$(BUILD_ASM)/decaf_$(1).s: src/decaf.c $$(HEADERS) | ||||
$$(CC) $$(CFLAGS) \ | $$(CC) $$(CFLAGS) \ | ||||
-I src/curve_$(1)/ -I src/$(2) -I src/$(2)/$$(ARCH_FOR_$(2)) -I src/include/$$(ARCH_FOR_$(2)) \ | |||||
-I build/obj/curve_$(1)/ -I src/$(2) -I src/$(2)/$$(ARCH_FOR_$(2)) -I src/include/$$(ARCH_FOR_$(2)) \ | |||||
-I $(BUILD_H)/curve_$(1) -I $(BUILD_H)/$(2) -I $(BUILD_H)/$(2)/$$(ARCH_FOR_$(2)) \ | -I $(BUILD_H)/curve_$(1) -I $(BUILD_H)/$(2) -I $(BUILD_H)/$(2)/$$(ARCH_FOR_$(2)) \ | ||||
-S -c -o $$@ $$< | -S -c -o $$@ $$< | ||||
$$(BUILD_ASM)/decaf_crypto_$(1).s: src/decaf_crypto.c $$(HEADERS) | $$(BUILD_ASM)/decaf_crypto_$(1).s: src/decaf_crypto.c $$(HEADERS) | ||||
$$(CC) $$(CFLAGS) \ | $$(CC) $$(CFLAGS) \ | ||||
-I src/curve_$(1)/ -I src/$(2) -I src/$(2)/$$(ARCH_FOR_$(2)) -I src/include/$$(ARCH_FOR_$(2)) \ | |||||
-I build/obj/curve_$(1)/ -I src/$(2) -I src/$(2)/$$(ARCH_FOR_$(2)) -I src/include/$$(ARCH_FOR_$(2)) \ | |||||
-I $(BUILD_H)/curve_$(1) -I $(BUILD_H)/$(2) -I $(BUILD_H)/$(2)/$$(ARCH_FOR_$(2)) \ | -I $(BUILD_H)/curve_$(1) -I $(BUILD_H)/$(2) -I $(BUILD_H)/$(2)/$$(ARCH_FOR_$(2)) \ | ||||
-S -c -o $$@ $$< | -S -c -o $$@ $$< | ||||
@@ -194,7 +194,7 @@ endef | |||||
################################################################ | ################################################################ | ||||
# call code above to generate curves and fields | # call code above to generate curves and fields | ||||
$(eval $(call define_field,p25519,arch_x86_64)) | $(eval $(call define_field,p25519,arch_x86_64)) | ||||
$(eval $(call define_curve,ed25519,p25519)) | |||||
$(eval $(call define_curve,curve25519,p25519)) | |||||
$(eval $(call define_field,p448,arch_x86_64)) | $(eval $(call define_field,p448,arch_x86_64)) | ||||
$(eval $(call define_curve,ed448goldilocks,p448)) | $(eval $(call define_curve,ed448goldilocks,p448)) | ||||
@@ -1,40 +0,0 @@ | |||||
#define API_NAME "decaf_255" | |||||
#define API_NS(_id) decaf_255_##_id | |||||
#define API_NS2(_pref,_id) _pref##_decaf_255_##_id | |||||
#define SCALAR_LIMBS DECAF_255_SCALAR_LIMBS | |||||
#define SCALAR_BITS DECAF_255_SCALAR_BITS | |||||
#define scalar_t decaf_255_scalar_t | |||||
#define point_t decaf_255_point_t | |||||
#define precomputed_s decaf_255_precomputed_s | |||||
#define IMAGINE_TWIST 1 | |||||
#define P_MOD_8 5 | |||||
#define COFACTOR 8 | |||||
#ifndef DECAF_JUST_API | |||||
static const int EDWARDS_D = -121665; | |||||
static const scalar_t sc_p = {{{ | |||||
SC_LIMB(0x5812631a5cf5d3ed), | |||||
SC_LIMB(0x14def9dea2f79cd6), | |||||
SC_LIMB(0), | |||||
SC_LIMB(0x1000000000000000) | |||||
}}}; | |||||
#ifdef GEN_TABLES | |||||
/* sqrt(9) = 3 from the curve spec. Not exported, but used by pregen tool. */ | |||||
static 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 | |||||
}; | |||||
#endif | |||||
static const gf SQRT_ONE_MINUS_D = {FIELD_LITERAL( | |||||
0x6db8831bbddec, | |||||
0x38d7b56c9c165, | |||||
0x016b221394bdc, | |||||
0x7540f7816214a, | |||||
0x0a0d85b4032b1 | |||||
)}; | |||||
#endif /* DECAF_JUST_API */ |
@@ -1,34 +0,0 @@ | |||||
#define API_NAME "decaf_448" | |||||
#define API_NS(_id) decaf_448_##_id | |||||
#define API_NS2(_pref,_id) _pref##_decaf_448_##_id | |||||
#define SCALAR_LIMBS DECAF_448_SCALAR_LIMBS | |||||
#define SCALAR_BITS DECAF_448_SCALAR_BITS | |||||
#define scalar_t decaf_448_scalar_t | |||||
#define point_t decaf_448_point_t | |||||
#define precomputed_s decaf_448_precomputed_s | |||||
#define IMAGINE_TWIST 0 | |||||
#define P_MOD_8 7 | |||||
#define COFACTOR 4 | |||||
#ifndef DECAF_JUST_API | |||||
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) | |||||
}}}; | |||||
#ifdef GEN_TABLES | |||||
/* sqrt(5) = 2phi-1 from the curve spec. Not exported, but used by pregen tool. */ | |||||
static 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 | |||||
}; | |||||
#endif | |||||
#endif /* DECAF_JUST_API */ |
@@ -19,16 +19,50 @@ curve_data = { | |||||
"name" : "Iso-Ed25519", | "name" : "Iso-Ed25519", | ||||
"cofactor" : 8, | "cofactor" : 8, | ||||
"field" : "p25519", | "field" : "p25519", | ||||
"scalar_bits" : 253 | |||||
"scalar_bits" : 253, | |||||
"d": -121665, | |||||
"trace": -0xa6f7cef517bce6b2c09318d2e7ae9f7a, | |||||
"mont_base": 9 | |||||
}, | }, | ||||
"Ed448" : { | "Ed448" : { | ||||
"name" : "Ed448-Goldilocks", | "name" : "Ed448-Goldilocks", | ||||
"cofactor" : 4, | "cofactor" : 4, | ||||
"field" : "p448", | "field" : "p448", | ||||
"scalar_bits" : 446 | |||||
"scalar_bits" : 446, | |||||
"d": -39081, | |||||
"trace": 0x10cd77058eec492d944a725bf7a4cf635c8e9c2ab721cf5b5529eec34, | |||||
"mont_base": 5 | |||||
} | } | ||||
} | } | ||||
def ser(x,bits,paren=None): | |||||
out = "" | |||||
mask = 2**bits - 1 | |||||
first = True | |||||
while x > 0 or first: | |||||
desc = "0x%0*x" % ((bits+3)//4,x&mask) | |||||
if paren is not None: | |||||
desc = "%s(%s)" % (paren,desc) | |||||
if not first: out += ", " | |||||
out += desc | |||||
x = x >> bits | |||||
first = False | |||||
return out | |||||
def msqrt(x,p,hi_bit_clear = True): | |||||
if p % 4 == 3: ret = pow(x,(p+1)//4,p) | |||||
elif p % 8 == 5: | |||||
for u in xrange(1,1000): | |||||
if pow(u,(p-1)//2,p) != 1: break | |||||
u = pow(u,(p-1)//4,p) | |||||
ret = pow(x,(p+3)//8,p) | |||||
if pow(ret,2,p) != (x % p): ret = (ret * u) % p | |||||
else: raise Exception("sqrt only for 3-mod-4 or 5-mod-8") | |||||
if (ret**2-x) % p != 0: raise Exception("No sqrt") | |||||
if hi_bit_clear and ret > p//2: ret = p-ret | |||||
return ret | |||||
def ceil_log2(x): | def ceil_log2(x): | ||||
out = 0 | out = 0 | ||||
cmp = 1 | cmp = 1 | ||||
@@ -38,9 +72,10 @@ def ceil_log2(x): | |||||
return out | return out | ||||
for field,data in field_data.iteritems(): | for field,data in field_data.iteritems(): | ||||
if "modulus" not in data: | if "modulus" not in data: | ||||
data["modulus"] = eval(data["gf_desc"].replace("^","**")) | data["modulus"] = eval(data["gf_desc"].replace("^","**")) | ||||
data["p_mod_8"] = data["modulus"] % 8 | |||||
if "gf_bits" not in data: | if "gf_bits" not in data: | ||||
data["gf_bits"] = ceil_log2(data["modulus"]) | data["gf_bits"] = ceil_log2(data["modulus"]) | ||||
@@ -52,41 +87,52 @@ for field,data in field_data.iteritems(): | |||||
data["x_priv_bytes"] = (data["gf_bits"]-1)//8 + 1 | data["x_priv_bytes"] = (data["gf_bits"]-1)//8 + 1 | ||||
if "x_priv_bits" not in data: | if "x_priv_bits" not in data: | ||||
data["x_priv_bits"] = ceil_log2(data["modulus"]*0.99) | |||||
data["x_priv_bits"] = ceil_log2(data["modulus"]*0.99) # not per curve at least in 7748 | |||||
data["ser_modulus"] = ser(data["modulus"], data["gf_lit_limb_bits"]) | |||||
if data["modulus"] % 4 == 1: data["sqrt_minus_one"] = ser(msqrt(-1,data["modulus"]), data["gf_lit_limb_bits"]) | |||||
else: data["sqrt_minus_one"] = "/* NONE */" | |||||
for curve,data in curve_data.iteritems(): | for curve,data in curve_data.iteritems(): | ||||
for key in field_data[data["field"]]: | for key in field_data[data["field"]]: | ||||
if key not in data: | if key not in data: | ||||
data[key] = field_data[data["field"]][key] | data[key] = field_data[data["field"]][key] | ||||
if "iso_to" not in data: | if "iso_to" not in data: | ||||
data["iso_to"] = data["name"] | data["iso_to"] = data["name"] | ||||
if "cxx_ns" not in data: | if "cxx_ns" not in data: | ||||
data["cxx_ns"] = data["name"].replace("-","") | data["cxx_ns"] = data["name"].replace("-","") | ||||
if "modulus_type" not in data: | |||||
mod = data["modulus"] | |||||
ptwo = 2 | |||||
while mod % ptwo == 1: | |||||
ptwo *= 2 | |||||
data["modulus_type"] = mod % ptwo | |||||
if "c_filename" not in data: | |||||
data["c_filename"] = data["iso_to"].replace("-","").lower() | |||||
mod = data["modulus"] | |||||
ptwo = 2 | |||||
while mod % ptwo == 1: | |||||
ptwo *= 2 | |||||
data["modulus_type"] = mod % ptwo | |||||
if "imagine_twist" not in data: | |||||
if data["modulus_type"] == 3: data["imagine_twist"] = 0 | |||||
else: data["imagine_twist"] = 1 | |||||
data["q"] = (data["modulus"]+1-data["trace"]) // data["cofactor"] | |||||
data["bits"] = ceil_log2(data["modulus"]) | |||||
data["decaf_base"] = ser(msqrt(data["mont_base"],data["modulus"]),8) | |||||
data["scalar_p"] = ser(data["q"],64,"SC_LIMB") | |||||
if "bits" not in data: | |||||
data["bits"] = ceil_log2(data["modulus"]) | |||||
if data["cofactor"] > 4: data["sqrt_one_minus_d"] = ser(msqrt(1-data["d"],data["modulus"]),data["gf_lit_limb_bits"]) | |||||
else: data["sqrt_one_minus_d"] = "/* NONE */" | |||||
if "shortname" not in data: | if "shortname" not in data: | ||||
data["shortname"] = str(data["bits"]) | data["shortname"] = str(data["bits"]) | ||||
if "c_ns" not in data: | if "c_ns" not in data: | ||||
data["c_ns"] = "decaf_" + data["shortname"] | data["c_ns"] = "decaf_" + data["shortname"] | ||||
data["C_NS"] = data["c_ns"].upper() | |||||
if "ser_bytes" not in data: | |||||
data["ser_bytes"] = (data["bits"]-2)//8 + 1 | |||||
if "scalar_ser_bytes" not in data: | |||||
data["scalar_ser_bytes"] = (data["scalar_bits"]-1)//8 + 1 | |||||
data["ser_bytes"] = (data["bits"]-2)//8 + 1 # TODO: split for decaf vs non-decaf | |||||
data["scalar_ser_bytes"] = (data["scalar_bits"]-1)//8 + 1 | |||||
if "C_NS" not in data: | |||||
data["C_NS"] = data["c_ns"].upper() | |||||
@@ -0,0 +1,44 @@ | |||||
from gen_file import gen_file | |||||
curve_data_inc_c = gen_file( | |||||
public = False, | |||||
per = "curve", | |||||
name = "curve_%(c_filename)s/curve_data.inc.c", | |||||
doc = """@brief Curve data for %(name)s.""", | |||||
code = """ | |||||
#define API_NAME "%(c_ns)s" | |||||
#define API_NS(_id) %(c_ns)s_##_id | |||||
#define API_NS2(_pref,_id) _pref##_%(c_ns)s_##_id | |||||
#define SCALAR_BITS %(C_NS)s_SCALAR_BITS | |||||
#ifndef DECAF_JUST_API | |||||
#define SCALAR_LIMBS %(C_NS)s_SCALAR_LIMBS | |||||
#define scalar_t API_NS(scalar_t) | |||||
#define point_t API_NS(point_t) | |||||
#define precomputed_s API_NS(precomputed_s) | |||||
#define IMAGINE_TWIST %(imagine_twist)d | |||||
#define COFACTOR %(cofactor)d | |||||
static const int EDWARDS_D = %(d)d; | |||||
static const scalar_t sc_p = {{{ | |||||
%(scalar_p)s | |||||
}}}; | |||||
#ifdef GEN_TABLES | |||||
/* Not exported, but used by pregen tool. */ | |||||
static const unsigned char base_point_ser_for_pregen[SER_BYTES] = { | |||||
%(decaf_base)s | |||||
}; | |||||
#endif | |||||
#if COFACTOR==8 | |||||
static const gf SQRT_ONE_MINUS_D = {FIELD_LITERAL( | |||||
%(sqrt_one_minus_d)s | |||||
)}; | |||||
#endif | |||||
#endif /* DECAF_JUST_API */ | |||||
""") |
@@ -55,8 +55,6 @@ typedef struct gf_%(gf_shortname)s_s { | |||||
extern "C" { | extern "C" { | ||||
#endif | #endif | ||||
const gf MODULUS, ZERO, ONE; | |||||
/* Defined below in f_impl.h */ | /* Defined below in f_impl.h */ | ||||
static INLINE_UNUSED void gf_copy (gf out, const gf a) { *out = *a; } | static INLINE_UNUSED void gf_copy (gf out, const gf a) { *out = *a; } | ||||
static INLINE_UNUSED void gf_add_RAW (gf out, const gf a, const gf b); | static INLINE_UNUSED void gf_add_RAW (gf out, const gf a, const gf b); | ||||
@@ -82,8 +80,21 @@ mask_t gf_deserialize (gf x, const uint8_t serial[(GF_BITS-1)/8+1]); | |||||
#include "f_impl.h" /* Bring in the inline implementations */ | #include "f_impl.h" /* Bring in the inline implementations */ | ||||
static const gf MODULUS = {FIELD_LITERAL( | |||||
%(ser_modulus)s | |||||
)}; | |||||
#define P_MOD_8 %(p_mod_8)d | |||||
#if P_MOD_8 == 5 | |||||
static const gf SQRT_MINUS_ONE = {FIELD_LITERAL( /* TODO make not static */ | |||||
%(sqrt_minus_one)s | |||||
)}; | |||||
#endif | |||||
#ifndef LIMBPERM | #ifndef LIMBPERM | ||||
#define LIMBPERM(i) (i) | #define LIMBPERM(i) (i) | ||||
#endif | #endif | ||||
#define LIMB_MASK(i) (((1ull)<<LIMB_PLACE_VALUE(i))-1) | #define LIMB_MASK(i) (((1ull)<<LIMB_PLACE_VALUE(i))-1) | ||||
static const gf ZERO = {{{0}}}, ONE = {{{ [LIMBPERM(0)] = 1 }}}; | |||||
""") | """) |
@@ -18,6 +18,7 @@ from crypto_h import crypto_h | |||||
from crypto_hxx import crypto_hxx | from crypto_hxx import crypto_hxx | ||||
from f_field_h import f_field_h | from f_field_h import f_field_h | ||||
from curve_data import curve_data | from curve_data import curve_data | ||||
from curve_data_inc_c import curve_data_inc_c | |||||
root_hxx_code = "\n".join(( | root_hxx_code = "\n".join(( | ||||
"#include <%s>" % name | "#include <%s>" % name | ||||
@@ -110,7 +111,7 @@ decaf_root_hxx = gen_file( | |||||
for name,(public,code) in gend_files.iteritems(): | for name,(public,code) in gend_files.iteritems(): | ||||
_,_,name_suffix = name.partition(".") | |||||
_,_,name_suffix = name.rpartition(".") | |||||
prefix = prefixes[(public,name_suffix)] | prefix = prefixes[(public,name_suffix)] | ||||
if not os.path.exists(os.path.dirname(prefix + "/" + name)): | if not os.path.exists(os.path.dirname(prefix + "/" + name)): | ||||
os.makedirs(os.path.dirname(prefix + "/" + name)) | os.makedirs(os.path.dirname(prefix + "/" + name)) | ||||
@@ -11,18 +11,6 @@ | |||||
#include "field.h" | #include "field.h" | ||||
#include "constant_time.h" | #include "constant_time.h" | ||||
const gf SQRT_MINUS_ONE = {FIELD_LITERAL( | |||||
0x61b274a0ea0b0, | |||||
0x0d5a5fc8f189d, | |||||
0x7ef5e9cbd0c60, | |||||
0x78595a6804c9e, | |||||
0x2b8324804fc1d | |||||
)}; | |||||
const gf MODULUS = {FIELD_LITERAL( | |||||
0x7ffffffffffed, 0x7ffffffffffff, 0x7ffffffffffff, 0x7ffffffffffff, 0x7ffffffffffff | |||||
)}; | |||||
/* Guarantee: a^2 x = 0 if x = 0; else a^2 x = 1 or SQRT_MINUS_ONE; */ | /* Guarantee: a^2 x = 0 if x = 0; else a^2 x = 1 or SQRT_MINUS_ONE; */ | ||||
void gf_isr (gf a, const gf x) { | void gf_isr (gf a, const gf x) { | ||||
gf st[3], tmp1, tmp2; | gf st[3], tmp1, tmp2; | ||||
@@ -10,39 +10,34 @@ | |||||
#include "field.h" | #include "field.h" | ||||
const gf MODULUS = {FIELD_LITERAL( | |||||
0xffffffffffffff, 0xffffffffffffff, 0xffffffffffffff, 0xffffffffffffff, | |||||
0xfffffffffffffe, 0xffffffffffffff, 0xffffffffffffff, 0xffffffffffffff | |||||
)}; | |||||
void | void | ||||
gf_isr ( | gf_isr ( | ||||
gf a, | gf a, | ||||
const gf x | const gf x | ||||
) { | ) { | ||||
gf L0, L1, L2; | gf L0, L1, L2; | ||||
gf_sqr ( L1, x ); | |||||
gf_mul ( L2, x, L1 ); | |||||
gf_sqr ( L1, L2 ); | |||||
gf_mul ( L2, x, L1 ); | |||||
gf_sqrn ( L1, L2, 3 ); | |||||
gf_mul ( L0, L2, L1 ); | |||||
gf_sqrn ( L1, L0, 3 ); | |||||
gf_mul ( L0, L2, L1 ); | |||||
gf_sqrn ( L2, L0, 9 ); | |||||
gf_mul ( L1, L0, L2 ); | |||||
gf_sqr ( L0, L1 ); | |||||
gf_mul ( L2, x, L0 ); | |||||
gf_sqrn ( L0, L2, 18 ); | |||||
gf_mul ( L2, L1, L0 ); | |||||
gf_sqrn ( L0, L2, 37 ); | |||||
gf_mul ( L1, L2, L0 ); | |||||
gf_sqrn ( L0, L1, 37 ); | |||||
gf_mul ( L1, L2, L0 ); | |||||
gf_sqrn ( L0, L1, 111 ); | |||||
gf_mul ( L2, L1, L0 ); | |||||
gf_sqr ( L0, L2 ); | |||||
gf_mul ( L1, x, L0 ); | |||||
gf_sqrn ( L0, L1, 223 ); | |||||
gf_mul ( a, L2, L0 ); | |||||
gf_sqr (L1, x ); | |||||
gf_mul (L2, x, L1 ); | |||||
gf_sqr (L1, L2 ); | |||||
gf_mul (L2, x, L1 ); | |||||
gf_sqrn (L1, L2, 3 ); | |||||
gf_mul (L0, L2, L1 ); | |||||
gf_sqrn (L1, L0, 3 ); | |||||
gf_mul (L0, L2, L1 ); | |||||
gf_sqrn (L2, L0, 9 ); | |||||
gf_mul (L1, L0, L2 ); | |||||
gf_sqr (L0, L1 ); | |||||
gf_mul (L2, x, L0 ); | |||||
gf_sqrn (L0, L2, 18 ); | |||||
gf_mul (L2, L1, L0 ); | |||||
gf_sqrn (L0, L2, 37 ); | |||||
gf_mul (L1, L2, L0 ); | |||||
gf_sqrn (L0, L1, 37 ); | |||||
gf_mul (L1, L2, L0 ); | |||||
gf_sqrn (L0, L1, 111 ); | |||||
gf_mul (L2, L1, L0 ); | |||||
gf_sqr (L0, L2 ); | |||||
gf_mul (L1, x, L0 ); | |||||
gf_sqrn (L0, L1, 223 ); | |||||
gf_mul ( a, L2, L0 ); | |||||
} | } |
@@ -10,8 +10,6 @@ | |||||
#include "field.h" | #include "field.h" | ||||
const gf ZERO = {{{0}}}, ONE = {{{ [LIMBPERM(0)] = 1 }}}; | |||||
/** Serialize to wire format. */ | /** Serialize to wire format. */ | ||||
void gf_serialize (uint8_t serial[SER_BYTES], const gf x) { | void gf_serialize (uint8_t serial[SER_BYTES], const gf x) { | ||||
gf red; | gf red; | ||||