Conflicts: src/include/ec_point.h src/p448/magic.c src/p480/magic.c src/p521/magic.c test/bench.cmaster
@@ -13,78 +13,75 @@ | |||||
mask_t | mask_t | ||||
field_eq ( | field_eq ( | ||||
const struct field_t *a, | |||||
const struct field_t *b | |||||
const field_a_t a, | |||||
const field_a_t b | |||||
) { | ) { | ||||
struct field_t ra, rb; | |||||
field_copy(&ra, a); | |||||
field_copy(&rb, b); | |||||
field_weak_reduce(&ra); | |||||
field_weak_reduce(&rb); | |||||
field_sub_RAW(&ra, &ra, &rb); | |||||
field_bias(&ra, 2); | |||||
return field_is_zero(&ra); | |||||
field_a_t ra, rb; | |||||
field_copy(ra, a); | |||||
field_copy(rb, b); | |||||
field_weak_reduce(ra); | |||||
field_weak_reduce(rb); | |||||
field_sub_RAW(ra, ra, rb); | |||||
field_bias(ra, 2); | |||||
return field_is_zero(ra); | |||||
} | } | ||||
void | void | ||||
field_inverse ( | field_inverse ( | ||||
struct field_t* a, | |||||
const struct field_t* x | |||||
field_a_t a, | |||||
const field_a_t x | |||||
) { | ) { | ||||
struct field_t L0, L1; | |||||
field_isr ( &L0, x ); | |||||
field_sqr ( &L1, &L0 ); | |||||
field_sqr ( &L0, &L1 ); | |||||
field_mul ( a, x, &L0 ); | |||||
field_a_t L0, L1; | |||||
field_isr ( L0, x ); | |||||
field_sqr ( L1, L0 ); | |||||
field_sqr ( L0, L1 ); | |||||
field_mul ( a, x, L0 ); | |||||
} | } | ||||
mask_t | mask_t | ||||
field_is_square ( | field_is_square ( | ||||
const struct field_t* x | |||||
const field_a_t x | |||||
) { | ) { | ||||
mask_t L2, L3; | |||||
struct field_t L0, L1; | |||||
field_isr ( &L0, x ); | |||||
field_sqr ( &L1, &L0 ); | |||||
field_mul ( &L0, x, &L1 ); | |||||
field_subw( &L0, 1 ); | |||||
L3 = field_is_zero( &L0 ); | |||||
L2 = field_is_zero( x ); | |||||
return L3 | L2; | |||||
field_a_t L0, L1; | |||||
field_isr ( L0, x ); | |||||
field_sqr ( L1, L0 ); | |||||
field_mul ( L0, x, L1 ); | |||||
field_subw( L0, 1 ); | |||||
return field_is_zero( L0 ) | field_is_zero( x ); | |||||
} | } | ||||
void | void | ||||
field_simultaneous_invert ( | field_simultaneous_invert ( | ||||
struct field_t *__restrict__ out, | |||||
const struct field_t *in, | |||||
field_a_t *__restrict__ out, | |||||
const field_a_t *in, | |||||
unsigned int n | unsigned int n | ||||
) { | ) { | ||||
if (n==0) { | if (n==0) { | ||||
return; | return; | ||||
} else if (n==1) { | } else if (n==1) { | ||||
field_inverse(out,in); | |||||
field_inverse(out[0],in[0]); | |||||
return; | return; | ||||
} | } | ||||
field_copy(&out[1], &in[0]); | |||||
field_copy(out[1], in[0]); | |||||
int i; | int i; | ||||
for (i=1; i<(int) (n-1); i++) { | for (i=1; i<(int) (n-1); i++) { | ||||
field_mul(&out[i+1], &out[i], &in[i]); | |||||
field_mul(out[i+1], out[i], in[i]); | |||||
} | } | ||||
field_mul(&out[0], &out[n-1], &in[n-1]); | |||||
field_mul(out[0], out[n-1], in[n-1]); | |||||
struct field_t tmp; | |||||
field_inverse(&tmp, &out[0]); | |||||
field_copy(&out[0], &tmp); | |||||
field_a_t tmp; | |||||
field_inverse(tmp, out[0]); | |||||
field_copy(out[0], tmp); | |||||
/* at this point, out[0] = product(in[i]) ^ -1 | /* at this point, out[0] = product(in[i]) ^ -1 | ||||
* out[i] = product(in[0]..in[i-1]) if i != 0 | * out[i] = product(in[0]..in[i-1]) if i != 0 | ||||
*/ | */ | ||||
for (i=n-1; i>0; i--) { | for (i=n-1; i>0; i--) { | ||||
field_mul(&tmp, &out[i], &out[0]); | |||||
field_copy(&out[i], &tmp); | |||||
field_mul(tmp, out[i], out[0]); | |||||
field_copy(out[i], tmp); | |||||
field_mul(&tmp, &out[0], &in[i]); | |||||
field_copy(&out[0], &tmp); | |||||
field_mul(tmp, out[0], in[i]); | |||||
field_copy(out[0], tmp); | |||||
} | } | ||||
} | } |
@@ -162,7 +162,7 @@ goldilocks_derive_private_key ( | |||||
struct sha512_ctx_t ctx; | struct sha512_ctx_t ctx; | ||||
struct tw_extensible_t exta; | struct tw_extensible_t exta; | ||||
struct field_t pk; | |||||
field_a_t pk; | |||||
sha512_init(&ctx); | sha512_init(&ctx); | ||||
sha512_update(&ctx, (const unsigned char *)"derivepk", GOLDI_DIVERSIFY_BYTES); | sha512_update(&ctx, (const unsigned char *)"derivepk", GOLDI_DIVERSIFY_BYTES); | ||||
@@ -173,9 +173,9 @@ goldilocks_derive_private_key ( | |||||
barrett_serialize(privkey->opaque, sk, GOLDI_FIELD_BYTES); | barrett_serialize(privkey->opaque, sk, GOLDI_FIELD_BYTES); | ||||
scalarmul_fixed_base(&exta, sk, GOLDI_SCALAR_BITS, &goldilocks_global.fixed_base); | scalarmul_fixed_base(&exta, sk, GOLDI_SCALAR_BITS, &goldilocks_global.fixed_base); | ||||
untwist_and_double_and_serialize(&pk, &exta); | |||||
untwist_and_double_and_serialize(pk, &exta); | |||||
field_serialize(&privkey->opaque[GOLDI_FIELD_BYTES], &pk); | |||||
field_serialize(&privkey->opaque[GOLDI_FIELD_BYTES], pk); | |||||
return GOLDI_EOK; | return GOLDI_EOK; | ||||
} | } | ||||
@@ -225,11 +225,11 @@ goldilocks_private_to_public ( | |||||
struct goldilocks_public_key_t *pubkey, | struct goldilocks_public_key_t *pubkey, | ||||
const struct goldilocks_private_key_t *privkey | const struct goldilocks_private_key_t *privkey | ||||
) { | ) { | ||||
struct field_t pk; | |||||
mask_t msucc = field_deserialize(&pk,&privkey->opaque[GOLDI_FIELD_BYTES]); | |||||
field_a_t pk; | |||||
mask_t msucc = field_deserialize(pk,&privkey->opaque[GOLDI_FIELD_BYTES]); | |||||
if (msucc) { | if (msucc) { | ||||
field_serialize(pubkey->opaque, &pk); | |||||
field_serialize(pubkey->opaque, pk); | |||||
return GOLDI_EOK; | return GOLDI_EOK; | ||||
} else { | } else { | ||||
return GOLDI_ECORRUPT; | return GOLDI_ECORRUPT; | ||||
@@ -252,15 +252,15 @@ goldilocks_shared_secret_core ( | |||||
assert(GOLDI_SHARED_SECRET_BYTES == SHA512_OUTPUT_BYTES); | assert(GOLDI_SHARED_SECRET_BYTES == SHA512_OUTPUT_BYTES); | ||||
word_t sk[GOLDI_FIELD_WORDS]; | word_t sk[GOLDI_FIELD_WORDS]; | ||||
struct field_t pk; | |||||
field_a_t pk; | |||||
mask_t succ = field_deserialize(&pk,your_pubkey->opaque), msucc = -1; | |||||
mask_t succ = field_deserialize(pk,your_pubkey->opaque), msucc = -1; | |||||
#ifdef EXPERIMENT_ECDH_STIR_IN_PUBKEYS | #ifdef EXPERIMENT_ECDH_STIR_IN_PUBKEYS | ||||
struct field_t sum, prod; | |||||
msucc &= field_deserialize(&sum,&my_privkey->opaque[GOLDI_FIELD_BYTES]); | |||||
field_mul(&prod,&pk,&sum); | |||||
field_add(&sum,&pk,&sum); | |||||
field_a_t sum, prod; | |||||
msucc &= field_deserialize(sum,&my_privkey->opaque[GOLDI_FIELD_BYTES]); | |||||
field_mul(prod,pk,sum); | |||||
field_add(sum,pk,sum); | |||||
#endif | #endif | ||||
msucc &= barrett_deserialize(sk,my_privkey->opaque,&curve_prime_order); | msucc &= barrett_deserialize(sk,my_privkey->opaque,&curve_prime_order); | ||||
@@ -269,17 +269,17 @@ goldilocks_shared_secret_core ( | |||||
if (pre) { | if (pre) { | ||||
struct tw_extensible_t tw; | struct tw_extensible_t tw; | ||||
succ &= scalarmul_fixed_base(&tw, sk, GOLDI_SCALAR_BITS, &pre->table); | succ &= scalarmul_fixed_base(&tw, sk, GOLDI_SCALAR_BITS, &pre->table); | ||||
untwist_and_double_and_serialize(&pk, &tw); | |||||
untwist_and_double_and_serialize(pk, &tw); | |||||
} else { | } else { | ||||
succ &= montgomery_ladder(&pk,&pk,sk,GOLDI_SCALAR_BITS,1); | |||||
succ &= montgomery_ladder(pk,pk,sk,GOLDI_SCALAR_BITS,1); | |||||
} | } | ||||
#else | #else | ||||
(void)pre; | (void)pre; | ||||
succ &= montgomery_ladder(&pk,&pk,sk,GOLDI_SCALAR_BITS,1); | |||||
succ &= montgomery_ladder(pk,pk,sk,GOLDI_SCALAR_BITS,1); | |||||
#endif | #endif | ||||
field_serialize(gxy,&pk); | |||||
field_serialize(gxy,pk); | |||||
/* obliterate records of our failure by adjusting with obliteration key */ | /* obliterate records of our failure by adjusting with obliteration key */ | ||||
struct sha512_ctx_t ctx; | struct sha512_ctx_t ctx; | ||||
@@ -300,9 +300,9 @@ goldilocks_shared_secret_core ( | |||||
#ifdef EXPERIMENT_ECDH_STIR_IN_PUBKEYS | #ifdef EXPERIMENT_ECDH_STIR_IN_PUBKEYS | ||||
/* stir in the sum and product of the pubkeys. */ | /* stir in the sum and product of the pubkeys. */ | ||||
uint8_t a_pk[GOLDI_FIELD_BYTES]; | uint8_t a_pk[GOLDI_FIELD_BYTES]; | ||||
field_serialize(a_pk, &sum); | |||||
field_serialize(a_pk, sum); | |||||
sha512_update(&ctx, a_pk, GOLDI_FIELD_BYTES); | sha512_update(&ctx, a_pk, GOLDI_FIELD_BYTES); | ||||
field_serialize(a_pk, &prod); | |||||
field_serialize(a_pk, prod); | |||||
sha512_update(&ctx, a_pk, GOLDI_FIELD_BYTES); | sha512_update(&ctx, a_pk, GOLDI_FIELD_BYTES); | ||||
#endif | #endif | ||||
@@ -383,11 +383,11 @@ goldilocks_sign ( | |||||
/* 4[nonce]G */ | /* 4[nonce]G */ | ||||
uint8_t signature_tmp[GOLDI_FIELD_BYTES]; | uint8_t signature_tmp[GOLDI_FIELD_BYTES]; | ||||
struct tw_extensible_t exta; | struct tw_extensible_t exta; | ||||
struct field_t gsk; | |||||
field_a_t gsk; | |||||
scalarmul_fixed_base(&exta, tk, GOLDI_SCALAR_BITS, &goldilocks_global.fixed_base); | scalarmul_fixed_base(&exta, tk, GOLDI_SCALAR_BITS, &goldilocks_global.fixed_base); | ||||
double_tw_extensible(&exta); | double_tw_extensible(&exta); | ||||
untwist_and_double_and_serialize(&gsk, &exta); | |||||
field_serialize(signature_tmp, &gsk); | |||||
untwist_and_double_and_serialize(gsk, &exta); | |||||
field_serialize(signature_tmp, gsk); | |||||
word_t challenge[GOLDI_FIELD_WORDS]; | word_t challenge[GOLDI_FIELD_WORDS]; | ||||
goldilocks_derive_challenge ( | goldilocks_derive_challenge ( | ||||
@@ -437,10 +437,10 @@ goldilocks_verify ( | |||||
return GOLDI_EUNINIT; | return GOLDI_EUNINIT; | ||||
} | } | ||||
struct field_t pk; | |||||
field_a_t pk; | |||||
word_t s[GOLDI_FIELD_WORDS]; | word_t s[GOLDI_FIELD_WORDS]; | ||||
mask_t succ = field_deserialize(&pk,pubkey->opaque); | |||||
mask_t succ = field_deserialize(pk,pubkey->opaque); | |||||
if (!succ) return GOLDI_EINVAL; | if (!succ) return GOLDI_EINVAL; | ||||
succ = barrett_deserialize(s, &signature[GOLDI_FIELD_BYTES], &curve_prime_order); | succ = barrett_deserialize(s, &signature[GOLDI_FIELD_BYTES], &curve_prime_order); | ||||
@@ -449,14 +449,14 @@ goldilocks_verify ( | |||||
word_t challenge[GOLDI_FIELD_WORDS]; | word_t challenge[GOLDI_FIELD_WORDS]; | ||||
goldilocks_derive_challenge(challenge, pubkey->opaque, signature, message, message_len); | goldilocks_derive_challenge(challenge, pubkey->opaque, signature, message, message_len); | ||||
struct field_t eph; | |||||
field_a_t eph; | |||||
struct tw_extensible_t pk_text; | struct tw_extensible_t pk_text; | ||||
/* deserialize [nonce]G */ | /* deserialize [nonce]G */ | ||||
succ = field_deserialize(&eph, signature); | |||||
succ = field_deserialize(eph, signature); | |||||
if (!succ) return GOLDI_EINVAL; | if (!succ) return GOLDI_EINVAL; | ||||
succ = deserialize_and_twist_approx(&pk_text, &sqrt_d_minus_1, &pk); | |||||
succ = deserialize_and_twist_approx(&pk_text, pk); | |||||
if (!succ) return GOLDI_EINVAL; | if (!succ) return GOLDI_EINVAL; | ||||
linear_combo_var_fixed_vt( &pk_text, | linear_combo_var_fixed_vt( &pk_text, | ||||
@@ -464,9 +464,9 @@ goldilocks_verify ( | |||||
s, GOLDI_SCALAR_BITS, | s, GOLDI_SCALAR_BITS, | ||||
goldilocks_global.wnafs, WNAF_PRECMP_BITS ); | goldilocks_global.wnafs, WNAF_PRECMP_BITS ); | ||||
untwist_and_double_and_serialize( &pk, &pk_text ); | |||||
untwist_and_double_and_serialize( pk, &pk_text ); | |||||
succ = field_eq(&eph, &pk); | |||||
succ = field_eq(eph, pk); | |||||
return succ ? 0 : GOLDI_EINVAL; | return succ ? 0 : GOLDI_EINVAL; | ||||
} | } | ||||
#endif | #endif | ||||
@@ -485,14 +485,14 @@ goldilocks_precompute_public_key ( | |||||
struct tw_extensible_t pk_text; | struct tw_extensible_t pk_text; | ||||
struct field_t pk; | |||||
mask_t succ = field_deserialize(&pk, pub->opaque); | |||||
field_a_t pk; | |||||
mask_t succ = field_deserialize(pk, pub->opaque); | |||||
if (!succ) { | if (!succ) { | ||||
free(precom); | free(precom); | ||||
return NULL; | return NULL; | ||||
} | } | ||||
succ = deserialize_and_twist_approx(&pk_text, &sqrt_d_minus_1, &pk); | |||||
succ = deserialize_and_twist_approx(&pk_text, pk); | |||||
if (!succ) { | if (!succ) { | ||||
free(precom); | free(precom); | ||||
return NULL; | return NULL; | ||||
@@ -538,11 +538,11 @@ goldilocks_verify_precomputed ( | |||||
word_t challenge[GOLDI_FIELD_WORDS]; | word_t challenge[GOLDI_FIELD_WORDS]; | ||||
goldilocks_derive_challenge(challenge, pubkey->pub.opaque, signature, message, message_len); | goldilocks_derive_challenge(challenge, pubkey->pub.opaque, signature, message, message_len); | ||||
struct field_t eph, pk; | |||||
field_a_t eph, pk; | |||||
struct tw_extensible_t pk_text; | struct tw_extensible_t pk_text; | ||||
/* deserialize [nonce]G */ | /* deserialize [nonce]G */ | ||||
succ = field_deserialize(&eph, signature); | |||||
succ = field_deserialize(eph, signature); | |||||
if (!succ) return GOLDI_EINVAL; | if (!succ) return GOLDI_EINVAL; | ||||
succ = linear_combo_combs_vt ( | succ = linear_combo_combs_vt ( | ||||
@@ -552,9 +552,9 @@ goldilocks_verify_precomputed ( | |||||
); | ); | ||||
if (!succ) return GOLDI_EINVAL; | if (!succ) return GOLDI_EINVAL; | ||||
untwist_and_double_and_serialize( &pk, &pk_text ); | |||||
untwist_and_double_and_serialize( pk, &pk_text ); | |||||
succ = field_eq(&eph, &pk); | |||||
succ = field_eq(eph, pk); | |||||
return succ ? 0 : GOLDI_EINVAL; | return succ ? 0 : GOLDI_EINVAL; | ||||
} | } | ||||
@@ -21,28 +21,28 @@ extern "C" { | |||||
* Affine point on an Edwards curve. | * Affine point on an Edwards curve. | ||||
*/ | */ | ||||
struct affine_t { | struct affine_t { | ||||
struct field_t x, y; | |||||
field_a_t x, y; | |||||
}; | }; | ||||
/** | /** | ||||
* Affine point on a twisted Edwards curve. | * Affine point on a twisted Edwards curve. | ||||
*/ | */ | ||||
struct tw_affine_t { | struct tw_affine_t { | ||||
struct field_t x, y; | |||||
field_a_t x, y; | |||||
}; | }; | ||||
/** | /** | ||||
* Montgomery buffer. | * Montgomery buffer. | ||||
*/ | */ | ||||
struct montgomery_t { | struct montgomery_t { | ||||
struct field_t z0, xd, zd, xa, za; | |||||
field_a_t z0, xd, zd, xa, za; | |||||
}; | }; | ||||
/** | /** | ||||
* Montgomery buffer, augmented version. | * Montgomery buffer, augmented version. | ||||
*/ | */ | ||||
struct montgomery_aux_t { | struct montgomery_aux_t { | ||||
struct field_t s0, xd, zd, xa, za, xs, zs; | |||||
field_a_t s0, xd, zd, xa, za, xs, zs; | |||||
}; | }; | ||||
/** | /** | ||||
@@ -64,7 +64,7 @@ struct montgomery_aux_t { | |||||
* instead. | * instead. | ||||
*/ | */ | ||||
struct extensible_t { | struct extensible_t { | ||||
struct field_t x, y, z, t, u; | |||||
field_a_t x, y, z, t, u; | |||||
}; | }; | ||||
/** | /** | ||||
@@ -72,7 +72,7 @@ struct extensible_t { | |||||
* suitable for accumulators. | * suitable for accumulators. | ||||
*/ | */ | ||||
struct tw_extensible_t { | struct tw_extensible_t { | ||||
struct field_t x, y, z, t, u; | |||||
field_a_t x, y, z, t, u; | |||||
}; | }; | ||||
/** | /** | ||||
@@ -81,7 +81,7 @@ struct tw_extensible_t { | |||||
* Good for mixed readdition; suitable for fixed tables. | * Good for mixed readdition; suitable for fixed tables. | ||||
*/ | */ | ||||
struct tw_niels_t { | struct tw_niels_t { | ||||
struct field_t a, b, c; | |||||
field_a_t a, b, c; | |||||
}; | }; | ||||
/** | /** | ||||
@@ -91,7 +91,7 @@ struct tw_niels_t { | |||||
*/ | */ | ||||
struct tw_pniels_t { | struct tw_pniels_t { | ||||
struct tw_niels_t n; | struct tw_niels_t n; | ||||
struct field_t z; | |||||
field_a_t z; | |||||
}; | }; | ||||
@@ -285,20 +285,20 @@ montgomery_aux_step ( | |||||
void | void | ||||
deserialize_montgomery ( | deserialize_montgomery ( | ||||
struct montgomery_t* a, | struct montgomery_t* a, | ||||
const struct field_t* sbz | |||||
const field_a_t sbz | |||||
); | ); | ||||
mask_t | mask_t | ||||
serialize_montgomery ( | serialize_montgomery ( | ||||
struct field_t* b, | |||||
field_a_t b, | |||||
const struct montgomery_t* a, | const struct montgomery_t* a, | ||||
const struct field_t* sbz | |||||
const field_a_t sbz | |||||
); | ); | ||||
void | void | ||||
deserialize_montgomery_decaf ( | deserialize_montgomery_decaf ( | ||||
struct montgomery_aux_t* a, | struct montgomery_aux_t* a, | ||||
const struct field_t *s | |||||
const field_a_t s | |||||
); | ); | ||||
/** | /** | ||||
@@ -314,7 +314,7 @@ deserialize_montgomery_decaf ( | |||||
*/ | */ | ||||
void | void | ||||
serialize_extensible ( | serialize_extensible ( | ||||
struct field_t* b, | |||||
field_a_t b, | |||||
const struct extensible_t* a | const struct extensible_t* a | ||||
); | ); | ||||
@@ -323,7 +323,7 @@ serialize_extensible ( | |||||
*/ | */ | ||||
void | void | ||||
untwist_and_double_and_serialize ( | untwist_and_double_and_serialize ( | ||||
struct field_t* b, | |||||
field_a_t b, | |||||
const struct tw_extensible_t* a | const struct tw_extensible_t* a | ||||
); | ); | ||||
@@ -363,7 +363,7 @@ test_only_twist ( | |||||
mask_t | mask_t | ||||
field_is_square ( | field_is_square ( | ||||
const struct field_t* x | |||||
const field_a_t x | |||||
); | ); | ||||
mask_t | mask_t | ||||
@@ -382,7 +382,7 @@ is_even_tw ( | |||||
mask_t | mask_t | ||||
deserialize_affine ( | deserialize_affine ( | ||||
struct affine_t* a, | struct affine_t* a, | ||||
const struct field_t* sz | |||||
const field_a_t sz | |||||
); | ); | ||||
/** | /** | ||||
@@ -395,22 +395,21 @@ deserialize_affine ( | |||||
mask_t | mask_t | ||||
deserialize_and_twist_approx ( | deserialize_and_twist_approx ( | ||||
struct tw_extensible_t* a, | struct tw_extensible_t* a, | ||||
const struct field_t* sdm1, | |||||
const struct field_t* sz | |||||
const field_a_t sz | |||||
) | ) | ||||
__attribute__((warn_unused_result)); | __attribute__((warn_unused_result)); | ||||
mask_t | mask_t | ||||
decaf_deserialize_affine ( | decaf_deserialize_affine ( | ||||
struct affine_t *a, | |||||
const struct field_t *s, | |||||
struct affine_t *a, | |||||
const field_a_t s, | |||||
mask_t allow_identity | mask_t allow_identity | ||||
) | ) | ||||
__attribute__((warn_unused_result)); | __attribute__((warn_unused_result)); | ||||
void | void | ||||
decaf_serialize_extensible ( | decaf_serialize_extensible ( | ||||
struct field_t* b, | |||||
field_a_t b, | |||||
const struct extensible_t* a | const struct extensible_t* a | ||||
); | ); | ||||
@@ -418,14 +417,14 @@ decaf_serialize_extensible ( | |||||
mask_t | mask_t | ||||
decaf_deserialize_tw_affine ( | decaf_deserialize_tw_affine ( | ||||
struct tw_affine_t *a, | struct tw_affine_t *a, | ||||
const struct field_t *s, | |||||
const field_a_t s, | |||||
mask_t allow_identity | mask_t allow_identity | ||||
) | ) | ||||
__attribute__((warn_unused_result)); | __attribute__((warn_unused_result)); | ||||
void | void | ||||
decaf_serialize_tw_extensible ( | decaf_serialize_tw_extensible ( | ||||
struct field_t* b, | |||||
field_a_t b, | |||||
const struct tw_extensible_t* a | const struct tw_extensible_t* a | ||||
); | ); | ||||
@@ -465,7 +464,7 @@ eq_tw_extensible ( | |||||
void | void | ||||
elligator_2s_inject ( | elligator_2s_inject ( | ||||
struct affine_t* a, | struct affine_t* a, | ||||
const struct field_t* r | |||||
const field_a_t r | |||||
); | ); | ||||
mask_t | mask_t | ||||
@@ -516,8 +515,8 @@ cond_negate_tw_niels ( | |||||
struct tw_niels_t *n, | struct tw_niels_t *n, | ||||
mask_t doNegate | mask_t doNegate | ||||
) { | ) { | ||||
constant_time_cond_swap(&n->a, &n->b, sizeof(n->a), doNegate); | |||||
field_cond_neg(&n->c, doNegate); | |||||
constant_time_cond_swap(n->a, n->b, sizeof(n->a), doNegate); | |||||
field_cond_neg(n->c, doNegate); | |||||
} | } | ||||
/** | /** | ||||
@@ -537,8 +536,8 @@ copy_affine ( | |||||
struct affine_t* a, | struct affine_t* a, | ||||
const struct affine_t* ds | const struct affine_t* ds | ||||
) { | ) { | ||||
field_copy ( &a->x, &ds->x ); | |||||
field_copy ( &a->y, &ds->y ); | |||||
field_copy ( a->x, ds->x ); | |||||
field_copy ( a->y, ds->y ); | |||||
} | } | ||||
void | void | ||||
@@ -546,8 +545,8 @@ copy_tw_affine ( | |||||
struct tw_affine_t* a, | struct tw_affine_t* a, | ||||
const struct tw_affine_t* ds | const struct tw_affine_t* ds | ||||
) { | ) { | ||||
field_copy ( &a->x, &ds->x ); | |||||
field_copy ( &a->y, &ds->y ); | |||||
field_copy ( a->x, ds->x ); | |||||
field_copy ( a->y, ds->y ); | |||||
} | } | ||||
void | void | ||||
@@ -555,11 +554,11 @@ copy_montgomery ( | |||||
struct montgomery_t* a, | struct montgomery_t* a, | ||||
const struct montgomery_t* ds | const struct montgomery_t* ds | ||||
) { | ) { | ||||
field_copy ( &a->z0, &ds->z0 ); | |||||
field_copy ( &a->xd, &ds->xd ); | |||||
field_copy ( &a->zd, &ds->zd ); | |||||
field_copy ( &a->xa, &ds->xa ); | |||||
field_copy ( &a->za, &ds->za ); | |||||
field_copy ( a->z0, ds->z0 ); | |||||
field_copy ( a->xd, ds->xd ); | |||||
field_copy ( a->zd, ds->zd ); | |||||
field_copy ( a->xa, ds->xa ); | |||||
field_copy ( a->za, ds->za ); | |||||
} | } | ||||
void | void | ||||
@@ -567,11 +566,11 @@ copy_extensible ( | |||||
struct extensible_t* a, | struct extensible_t* a, | ||||
const struct extensible_t* ds | const struct extensible_t* ds | ||||
) { | ) { | ||||
field_copy ( &a->x, &ds->x ); | |||||
field_copy ( &a->y, &ds->y ); | |||||
field_copy ( &a->z, &ds->z ); | |||||
field_copy ( &a->t, &ds->t ); | |||||
field_copy ( &a->u, &ds->u ); | |||||
field_copy ( a->x, ds->x ); | |||||
field_copy ( a->y, ds->y ); | |||||
field_copy ( a->z, ds->z ); | |||||
field_copy ( a->t, ds->t ); | |||||
field_copy ( a->u, ds->u ); | |||||
} | } | ||||
void | void | ||||
@@ -579,11 +578,11 @@ copy_tw_extensible ( | |||||
struct tw_extensible_t* a, | struct tw_extensible_t* a, | ||||
const struct tw_extensible_t* ds | const struct tw_extensible_t* ds | ||||
) { | ) { | ||||
field_copy ( &a->x, &ds->x ); | |||||
field_copy ( &a->y, &ds->y ); | |||||
field_copy ( &a->z, &ds->z ); | |||||
field_copy ( &a->t, &ds->t ); | |||||
field_copy ( &a->u, &ds->u ); | |||||
field_copy ( a->x, ds->x ); | |||||
field_copy ( a->y, ds->y ); | |||||
field_copy ( a->z, ds->z ); | |||||
field_copy ( a->t, ds->t ); | |||||
field_copy ( a->u, ds->u ); | |||||
} | } | ||||
void | void | ||||
@@ -591,9 +590,9 @@ copy_tw_niels ( | |||||
struct tw_niels_t* a, | struct tw_niels_t* a, | ||||
const struct tw_niels_t* ds | const struct tw_niels_t* ds | ||||
) { | ) { | ||||
field_copy ( &a->a, &ds->a ); | |||||
field_copy ( &a->b, &ds->b ); | |||||
field_copy ( &a->c, &ds->c ); | |||||
field_copy ( a->a, ds->a ); | |||||
field_copy ( a->b, ds->b ); | |||||
field_copy ( a->c, ds->c ); | |||||
} | } | ||||
void | void | ||||
@@ -602,7 +601,7 @@ copy_tw_pniels ( | |||||
const struct tw_pniels_t* ds | const struct tw_pniels_t* ds | ||||
) { | ) { | ||||
copy_tw_niels( &a->n, &ds->n ); | copy_tw_niels( &a->n, &ds->n ); | ||||
field_copy ( &a->z, &ds->z ); | |||||
field_copy ( a->z, ds->z ); | |||||
} | } | ||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
@@ -14,6 +14,9 @@ | |||||
#include "f_field.h" | #include "f_field.h" | ||||
#include <string.h> | #include <string.h> | ||||
typedef struct field_t field_a_t[1]; | |||||
#define field_a_restrict_t struct field_t *__restrict__ | |||||
#define is32 (GOLDI_BITS == 32 || FIELD_BITS != 448) | #define is32 (GOLDI_BITS == 32 || FIELD_BITS != 448) | ||||
#if (is32) | #if (is32) | ||||
#define IF32(s) (s) | #define IF32(s) (s) | ||||
@@ -54,8 +57,8 @@ extern const uint8_t FIELD_MODULUS[FIELD_BYTES]; | |||||
static inline void | static inline void | ||||
__attribute__((unused,always_inline)) | __attribute__((unused,always_inline)) | ||||
field_copy ( | field_copy ( | ||||
struct field_t *__restrict__ a, | |||||
const struct field_t *__restrict__ b | |||||
field_a_restrict_t a, | |||||
const field_a_restrict_t b | |||||
) { | ) { | ||||
memcpy(a,b,sizeof(*a)); | memcpy(a,b,sizeof(*a)); | ||||
} | } | ||||
@@ -70,8 +73,8 @@ field_copy ( | |||||
*/ | */ | ||||
void | void | ||||
field_isr ( | field_isr ( | ||||
struct field_t* a, | |||||
const struct field_t* x | |||||
field_a_t a, | |||||
const field_a_t x | |||||
); | ); | ||||
/** | /** | ||||
@@ -81,8 +84,8 @@ field_isr ( | |||||
*/ | */ | ||||
void | void | ||||
field_simultaneous_invert ( | field_simultaneous_invert ( | ||||
struct field_t *__restrict__ out, | |||||
const struct field_t *in, | |||||
field_a_t *__restrict__ out, | |||||
const field_a_t *in, | |||||
unsigned int n | unsigned int n | ||||
); | ); | ||||
@@ -93,8 +96,8 @@ field_simultaneous_invert ( | |||||
*/ | */ | ||||
void | void | ||||
field_inverse ( | field_inverse ( | ||||
struct field_t* a, | |||||
const struct field_t* x | |||||
field_a_t a, | |||||
const field_a_t x | |||||
); | ); | ||||
/** | /** | ||||
@@ -102,8 +105,8 @@ field_inverse ( | |||||
*/ | */ | ||||
mask_t | mask_t | ||||
field_eq ( | field_eq ( | ||||
const struct field_t *a, | |||||
const struct field_t *b | |||||
const field_a_t a, | |||||
const field_a_t b | |||||
); | ); | ||||
/** | /** | ||||
@@ -112,23 +115,23 @@ field_eq ( | |||||
static __inline__ void | static __inline__ void | ||||
__attribute__((unused,always_inline)) | __attribute__((unused,always_inline)) | ||||
field_sqrn ( | field_sqrn ( | ||||
field_t *__restrict__ y, | |||||
const field_t *x, | |||||
field_a_restrict_t y, | |||||
const field_a_t x, | |||||
int n | int n | ||||
) { | ) { | ||||
field_t tmp; | |||||
field_a_t tmp; | |||||
assert(n>0); | assert(n>0); | ||||
if (n&1) { | if (n&1) { | ||||
field_sqr(y,x); | field_sqr(y,x); | ||||
n--; | n--; | ||||
} else { | } else { | ||||
field_sqr(&tmp,x); | |||||
field_sqr(y,&tmp); | |||||
field_sqr(tmp,x); | |||||
field_sqr(y,tmp); | |||||
n-=2; | n-=2; | ||||
} | } | ||||
for (; n; n-=2) { | for (; n; n-=2) { | ||||
field_sqr(&tmp,y); | |||||
field_sqr(y,&tmp); | |||||
field_sqr(tmp,y); | |||||
field_sqr(y,tmp); | |||||
} | } | ||||
} | } | ||||
@@ -152,8 +155,8 @@ field_make_nonzero (struct field_t *f) { | |||||
/* Multiply by signed curve constant */ | /* Multiply by signed curve constant */ | ||||
static __inline__ void | static __inline__ void | ||||
field_mulw_scc ( | field_mulw_scc ( | ||||
struct field_t* __restrict__ out, | |||||
const struct field_t *a, | |||||
field_a_restrict_t out, | |||||
const field_a_t a, | |||||
int64_t scc | int64_t scc | ||||
) { | ) { | ||||
if (scc >= 0) { | if (scc >= 0) { | ||||
@@ -168,8 +171,8 @@ field_mulw_scc ( | |||||
/* Multiply by signed curve constant and weak reduce if biased */ | /* Multiply by signed curve constant and weak reduce if biased */ | ||||
static __inline__ void | static __inline__ void | ||||
field_mulw_scc_wr ( | field_mulw_scc_wr ( | ||||
struct field_t* __restrict__ out, | |||||
const struct field_t *a, | |||||
field_a_restrict_t out, | |||||
const field_a_t a, | |||||
int64_t scc | int64_t scc | ||||
) { | ) { | ||||
field_mulw_scc(out, a, scc); | field_mulw_scc(out, a, scc); | ||||
@@ -179,9 +182,9 @@ field_mulw_scc_wr ( | |||||
static __inline__ void | static __inline__ void | ||||
field_subx_RAW ( | field_subx_RAW ( | ||||
struct field_t *d, | |||||
const struct field_t *a, | |||||
const struct field_t *b | |||||
field_a_t d, | |||||
const field_a_t a, | |||||
const field_a_t b | |||||
) { | ) { | ||||
field_sub_RAW ( d, a, b ); | field_sub_RAW ( d, a, b ); | ||||
field_bias( d, 2 ); | field_bias( d, 2 ); | ||||
@@ -190,9 +193,9 @@ field_subx_RAW ( | |||||
static __inline__ void | static __inline__ void | ||||
field_sub ( | field_sub ( | ||||
struct field_t *d, | |||||
const struct field_t *a, | |||||
const struct field_t *b | |||||
field_a_t d, | |||||
const field_a_t a, | |||||
const field_a_t b | |||||
) { | ) { | ||||
field_sub_RAW ( d, a, b ); | field_sub_RAW ( d, a, b ); | ||||
field_bias( d, 2 ); | field_bias( d, 2 ); | ||||
@@ -201,9 +204,9 @@ field_sub ( | |||||
static __inline__ void | static __inline__ void | ||||
field_add ( | field_add ( | ||||
struct field_t *d, | |||||
const struct field_t *a, | |||||
const struct field_t *b | |||||
field_a_t d, | |||||
const field_a_t a, | |||||
const field_a_t b | |||||
) { | ) { | ||||
field_add_RAW ( d, a, b ); | field_add_RAW ( d, a, b ); | ||||
field_weak_reduce ( d ); | field_weak_reduce ( d ); | ||||
@@ -211,7 +214,7 @@ field_add ( | |||||
static __inline__ void | static __inline__ void | ||||
field_subw ( | field_subw ( | ||||
struct field_t *d, | |||||
field_a_t d, | |||||
word_t c | word_t c | ||||
) { | ) { | ||||
field_subw_RAW ( d, c ); | field_subw_RAW ( d, c ); | ||||
@@ -220,9 +223,9 @@ field_subw ( | |||||
} | } | ||||
static __inline__ void | static __inline__ void | ||||
field_negx ( | |||||
struct field_t *d, | |||||
const struct field_t *a | |||||
field_neg ( | |||||
field_a_t d, | |||||
const field_a_t a | |||||
) { | ) { | ||||
field_neg_RAW ( d, a ); | field_neg_RAW ( d, a ); | ||||
field_bias( d, 2 ); | field_bias( d, 2 ); | ||||
@@ -235,12 +238,12 @@ field_negx ( | |||||
static inline void | static inline void | ||||
__attribute__((unused,always_inline)) | __attribute__((unused,always_inline)) | ||||
field_cond_neg ( | field_cond_neg ( | ||||
field_t *a, | |||||
field_a_t a, | |||||
mask_t doNegate | mask_t doNegate | ||||
) { | ) { | ||||
struct field_t negated; | |||||
field_negx(&negated, a); | |||||
constant_time_select(a, &negated, a, sizeof(negated), doNegate); | |||||
field_a_t negated; | |||||
field_neg(negated, a); | |||||
constant_time_select(a, negated, a, sizeof(negated), doNegate); | |||||
} | } | ||||
/** Require the warning annotation on raw routines */ | /** Require the warning annotation on raw routines */ | ||||
@@ -45,12 +45,12 @@ | |||||
/** | /** | ||||
* @brief sqrt(d-1), used for point formats and twisting. | * @brief sqrt(d-1), used for point formats and twisting. | ||||
*/ | */ | ||||
extern const struct field_t sqrt_d_minus_1; | |||||
extern const field_a_t sqrt_d_minus_1; | |||||
/** | /** | ||||
* @brief sqrt(-d), used for point formats and twisting. | * @brief sqrt(-d), used for point formats and twisting. | ||||
*/ | */ | ||||
extern const struct field_t sqrt_minus_d; | |||||
extern const field_a_t sqrt_minus_d; | |||||
/** | /** | ||||
* @brief The base point for Goldilocks. | * @brief The base point for Goldilocks. | ||||
@@ -90,8 +90,8 @@ struct fixed_base_table_t { | |||||
*/ | */ | ||||
mask_t | mask_t | ||||
montgomery_ladder ( | montgomery_ladder ( | ||||
struct field_t *out, | |||||
const struct field_t *in, | |||||
field_a_t out, | |||||
const field_a_t in, | |||||
const word_t *scalar, | const word_t *scalar, | ||||
unsigned int nbits, | unsigned int nbits, | ||||
unsigned int n_extra_doubles | unsigned int n_extra_doubles | ||||
@@ -12,32 +12,32 @@ | |||||
void | void | ||||
field_isr ( | field_isr ( | ||||
struct field_t* a, | |||||
const struct field_t* x | |||||
field_a_t a, | |||||
const field_a_t x | |||||
) { | ) { | ||||
struct field_t L0, L1, L2; | |||||
field_sqr ( &L1, x ); | |||||
field_mul ( &L2, x, &L1 ); | |||||
field_sqr ( &L1, &L2 ); | |||||
field_mul ( &L2, x, &L1 ); | |||||
field_sqrn ( &L1, &L2, 3 ); | |||||
field_mul ( &L0, &L2, &L1 ); | |||||
field_sqrn ( &L1, &L0, 3 ); | |||||
field_mul ( &L0, &L2, &L1 ); | |||||
field_sqrn ( &L2, &L0, 9 ); | |||||
field_mul ( &L1, &L0, &L2 ); | |||||
field_sqr ( &L0, &L1 ); | |||||
field_mul ( &L2, x, &L0 ); | |||||
field_sqrn ( &L0, &L2, 18 ); | |||||
field_mul ( &L2, &L1, &L0 ); | |||||
field_sqrn ( &L0, &L2, 37 ); | |||||
field_mul ( &L1, &L2, &L0 ); | |||||
field_sqrn ( &L0, &L1, 37 ); | |||||
field_mul ( &L1, &L2, &L0 ); | |||||
field_sqrn ( &L0, &L1, 111 ); | |||||
field_mul ( &L2, &L1, &L0 ); | |||||
field_sqr ( &L0, &L2 ); | |||||
field_mul ( &L1, x, &L0 ); | |||||
field_sqrn ( &L0, &L1, 223 ); | |||||
field_mul ( a, &L2, &L0 ); | |||||
field_a_t L0, L1, L2; | |||||
field_sqr ( L1, x ); | |||||
field_mul ( L2, x, L1 ); | |||||
field_sqr ( L1, L2 ); | |||||
field_mul ( L2, x, L1 ); | |||||
field_sqrn ( L1, L2, 3 ); | |||||
field_mul ( L0, L2, L1 ); | |||||
field_sqrn ( L1, L0, 3 ); | |||||
field_mul ( L0, L2, L1 ); | |||||
field_sqrn ( L2, L0, 9 ); | |||||
field_mul ( L1, L0, L2 ); | |||||
field_sqr ( L0, L1 ); | |||||
field_mul ( L2, x, L0 ); | |||||
field_sqrn ( L0, L2, 18 ); | |||||
field_mul ( L2, L1, L0 ); | |||||
field_sqrn ( L0, L2, 37 ); | |||||
field_mul ( L1, L2, L0 ); | |||||
field_sqrn ( L0, L1, 37 ); | |||||
field_mul ( L1, L2, L0 ); | |||||
field_sqrn ( L0, L1, 111 ); | |||||
field_mul ( L2, L1, L0 ); | |||||
field_sqr ( L0, L2 ); | |||||
field_mul ( L1, x, L0 ); | |||||
field_sqrn ( L0, L1, 223 ); | |||||
field_mul ( a, L2, L0 ); | |||||
} | } |
@@ -35,17 +35,17 @@ const word_t SCALARMUL_FIXED_WINDOW_ADJUSTMENT[2*SCALAR_WORDS] = { | |||||
const struct affine_t goldilocks_base_point = { | const struct affine_t goldilocks_base_point = { | ||||
#ifdef USE_NEON_PERM | #ifdef USE_NEON_PERM | ||||
{{ 0xaed939f,0xc59d070,0xf0de840,0x5f065c3, 0xf4ba0c7,0xdf73324,0xc170033,0x3a6a26a, | |||||
{{{ 0xaed939f,0xc59d070,0xf0de840,0x5f065c3, 0xf4ba0c7,0xdf73324,0xc170033,0x3a6a26a, | |||||
0x4c63d96,0x4609845,0xf3932d9,0x1b4faff, 0x6147eaa,0xa2692ff,0x9cecfa9,0x297ea0e | 0x4c63d96,0x4609845,0xf3932d9,0x1b4faff, 0x6147eaa,0xa2692ff,0x9cecfa9,0x297ea0e | ||||
}}, | |||||
}}}, | |||||
#else | #else | ||||
{{ U56LE(0xf0de840aed939f), U56LE(0xc170033f4ba0c7), | |||||
{{{ U56LE(0xf0de840aed939f), U56LE(0xc170033f4ba0c7), | |||||
U56LE(0xf3932d94c63d96), U56LE(0x9cecfa96147eaa), | U56LE(0xf3932d94c63d96), U56LE(0x9cecfa96147eaa), | ||||
U56LE(0x5f065c3c59d070), U56LE(0x3a6a26adf73324), | U56LE(0x5f065c3c59d070), U56LE(0x3a6a26adf73324), | ||||
U56LE(0x1b4faff4609845), U56LE(0x297ea0ea2692ff) | U56LE(0x1b4faff4609845), U56LE(0x297ea0ea2692ff) | ||||
}}, | |||||
}}}, | |||||
#endif | #endif | ||||
{{ 19 }} | |||||
{{{ 19 }}} | |||||
}; | }; | ||||
static const word_t curve_prime_order_lo[(224+WORD_BITS-1)/WORD_BITS] = { | static const word_t curve_prime_order_lo[(224+WORD_BITS-1)/WORD_BITS] = { | ||||
@@ -61,8 +61,8 @@ const struct barrett_prime_t curve_prime_order = { | |||||
curve_prime_order_lo | curve_prime_order_lo | ||||
}; | }; | ||||
const struct field_t | |||||
sqrt_d_minus_1 = {{ | |||||
const field_a_t | |||||
sqrt_d_minus_1 = {{{ | |||||
#ifdef USE_NEON_PERM | #ifdef USE_NEON_PERM | ||||
0x6749f46,0x24d9770,0xd2e2183,0xa49f7b4, | 0x6749f46,0x24d9770,0xd2e2183,0xa49f7b4, | ||||
0xb4f0179,0x8c5f656,0x888db42,0xdcac462, | 0xb4f0179,0x8c5f656,0x888db42,0xdcac462, | ||||
@@ -78,10 +78,10 @@ sqrt_d_minus_1 = {{ | |||||
U56LE(0x49443b8748734a), | U56LE(0x49443b8748734a), | ||||
U56LE(0x12fec0c0b25b7a) | U56LE(0x12fec0c0b25b7a) | ||||
#endif | #endif | ||||
}}; | |||||
}}}; | |||||
const struct field_t | |||||
sqrt_minus_d = {{ | |||||
const field_a_t | |||||
sqrt_minus_d = {{{ | |||||
#ifdef USE_NEON_PERM | #ifdef USE_NEON_PERM | ||||
0x5572736,0x4a2d780,0x42ef0f4,0xb8d54b6, | 0x5572736,0x4a2d780,0x42ef0f4,0xb8d54b6, | ||||
0x0ce5296,0x1a7b8a5,0x7bf6aa2,0x6aa0a1f, | 0x0ce5296,0x1a7b8a5,0x7bf6aa2,0x6aa0a1f, | ||||
@@ -97,4 +97,4 @@ sqrt_minus_d = {{ | |||||
U56LE(0x683bf68d722fa2), | U56LE(0x683bf68d722fa2), | ||||
U56LE(0x22d962fbeb24f7) | U56LE(0x22d962fbeb24f7) | ||||
#endif | #endif | ||||
}}; | |||||
}}}; |
@@ -12,32 +12,32 @@ | |||||
void | void | ||||
field_isr ( | field_isr ( | ||||
struct field_t* a, | |||||
const struct field_t* x | |||||
field_a_t a, | |||||
const field_a_t x | |||||
) { | ) { | ||||
struct field_t L0, L1, L2, L3; | |||||
field_sqr ( &L2, x ); | |||||
field_mul ( &L1, x, &L2 ); | |||||
field_sqrn ( &L0, &L1, 2 ); | |||||
field_mul ( &L2, &L1, &L0 ); | |||||
field_sqrn ( &L0, &L2, 4 ); | |||||
field_mul ( &L1, &L2, &L0 ); | |||||
field_sqr ( &L0, &L1 ); | |||||
field_mul ( &L2, x, &L0 ); | |||||
field_sqrn ( &L0, &L2, 8 ); | |||||
field_mul ( &L2, &L1, &L0 ); | |||||
field_sqrn ( &L0, &L2, 17 ); | |||||
field_mul ( &L1, &L2, &L0 ); | |||||
field_sqrn ( &L0, &L1, 17 ); | |||||
field_mul ( &L1, &L2, &L0 ); | |||||
field_sqrn ( &L3, &L1, 17 ); | |||||
field_mul ( &L0, &L2, &L3 ); | |||||
field_sqrn ( &L2, &L0, 51 ); | |||||
field_mul ( &L0, &L1, &L2 ); | |||||
field_sqrn ( &L1, &L0, 119 ); | |||||
field_mul ( &L2, &L0, &L1 ); | |||||
field_sqr ( &L0, &L2 ); | |||||
field_mul ( &L1, x, &L0 ); | |||||
field_sqrn ( &L0, &L1, 239 ); | |||||
field_mul ( a, &L2, &L0 ); | |||||
field_a_t L0, L1, L2, L3; | |||||
field_sqr ( L2, x ); | |||||
field_mul ( L1, x, L2 ); | |||||
field_sqrn ( L0, L1, 2 ); | |||||
field_mul ( L2, L1, L0 ); | |||||
field_sqrn ( L0, L2, 4 ); | |||||
field_mul ( L1, L2, L0 ); | |||||
field_sqr ( L0, L1 ); | |||||
field_mul ( L2, x, L0 ); | |||||
field_sqrn ( L0, L2, 8 ); | |||||
field_mul ( L2, L1, L0 ); | |||||
field_sqrn ( L0, L2, 17 ); | |||||
field_mul ( L1, L2, L0 ); | |||||
field_sqrn ( L0, L1, 17 ); | |||||
field_mul ( L1, L2, L0 ); | |||||
field_sqrn ( L3, L1, 17 ); | |||||
field_mul ( L0, L2, L3 ); | |||||
field_sqrn ( L2, L0, 51 ); | |||||
field_mul ( L0, L1, L2 ); | |||||
field_sqrn ( L1, L0, 119 ); | |||||
field_mul ( L2, L0, L1 ); | |||||
field_sqr ( L0, L2 ); | |||||
field_mul ( L1, x, L0 ); | |||||
field_sqrn ( L0, L1, 239 ); | |||||
field_mul ( a, L2, L0 ); | |||||
} | } |
@@ -36,7 +36,7 @@ const word_t SCALARMUL_FIXED_WINDOW_ADJUSTMENT[2*SCALAR_WORDS] = { | |||||
}; | }; | ||||
const struct affine_t goldilocks_base_point = { | const struct affine_t goldilocks_base_point = { | ||||
{{ | |||||
{{{ | |||||
U60LE(0x849ff7f845c30d3), | U60LE(0x849ff7f845c30d3), | ||||
U60LE(0x7dda488553a4c5b), | U60LE(0x7dda488553a4c5b), | ||||
U60LE(0x1d3a2d9844831ea), | U60LE(0x1d3a2d9844831ea), | ||||
@@ -45,8 +45,8 @@ const struct affine_t goldilocks_base_point = { | |||||
U60LE(0xfc955e59aeefa65), | U60LE(0xfc955e59aeefa65), | ||||
U60LE(0x3ab247cd530013c), | U60LE(0x3ab247cd530013c), | ||||
U60LE(0x7ca42af3d564280) | U60LE(0x7ca42af3d564280) | ||||
}}, | |||||
{{ 5 }} | |||||
}}}, | |||||
{{{ 5 }}} | |||||
}; | }; | ||||
static const word_t curve_prime_order_lo[(240+WORD_BITS-1)/WORD_BITS] = { | static const word_t curve_prime_order_lo[(240+WORD_BITS-1)/WORD_BITS] = { | ||||
@@ -62,13 +62,13 @@ const struct barrett_prime_t curve_prime_order = { | |||||
curve_prime_order_lo | curve_prime_order_lo | ||||
}; | }; | ||||
const struct field_t | |||||
sqrt_d_minus_1 = {{ | |||||
const field_a_t | |||||
sqrt_d_minus_1 = {{{ | |||||
232 /* Whoa, it comes out even. */ | 232 /* Whoa, it comes out even. */ | ||||
}}; | |||||
}}}; | |||||
const struct field_t | |||||
sqrt_minus_d = {{ | |||||
const field_a_t | |||||
sqrt_minus_d = {{{ | |||||
U60LE(0xf098fba8d880ec0), | U60LE(0xf098fba8d880ec0), | ||||
U60LE(0x9d6ea1b2774d3e9), | U60LE(0x9d6ea1b2774d3e9), | ||||
U60LE(0x1a52c44c0154b38), | U60LE(0x1a52c44c0154b38), | ||||
@@ -77,4 +77,4 @@ sqrt_minus_d = {{ | |||||
U60LE(0xb9d4b5edcfee721), | U60LE(0xb9d4b5edcfee721), | ||||
U60LE(0x65275d687c7215d), | U60LE(0x65275d687c7215d), | ||||
U60LE(0x3458ffa5bbfdea5) | U60LE(0x3458ffa5bbfdea5) | ||||
}}; | |||||
}}}; |
@@ -12,32 +12,32 @@ | |||||
void | void | ||||
field_isr ( | field_isr ( | ||||
struct field_t* a, | |||||
const struct field_t* x | |||||
field_a_t a, | |||||
const field_a_t x | |||||
) { | ) { | ||||
struct field_t L0, L1, L2; | |||||
field_sqr ( &L1, x ); | |||||
field_mul ( &L0, x, &L1 ); | |||||
field_sqrn ( &L2, &L0, 2 ); | |||||
field_mul ( &L1, &L0, &L2 ); | |||||
field_sqrn ( &L2, &L1, 4 ); | |||||
field_mul ( &L0, &L1, &L2 ); | |||||
field_sqrn ( &L2, &L0, 8 ); | |||||
field_mul ( &L1, &L0, &L2 ); | |||||
field_sqrn ( &L2, &L1, 16 ); | |||||
field_mul ( &L0, &L1, &L2 ); | |||||
field_sqrn ( &L2, &L0, 32 ); | |||||
field_mul ( &L1, &L0, &L2 ); | |||||
field_sqr ( &L2, &L1 ); | |||||
field_mul ( &L0, x, &L2 ); | |||||
field_sqrn ( &L2, &L0, 64 ); | |||||
field_mul ( &L0, &L1, &L2 ); | |||||
field_sqrn ( &L2, &L0, 129 ); | |||||
field_mul ( &L1, &L0, &L2 ); | |||||
field_sqr ( &L2, &L1 ); | |||||
field_mul ( &L0, x, &L2 ); | |||||
field_sqrn ( &L2, &L0, 259 ); | |||||
field_mul ( &L1, &L0, &L2 ); | |||||
field_sqr ( &L0, &L1 ); | |||||
field_mul ( a, x, &L0 ); | |||||
field_a_t L0, L1, L2; | |||||
field_sqr ( L1, x ); | |||||
field_mul ( L0, x, L1 ); | |||||
field_sqrn ( L2, L0, 2 ); | |||||
field_mul ( L1, L0, L2 ); | |||||
field_sqrn ( L2, L1, 4 ); | |||||
field_mul ( L0, L1, L2 ); | |||||
field_sqrn ( L2, L0, 8 ); | |||||
field_mul ( L1, L0, L2 ); | |||||
field_sqrn ( L2, L1, 16 ); | |||||
field_mul ( L0, L1, L2 ); | |||||
field_sqrn ( L2, L0, 32 ); | |||||
field_mul ( L1, L0, L2 ); | |||||
field_sqr ( L2, L1 ); | |||||
field_mul ( L0, x, L2 ); | |||||
field_sqrn ( L2, L0, 64 ); | |||||
field_mul ( L0, L1, L2 ); | |||||
field_sqrn ( L2, L0, 129 ); | |||||
field_mul ( L1, L0, L2 ); | |||||
field_sqr ( L2, L1 ); | |||||
field_mul ( L0, x, L2 ); | |||||
field_sqrn ( L2, L0, 259 ); | |||||
field_mul ( L1, L0, L2 ); | |||||
field_sqr ( L0, L1 ); | |||||
field_mul ( a, x, L0 ); | |||||
} | } |
@@ -39,7 +39,7 @@ const word_t SCALARMUL_FIXED_WINDOW_ADJUSTMENT[2*SCALAR_WORDS] = { | |||||
}; | }; | ||||
const struct affine_t goldilocks_base_point = { | const struct affine_t goldilocks_base_point = { | ||||
{{ | |||||
{{{ | |||||
#ifdef USE_P521_3x3_TRANSPOSE | #ifdef USE_P521_3x3_TRANSPOSE | ||||
U58LE(0x02a940a2f19ba6c), | U58LE(0x02a940a2f19ba6c), | ||||
U58LE(0x3331c90d2c6ba52), | U58LE(0x3331c90d2c6ba52), | ||||
@@ -64,8 +64,8 @@ const struct affine_t goldilocks_base_point = { | |||||
U58LE(0x06277e432c8a5ac), | U58LE(0x06277e432c8a5ac), | ||||
U58LE(0x0752cb45c48648b) | U58LE(0x0752cb45c48648b) | ||||
#endif | #endif | ||||
}}, | |||||
{{ 12 }} | |||||
}}}, | |||||
{{{ 12 }}} | |||||
}; | }; | ||||
static const word_t curve_prime_order_lo[(261+WORD_BITS-1)/WORD_BITS] = { | static const word_t curve_prime_order_lo[(261+WORD_BITS-1)/WORD_BITS] = { | ||||
@@ -82,8 +82,8 @@ const struct barrett_prime_t curve_prime_order = { | |||||
curve_prime_order_lo | curve_prime_order_lo | ||||
}; | }; | ||||
const struct field_t | |||||
sqrt_d_minus_1 = {{ | |||||
const field_a_t | |||||
sqrt_d_minus_1 = {{{ | |||||
#ifdef USE_P521_3x3_TRANSPOSE | #ifdef USE_P521_3x3_TRANSPOSE | ||||
U58LE(0x1e2be72c1c81990), | U58LE(0x1e2be72c1c81990), | ||||
U58LE(0x207dfc238a33e46), | U58LE(0x207dfc238a33e46), | ||||
@@ -108,10 +108,10 @@ sqrt_d_minus_1 = {{ | |||||
U58LE(0x0524b9e715937f5), | U58LE(0x0524b9e715937f5), | ||||
U58LE(0x0a9ea3ac10d6aed) | U58LE(0x0a9ea3ac10d6aed) | ||||
#endif | #endif | ||||
}}; | |||||
}}}; | |||||
const struct field_t | |||||
sqrt_minus_d = {{ | |||||
const field_a_t | |||||
sqrt_minus_d = {{{ | |||||
#ifdef USE_P521_3x3_TRANSPOSE | #ifdef USE_P521_3x3_TRANSPOSE | ||||
U58LE(0x375d668ef98910e), | U58LE(0x375d668ef98910e), | ||||
U58LE(0x2e033a89e955dfc), | U58LE(0x2e033a89e955dfc), | ||||
@@ -136,4 +136,4 @@ sqrt_minus_d = {{ | |||||
U58LE(0x009993c0e8ee528), | U58LE(0x009993c0e8ee528), | ||||
U58LE(0x0d07656ee612ae6) | U58LE(0x0d07656ee612ae6) | ||||
#endif | #endif | ||||
}}; | |||||
}}}; |
@@ -15,8 +15,8 @@ | |||||
mask_t | mask_t | ||||
montgomery_ladder ( | montgomery_ladder ( | ||||
struct field_t *out, | |||||
const struct field_t *in, | |||||
field_a_t out, | |||||
const field_a_t in, | |||||
const word_t *scalar, | const word_t *scalar, | ||||
unsigned int nbits, | unsigned int nbits, | ||||
unsigned int n_extra_doubles | unsigned int n_extra_doubles | ||||
@@ -30,15 +30,15 @@ montgomery_ladder ( | |||||
word_t w = scalar[j]; | word_t w = scalar[j]; | ||||
for (i=n; i>=0; i--) { | for (i=n; i>=0; i--) { | ||||
mask_t flip = -((w>>i)&1); | mask_t flip = -((w>>i)&1); | ||||
constant_time_cond_swap(&mont.xa,&mont.xd,sizeof(mont.xd),flip^pflip); | |||||
constant_time_cond_swap(&mont.za,&mont.zd,sizeof(mont.xd),flip^pflip); | |||||
constant_time_cond_swap(mont.xa,mont.xd,sizeof(mont.xd),flip^pflip); | |||||
constant_time_cond_swap(mont.za,mont.zd,sizeof(mont.xd),flip^pflip); | |||||
montgomery_step(&mont); | montgomery_step(&mont); | ||||
pflip = flip; | pflip = flip; | ||||
} | } | ||||
n = WORD_BITS-1; | n = WORD_BITS-1; | ||||
} | } | ||||
constant_time_cond_swap(&mont.xa,&mont.xd,sizeof(mont.xd),pflip); | |||||
constant_time_cond_swap(&mont.za,&mont.zd,sizeof(mont.xd),pflip); | |||||
constant_time_cond_swap(mont.xa,mont.xd,sizeof(mont.xd),pflip); | |||||
constant_time_cond_swap(mont.za,mont.zd,sizeof(mont.xd),pflip); | |||||
assert(n_extra_doubles < INT_MAX); | assert(n_extra_doubles < INT_MAX); | ||||
for (j=0; j<(int)n_extra_doubles; j++) { | for (j=0; j<(int)n_extra_doubles; j++) { | ||||
@@ -475,8 +475,8 @@ precompute_fixed_base ( | |||||
struct tw_pniels_t pn_tmp; | struct tw_pniels_t pn_tmp; | ||||
struct tw_pniels_t *doubles = (struct tw_pniels_t *) malloc_vector(sizeof(*doubles) * (t-1)); | struct tw_pniels_t *doubles = (struct tw_pniels_t *) malloc_vector(sizeof(*doubles) * (t-1)); | ||||
struct field_t *zs = (struct field_t *) malloc_vector(sizeof(*zs) * (n<<(t-1))); | |||||
struct field_t *zis = (struct field_t *) malloc_vector(sizeof(*zis) * (n<<(t-1))); | |||||
field_a_t *zs = (field_a_t *) malloc_vector(sizeof(*zs) * (n<<(t-1))); | |||||
field_a_t *zis = (field_a_t *) malloc_vector(sizeof(*zis) * (n<<(t-1))); | |||||
struct tw_niels_t *table = prealloc; | struct tw_niels_t *table = prealloc; | ||||
if (prealloc) { | if (prealloc) { | ||||
@@ -562,7 +562,7 @@ precompute_fixed_base ( | |||||
convert_tw_extensible_to_tw_pniels(&pn_tmp, &start); | convert_tw_extensible_to_tw_pniels(&pn_tmp, &start); | ||||
copy_tw_niels(&table[idx], &pn_tmp.n); | copy_tw_niels(&table[idx], &pn_tmp.n); | ||||
field_copy(&zs[idx], &pn_tmp.z); | |||||
field_copy(zs[idx], pn_tmp.z); | |||||
if (j >= (1u<<(t-1)) - 1) break; | if (j >= (1u<<(t-1)) - 1) break; | ||||
int delta = (j+1) ^ ((j+1)>>1) ^ gray; | int delta = (j+1) ^ ((j+1)>>1) ^ gray; | ||||
@@ -584,22 +584,22 @@ precompute_fixed_base ( | |||||
field_simultaneous_invert(zis, zs, n<<(t-1)); | field_simultaneous_invert(zis, zs, n<<(t-1)); | ||||
field_t product; | |||||
field_a_t product; | |||||
for (i=0; i<n<<(t-1); i++) { | for (i=0; i<n<<(t-1); i++) { | ||||
field_mul(&product, &table[i].a, &zis[i]); | |||||
field_strong_reduce(&product); | |||||
field_copy(&table[i].a, &product); | |||||
field_mul(product, table[i].a, zis[i]); | |||||
field_strong_reduce(product); | |||||
field_copy(table[i].a, product); | |||||
field_mul(&product, &table[i].b, &zis[i]); | |||||
field_strong_reduce(&product); | |||||
field_copy(&table[i].b, &product); | |||||
field_mul(product, table[i].b, zis[i]); | |||||
field_strong_reduce(product); | |||||
field_copy(table[i].b, product); | |||||
field_mul(&product, &table[i].c, &zis[i]); | |||||
field_strong_reduce(&product); | |||||
field_copy(&table[i].c, &product); | |||||
field_mul(product, table[i].c, zis[i]); | |||||
field_strong_reduce(product); | |||||
field_copy(table[i].c, product); | |||||
} | } | ||||
mask_t ret = ~field_is_zero(&zis[0]); | |||||
mask_t ret = ~field_is_zero(zis[0]); | |||||
free(doubles); | free(doubles); | ||||
free(zs); | free(zs); | ||||
@@ -635,8 +635,8 @@ precompute_fixed_base_wnaf ( | |||||
unsigned int tbits | unsigned int tbits | ||||
) { | ) { | ||||
int i; | int i; | ||||
struct field_t *zs = (struct field_t *) malloc_vector(sizeof(*zs)<<tbits); | |||||
struct field_t *zis = (struct field_t *) malloc_vector(sizeof(*zis)<<tbits); | |||||
field_a_t *zs = (field_a_t *) malloc_vector(sizeof(*zs)<<tbits); | |||||
field_a_t *zis = (field_a_t *) malloc_vector(sizeof(*zis)<<tbits); | |||||
if (!zs || !zis) { | if (!zs || !zis) { | ||||
free(zs); | free(zs); | ||||
@@ -650,7 +650,7 @@ precompute_fixed_base_wnaf ( | |||||
struct tw_pniels_t twop, tmp; | struct tw_pniels_t twop, tmp; | ||||
convert_tw_extensible_to_tw_pniels(&tmp, &base); | convert_tw_extensible_to_tw_pniels(&tmp, &base); | ||||
field_copy(&zs[0], &tmp.z); | |||||
field_copy(zs[0], tmp.z); | |||||
copy_tw_niels(&out[0], &tmp.n); | copy_tw_niels(&out[0], &tmp.n); | ||||
if (tbits > 0) { | if (tbits > 0) { | ||||
@@ -659,32 +659,32 @@ precompute_fixed_base_wnaf ( | |||||
add_tw_pniels_to_tw_extensible(&base, &tmp); | add_tw_pniels_to_tw_extensible(&base, &tmp); | ||||
convert_tw_extensible_to_tw_pniels(&tmp, &base); | convert_tw_extensible_to_tw_pniels(&tmp, &base); | ||||
field_copy(&zs[1], &tmp.z); | |||||
field_copy(zs[1], tmp.z); | |||||
copy_tw_niels(&out[1], &tmp.n); | copy_tw_niels(&out[1], &tmp.n); | ||||
for (i=2; i < 1<<tbits; i++) { | for (i=2; i < 1<<tbits; i++) { | ||||
add_tw_pniels_to_tw_extensible(&base, &twop); | add_tw_pniels_to_tw_extensible(&base, &twop); | ||||
convert_tw_extensible_to_tw_pniels(&tmp, &base); | convert_tw_extensible_to_tw_pniels(&tmp, &base); | ||||
field_copy(&zs[i], &tmp.z); | |||||
field_copy(zs[i], tmp.z); | |||||
copy_tw_niels(&out[i], &tmp.n); | copy_tw_niels(&out[i], &tmp.n); | ||||
} | } | ||||
} | } | ||||
field_simultaneous_invert(zis, zs, 1<<tbits); | field_simultaneous_invert(zis, zs, 1<<tbits); | ||||
field_t product; | |||||
field_a_t product; | |||||
for (i=0; i<1<<tbits; i++) { | for (i=0; i<1<<tbits; i++) { | ||||
field_mul(&product, &out[i].a, &zis[i]); | |||||
field_strong_reduce(&product); | |||||
field_copy(&out[i].a, &product); | |||||
field_mul(product, out[i].a, zis[i]); | |||||
field_strong_reduce(product); | |||||
field_copy(out[i].a, product); | |||||
field_mul(&product, &out[i].b, &zis[i]); | |||||
field_strong_reduce(&product); | |||||
field_copy(&out[i].b, &product); | |||||
field_mul(product, out[i].b, zis[i]); | |||||
field_strong_reduce(product); | |||||
field_copy(out[i].b, product); | |||||
field_mul(&product, &out[i].c, &zis[i]); | |||||
field_strong_reduce(&product); | |||||
field_copy(&out[i].c, &product); | |||||
field_mul(product, out[i].c, zis[i]); | |||||
field_strong_reduce(product); | |||||
field_copy(out[i].c, product); | |||||
} | } | ||||
free(zs); | free(zs); | ||||
@@ -29,7 +29,7 @@ static double now(void) { | |||||
return tv.tv_sec + tv.tv_usec/1000000.0; | return tv.tv_sec + tv.tv_usec/1000000.0; | ||||
} | } | ||||
static void field_randomize( struct crandom_state_t *crand, struct field_t *a ) { | |||||
static void field_randomize( struct crandom_state_t *crand, field_a_t a ) { | |||||
crandom_generate(crand, (unsigned char *)a, sizeof(*a)); | crandom_generate(crand, (unsigned char *)a, sizeof(*a)); | ||||
field_strong_reduce(a); | field_strong_reduce(a); | ||||
} | } | ||||
@@ -38,7 +38,7 @@ static void q448_randomize( struct crandom_state_t *crand, word_t sk[SCALAR_WORD | |||||
crandom_generate(crand, (unsigned char *)sk, SCALAR_BYTES); | crandom_generate(crand, (unsigned char *)sk, SCALAR_BYTES); | ||||
} | } | ||||
static void field_print( const char *descr, const struct field_t *a ) { | |||||
static void field_print( const char *descr, const field_a_t a ) { | |||||
int j; | int j; | ||||
unsigned char ser[FIELD_BYTES]; | unsigned char ser[FIELD_BYTES]; | ||||
field_serialize(ser,a); | field_serialize(ser,a); | ||||
@@ -52,7 +52,7 @@ static void field_print( const char *descr, const struct field_t *a ) { | |||||
static void __attribute__((unused)) | static void __attribute__((unused)) | ||||
field_print_full ( | field_print_full ( | ||||
const char *descr, | const char *descr, | ||||
const struct field_t *a | |||||
const field_a_t a | |||||
) { | ) { | ||||
int j; | int j; | ||||
printf("%s = 0x", descr); | printf("%s = 0x", descr); | ||||
@@ -87,8 +87,7 @@ int main(int argc, char **argv) { | |||||
struct affine_t affine; | struct affine_t affine; | ||||
struct montgomery_t mb; | struct montgomery_t mb; | ||||
struct montgomery_aux_t mba; | struct montgomery_aux_t mba; | ||||
struct field_t a,b,c,d; | |||||
field_a_t a,b,c,d; | |||||
double when; | double when; | ||||
int i; | int i; | ||||
@@ -107,42 +106,42 @@ int main(int argc, char **argv) { | |||||
word_t sk[SCALAR_WORDS],tk[SCALAR_WORDS]; | word_t sk[SCALAR_WORDS],tk[SCALAR_WORDS]; | ||||
q448_randomize(&crand, sk); | q448_randomize(&crand, sk); | ||||
memset(&a,0,sizeof(a)); | |||||
memset(&b,0,sizeof(b)); | |||||
memset(&c,0,sizeof(c)); | |||||
memset(&d,0,sizeof(d)); | |||||
memset(a,0,sizeof(a)); | |||||
memset(b,0,sizeof(b)); | |||||
memset(c,0,sizeof(c)); | |||||
memset(d,0,sizeof(d)); | |||||
when = now(); | when = now(); | ||||
for (i=0; i<nbase*5000; i++) { | for (i=0; i<nbase*5000; i++) { | ||||
field_mul(&c, &b, &a); | |||||
field_mul(c, b, a); | |||||
} | } | ||||
when = now() - when; | when = now() - when; | ||||
printf("mul: %5.1fns\n", when * 1e9 / i); | printf("mul: %5.1fns\n", when * 1e9 / i); | ||||
when = now(); | when = now(); | ||||
for (i=0; i<nbase*5000; i++) { | for (i=0; i<nbase*5000; i++) { | ||||
field_sqr(&c, &a); | |||||
field_sqr(c, a); | |||||
} | } | ||||
when = now() - when; | when = now() - when; | ||||
printf("sqr: %5.1fns\n", when * 1e9 / i); | printf("sqr: %5.1fns\n", when * 1e9 / i); | ||||
when = now(); | when = now(); | ||||
for (i=0; i<nbase*5000; i++) { | for (i=0; i<nbase*5000; i++) { | ||||
field_mulw(&c, &b, 1234562); | |||||
field_mulw(c, b, 1234562); | |||||
} | } | ||||
when = now() - when; | when = now() - when; | ||||
printf("mulw: %5.1fns\n", when * 1e9 / i); | printf("mulw: %5.1fns\n", when * 1e9 / i); | ||||
when = now(); | when = now(); | ||||
for (i=0; i<nbase*500; i++) { | for (i=0; i<nbase*500; i++) { | ||||
field_mul(&c, &b, &a); | |||||
field_mul(&a, &b, &c); | |||||
field_mul(c, b, a); | |||||
field_mul(a, b, c); | |||||
} | } | ||||
when = now() - when; | when = now() - when; | ||||
printf("mul dep: %5.1fns\n", when * 1e9 / i / 2); | printf("mul dep: %5.1fns\n", when * 1e9 / i / 2); | ||||
when = now(); | when = now(); | ||||
for (i=0; i<nbase*10; i++) { | for (i=0; i<nbase*10; i++) { | ||||
field_randomize(&crand, &a); | |||||
field_randomize(&crand, a); | |||||
} | } | ||||
when = now() - when; | when = now() - when; | ||||
printf("rand448: %5.1fns\n", when * 1e9 / i); | printf("rand448: %5.1fns\n", when * 1e9 / i); | ||||
@@ -166,46 +165,46 @@ int main(int argc, char **argv) { | |||||
when = now(); | when = now(); | ||||
for (i=0; i<nbase; i++) { | for (i=0; i<nbase; i++) { | ||||
field_isr(&c, &a); | |||||
field_isr(c, a); | |||||
} | } | ||||
when = now() - when; | when = now() - when; | ||||
printf("isr auto: %5.1fµs\n", when * 1e6 / i); | printf("isr auto: %5.1fµs\n", when * 1e6 / i); | ||||
for (i=0; i<100; i++) { | for (i=0; i<100; i++) { | ||||
field_randomize(&crand, &a); | |||||
field_isr(&d,&a); | |||||
field_sqr(&b,&d); | |||||
field_mul(&c,&b,&a); | |||||
field_sqr(&b,&c); | |||||
field_subw(&b,1); | |||||
if (!field_is_zero(&b)) { | |||||
field_randomize(&crand, a); | |||||
field_isr(d,a); | |||||
field_sqr(b,d); | |||||
field_mul(c,b,a); | |||||
field_sqr(b,c); | |||||
field_subw(b,1); | |||||
if (!field_is_zero(b)) { | |||||
printf("ISR validation failure!\n"); | printf("ISR validation failure!\n"); | ||||
field_print("a", &a); | |||||
field_print("s", &d); | |||||
field_print("a", a); | |||||
field_print("s", d); | |||||
} | } | ||||
} | } | ||||
when = now(); | when = now(); | ||||
for (i=0; i<nbase; i++) { | for (i=0; i<nbase; i++) { | ||||
elligator_2s_inject(&affine, &a); | |||||
elligator_2s_inject(&affine, a); | |||||
} | } | ||||
when = now() - when; | when = now() - when; | ||||
printf("elligator: %5.1fµs\n", when * 1e6 / i); | printf("elligator: %5.1fµs\n", when * 1e6 / i); | ||||
for (i=0; i<100; i++) { | for (i=0; i<100; i++) { | ||||
field_randomize(&crand, &a); | |||||
elligator_2s_inject(&affine, &a); | |||||
field_randomize(&crand, a); | |||||
elligator_2s_inject(&affine, a); | |||||
if (!validate_affine(&affine)) { | if (!validate_affine(&affine)) { | ||||
printf("Elligator validation failure!\n"); | printf("Elligator validation failure!\n"); | ||||
field_print("a", &a); | |||||
field_print("x", &affine.x); | |||||
field_print("y", &affine.y); | |||||
field_print("a", a); | |||||
field_print("x", affine.x); | |||||
field_print("y", affine.y); | |||||
} | } | ||||
} | } | ||||
when = now(); | when = now(); | ||||
for (i=0; i<nbase; i++) { | for (i=0; i<nbase; i++) { | ||||
deserialize_affine(&affine, &a); | |||||
deserialize_affine(&affine, a); | |||||
} | } | ||||
when = now() - when; | when = now() - when; | ||||
printf("decompress: %5.1fµs\n", when * 1e6 / i); | printf("decompress: %5.1fµs\n", when * 1e6 / i); | ||||
@@ -213,34 +212,34 @@ int main(int argc, char **argv) { | |||||
convert_affine_to_extensible(&exta, &affine); | convert_affine_to_extensible(&exta, &affine); | ||||
when = now(); | when = now(); | ||||
for (i=0; i<nbase; i++) { | for (i=0; i<nbase; i++) { | ||||
serialize_extensible(&a, &exta); | |||||
serialize_extensible(a, &exta); | |||||
} | } | ||||
when = now() - when; | when = now() - when; | ||||
printf("compress: %5.1fµs\n", when * 1e6 / i); | printf("compress: %5.1fµs\n", when * 1e6 / i); | ||||
int goods = 0; | int goods = 0; | ||||
for (i=0; i<100; i++) { | for (i=0; i<100; i++) { | ||||
field_randomize(&crand, &a); | |||||
mask_t good = deserialize_affine(&affine, &a); | |||||
field_randomize(&crand, a); | |||||
mask_t good = deserialize_affine(&affine, a); | |||||
if (good & !validate_affine(&affine)) { | if (good & !validate_affine(&affine)) { | ||||
printf("Deserialize validation failure!\n"); | printf("Deserialize validation failure!\n"); | ||||
field_print("a", &a); | |||||
field_print("x", &affine.x); | |||||
field_print("y", &affine.y); | |||||
field_print("a", a); | |||||
field_print("x", affine.x); | |||||
field_print("y", affine.y); | |||||
} else if (good) { | } else if (good) { | ||||
goods++; | goods++; | ||||
convert_affine_to_extensible(&exta,&affine); | convert_affine_to_extensible(&exta,&affine); | ||||
serialize_extensible(&b, &exta); | |||||
field_sub(&c,&b,&a); | |||||
if (!field_is_zero(&c)) { | |||||
serialize_extensible(b, &exta); | |||||
field_sub(c,b,a); | |||||
if (!field_is_zero(c)) { | |||||
printf("Reserialize validation failure!\n"); | printf("Reserialize validation failure!\n"); | ||||
field_print("a", &a); | |||||
field_print("x", &affine.x); | |||||
field_print("y", &affine.y); | |||||
deserialize_affine(&affine, &b); | |||||
field_print("b", &b); | |||||
field_print("x", &affine.x); | |||||
field_print("y", &affine.y); | |||||
field_print("a", a); | |||||
field_print("x", affine.x); | |||||
field_print("y", affine.y); | |||||
deserialize_affine(&affine, b); | |||||
field_print("b", b); | |||||
field_print("x", affine.x); | |||||
field_print("y", affine.y); | |||||
printf("\n"); | printf("\n"); | ||||
} | } | ||||
} | } | ||||
@@ -322,7 +321,7 @@ int main(int argc, char **argv) { | |||||
when = now(); | when = now(); | ||||
for (i=0; i<nbase/10; i++) { | for (i=0; i<nbase/10; i++) { | ||||
ignore_result(montgomery_ladder(&a,&b,sk,FIELD_BITS,0)); | |||||
ignore_result(montgomery_ladder(a,b,sk,FIELD_BITS,0)); | |||||
} | } | ||||
when = now() - when; | when = now() - when; | ||||
printf("full ladder: %5.1fµs\n", when * 1e6 / i); | printf("full ladder: %5.1fµs\n", when * 1e6 / i); | ||||
@@ -344,7 +343,7 @@ int main(int argc, char **argv) { | |||||
when = now(); | when = now(); | ||||
for (i=0; i<nbase/10; i++) { | for (i=0; i<nbase/10; i++) { | ||||
scalarmul(&ext,sk); | scalarmul(&ext,sk); | ||||
untwist_and_double_and_serialize(&a,&ext); | |||||
untwist_and_double_and_serialize(a,&ext); | |||||
} | } | ||||
when = now() - when; | when = now() - when; | ||||
printf("edwards smc: %5.1fµs\n", when * 1e6 / i); | printf("edwards smc: %5.1fµs\n", when * 1e6 / i); | ||||
@@ -414,12 +413,12 @@ int main(int argc, char **argv) { | |||||
when = now(); | when = now(); | ||||
for (i=0; i<nbase/10; i++) { | for (i=0; i<nbase/10; i++) { | ||||
deserialize_affine(&affine, &a); | |||||
deserialize_affine(&affine, a); | |||||
convert_affine_to_extensible(&exta,&affine); | convert_affine_to_extensible(&exta,&affine); | ||||
twist_and_double(&ext,&exta); | twist_and_double(&ext,&exta); | ||||
scalarmul(&ext,sk); | scalarmul(&ext,sk); | ||||
untwist_and_double(&exta,&ext); | untwist_and_double(&exta,&ext); | ||||
serialize_extensible(&b, &exta); | |||||
serialize_extensible(b, &exta); | |||||
} | } | ||||
when = now() - when; | when = now() - when; | ||||
printf("edwards sm: %5.1fµs\n", when * 1e6 / i); | printf("edwards sm: %5.1fµs\n", when * 1e6 / i); | ||||
@@ -427,8 +426,8 @@ int main(int argc, char **argv) { | |||||
struct fixed_base_table_t t_5_5_18, t_3_5_30, t_8_4_14, t_5_3_30, t_15_3_10; | struct fixed_base_table_t t_5_5_18, t_3_5_30, t_8_4_14, t_5_3_30, t_15_3_10; | ||||
while (1) { | while (1) { | ||||
field_randomize(&crand, &a); | |||||
if (deserialize_affine(&affine, &a)) break; | |||||
field_randomize(&crand, a); | |||||
if (deserialize_affine(&affine, a)) break; | |||||
} | } | ||||
convert_affine_to_extensible(&exta,&affine); | convert_affine_to_extensible(&exta,&affine); | ||||
twist_and_double(&ext,&exta); | twist_and_double(&ext,&exta); | ||||
@@ -625,9 +624,9 @@ int main(int argc, char **argv) { | |||||
failures=0; successes = 0; | failures=0; successes = 0; | ||||
for (i=0; i<nbase/10; i++) { | for (i=0; i<nbase/10; i++) { | ||||
field_randomize(&crand, &a); | |||||
field_randomize(&crand, a); | |||||
word_t two = 2; | word_t two = 2; | ||||
mask_t good = montgomery_ladder(&b,&a,&two,2,0); | |||||
mask_t good = montgomery_ladder(b,a,&two,2,0); | |||||
if (!good) continue; | if (!good) continue; | ||||
word_t x,y; | word_t x,y; | ||||
@@ -637,17 +636,17 @@ int main(int argc, char **argv) { | |||||
y = (hword_t)y; | y = (hword_t)y; | ||||
word_t z=x*y; | word_t z=x*y; | ||||
ignore_result(montgomery_ladder(&b,&a,&x,WORD_BITS,0)); | |||||
ignore_result(montgomery_ladder(&c,&b,&y,WORD_BITS,0)); | |||||
ignore_result(montgomery_ladder(&b,&a,&z,WORD_BITS,0)); | |||||
ignore_result(montgomery_ladder(b,a,&x,WORD_BITS,0)); | |||||
ignore_result(montgomery_ladder(c,b,&y,WORD_BITS,0)); | |||||
ignore_result(montgomery_ladder(b,a,&z,WORD_BITS,0)); | |||||
field_sub(&d,&b,&c); | |||||
if (!field_is_zero(&d)) { | |||||
field_sub(d,b,c); | |||||
if (!field_is_zero(d)) { | |||||
printf("Odd ladder validation failure %d!\n", ++failures); | printf("Odd ladder validation failure %d!\n", ++failures); | ||||
field_print("a", &a); | |||||
field_print("a", a); | |||||
printf("x=%"PRIxWORD", y=%"PRIxWORD", z=%"PRIxWORD"\n", x,y,z); | printf("x=%"PRIxWORD", y=%"PRIxWORD", z=%"PRIxWORD"\n", x,y,z); | ||||
field_print("c", &c); | |||||
field_print("b", &b); | |||||
field_print("c", c); | |||||
field_print("b", b); | |||||
printf("\n"); | printf("\n"); | ||||
} | } | ||||
} | } | ||||
@@ -656,23 +655,23 @@ int main(int argc, char **argv) { | |||||
for (i=0; i<nbase/10; i++) { | for (i=0; i<nbase/10; i++) { | ||||
mask_t good; | mask_t good; | ||||
do { | do { | ||||
field_randomize(&crand, &a); | |||||
good = deserialize_affine(&affine, &a); | |||||
field_randomize(&crand, a); | |||||
good = deserialize_affine(&affine, a); | |||||
} while (!good); | } while (!good); | ||||
convert_affine_to_extensible(&exta,&affine); | convert_affine_to_extensible(&exta,&affine); | ||||
twist_and_double(&ext,&exta); | twist_and_double(&ext,&exta); | ||||
untwist_and_double(&exta,&ext); | untwist_and_double(&exta,&ext); | ||||
serialize_extensible(&b, &exta); | |||||
untwist_and_double_and_serialize(&c, &ext); | |||||
serialize_extensible(b, &exta); | |||||
untwist_and_double_and_serialize(c, &ext); | |||||
field_sub(&d,&b,&c); | |||||
field_sub(d,b,c); | |||||
if (good && !field_is_zero(&d)){ | |||||
if (good && !field_is_zero(d)){ | |||||
printf("Iso+serial validation failure %d!\n", ++failures); | printf("Iso+serial validation failure %d!\n", ++failures); | ||||
field_print("a", &a); | |||||
field_print("b", &b); | |||||
field_print("c", &c); | |||||
field_print("a", a); | |||||
field_print("b", b); | |||||
field_print("c", c); | |||||
printf("\n"); | printf("\n"); | ||||
} else if (good) { | } else if (good) { | ||||
successes ++; | successes ++; | ||||
@@ -684,23 +683,23 @@ int main(int argc, char **argv) { | |||||
successes = failures = 0; | successes = failures = 0; | ||||
for (i=0; i<nbase/10; i++) { | for (i=0; i<nbase/10; i++) { | ||||
struct field_t aa; | |||||
field_a_t aa; | |||||
struct tw_extensible_t exu,exv,exw; | struct tw_extensible_t exu,exv,exw; | ||||
mask_t good; | mask_t good; | ||||
do { | do { | ||||
field_randomize(&crand, &a); | |||||
good = deserialize_affine(&affine, &a); | |||||
field_randomize(&crand, a); | |||||
good = deserialize_affine(&affine, a); | |||||
convert_affine_to_extensible(&exta,&affine); | convert_affine_to_extensible(&exta,&affine); | ||||
twist_and_double(&ext,&exta); | twist_and_double(&ext,&exta); | ||||
} while (!good); | } while (!good); | ||||
do { | do { | ||||
field_randomize(&crand, &aa); | |||||
good = deserialize_affine(&affine, &aa); | |||||
field_randomize(&crand, aa); | |||||
good = deserialize_affine(&affine, aa); | |||||
convert_affine_to_extensible(&exta,&affine); | convert_affine_to_extensible(&exta,&affine); | ||||
twist_and_double(&exu,&exta); | twist_and_double(&exu,&exta); | ||||
} while (!good); | } while (!good); | ||||
field_randomize(&crand, &aa); | |||||
field_randomize(&crand, aa); | |||||
q448_randomize(&crand, sk); | q448_randomize(&crand, sk); | ||||
if (i==0 || i==2) memset(&sk, 0, sizeof(sk)); | if (i==0 || i==2) memset(&sk, 0, sizeof(sk)); | ||||
@@ -714,23 +713,23 @@ int main(int argc, char **argv) { | |||||
convert_tw_extensible_to_tw_pniels(&pniels, &exw); | convert_tw_extensible_to_tw_pniels(&pniels, &exw); | ||||
add_tw_pniels_to_tw_extensible(&exv,&pniels); | add_tw_pniels_to_tw_extensible(&exv,&pniels); | ||||
untwist_and_double(&exta,&exv); | untwist_and_double(&exta,&exv); | ||||
serialize_extensible(&b, &exta); | |||||
serialize_extensible(b, &exta); | |||||
ignore_result(precompute_fixed_base_wnaf(wnaft,&exu,5)); | ignore_result(precompute_fixed_base_wnaf(wnaft,&exu,5)); | ||||
linear_combo_var_fixed_vt(&ext,sk,FIELD_BITS,tk,FIELD_BITS,wnaft,5); | linear_combo_var_fixed_vt(&ext,sk,FIELD_BITS,tk,FIELD_BITS,wnaft,5); | ||||
untwist_and_double(&exta,&exv); | untwist_and_double(&exta,&exv); | ||||
serialize_extensible(&c, &exta); | |||||
serialize_extensible(c, &exta); | |||||
field_sub(&d,&b,&c); | |||||
field_sub(d,b,c); | |||||
if (!field_is_zero(&d)){ | |||||
if (!field_is_zero(d)){ | |||||
printf("PreWNAF combo validation failure %d!\n", ++failures); | printf("PreWNAF combo validation failure %d!\n", ++failures); | ||||
field_print("a", &a); | |||||
field_print("A", &aa); | |||||
field_print("a", a); | |||||
field_print("A", aa); | |||||
q448_print("s", sk); | q448_print("s", sk); | ||||
q448_print("t", tk); | q448_print("t", tk); | ||||
field_print("c", &c); | |||||
field_print("b", &b); | |||||
field_print("c", c); | |||||
field_print("b", b); | |||||
printf("\n\n"); | printf("\n\n"); | ||||
} else if (good) { | } else if (good) { | ||||
successes ++; | successes ++; | ||||
@@ -82,7 +82,7 @@ hexprint ( | |||||
void field_print ( | void field_print ( | ||||
const char *descr, | const char *descr, | ||||
const struct field_t *a | |||||
const field_a_t a | |||||
) { | ) { | ||||
int j; | int j; | ||||
unsigned char ser[FIELD_BYTES]; | unsigned char ser[FIELD_BYTES]; | ||||
@@ -20,7 +20,7 @@ hexprint ( | |||||
void field_print ( | void field_print ( | ||||
const char *descr, | const char *descr, | ||||
const struct field_t *a | |||||
const field_a_t a | |||||
); | ); | ||||
void scalar_print ( | void scalar_print ( | ||||
@@ -7,7 +7,7 @@ | |||||
mpz_t mp_field; | mpz_t mp_field; | ||||
static mask_t mpz_to_field ( | static mask_t mpz_to_field ( | ||||
struct field_t *out, | |||||
field_a_t out, | |||||
const mpz_t in | const mpz_t in | ||||
) { | ) { | ||||
uint8_t ser[FIELD_BYTES]; | uint8_t ser[FIELD_BYTES]; | ||||
@@ -27,9 +27,9 @@ static inline int BRANCH_ON_CONSTANT(int x) { | |||||
static mask_t field_assert_eq_gmp( | static mask_t field_assert_eq_gmp( | ||||
const char *descr, | const char *descr, | ||||
const struct field_t *a, | |||||
const struct field_t *b, | |||||
const struct field_t *x, | |||||
const field_a_t a, | |||||
const field_a_t b, | |||||
const field_a_t x, | |||||
const mpz_t y, | const mpz_t y, | ||||
float lowBound, | float lowBound, | ||||
float highBound | float highBound | ||||
@@ -88,32 +88,32 @@ static mask_t test_add_sub_RAW ( | |||||
const mpz_t y, | const mpz_t y, | ||||
word_t word | word_t word | ||||
) { | ) { | ||||
struct field_t xx,yy,tt; | |||||
field_a_t xx,yy,tt; | |||||
mpz_t t; | mpz_t t; | ||||
mask_t succ = MASK_SUCCESS; | mask_t succ = MASK_SUCCESS; | ||||
succ = mpz_to_field(&xx,x); | |||||
succ &= mpz_to_field(&yy,y); | |||||
succ = mpz_to_field(xx,x); | |||||
succ &= mpz_to_field(yy,y); | |||||
mpz_init(t); | mpz_init(t); | ||||
field_add_RAW(&tt,&xx,&yy); | |||||
field_add_RAW(tt,xx,yy); | |||||
mpz_add(t,x,y); | mpz_add(t,x,y); | ||||
succ &= field_assert_eq_gmp("add",&xx,&yy,&tt,t,0,2.1); | |||||
succ &= field_assert_eq_gmp("add",xx,yy,tt,t,0,2.1); | |||||
field_sub_RAW(&tt,&xx,&yy); | |||||
field_bias(&tt,2); | |||||
field_sub_RAW(tt,xx,yy); | |||||
field_bias(tt,2); | |||||
mpz_sub(t,x,y); | mpz_sub(t,x,y); | ||||
succ &= field_assert_eq_gmp("sub",&xx,&yy,&tt,t,0,3.1); | |||||
succ &= field_assert_eq_gmp("sub",xx,yy,tt,t,0,3.1); | |||||
field_copy(&tt,&xx); | |||||
field_addw(&tt,word); | |||||
field_copy(tt,xx); | |||||
field_addw(tt,word); | |||||
mpz_add_ui(t,x,word); | mpz_add_ui(t,x,word); | ||||
succ &= field_assert_eq_gmp("addw",&xx,&yy,&tt,t,0,2.1); | |||||
succ &= field_assert_eq_gmp("addw",xx,yy,tt,t,0,2.1); | |||||
field_copy(&tt,&xx); | |||||
field_subw(&tt,word); | |||||
field_bias(&tt,1); | |||||
field_copy(tt,xx); | |||||
field_subw(tt,word); | |||||
field_bias(tt,1); | |||||
mpz_sub_ui(t,x,word); | mpz_sub_ui(t,x,word); | ||||
succ &= field_assert_eq_gmp("subw",&xx,&yy,&tt,t,0,2.1); | |||||
succ &= field_assert_eq_gmp("subw",xx,yy,tt,t,0,2.1); | |||||
/* | /* | ||||
if (!succ) { | if (!succ) { | ||||
@@ -132,32 +132,32 @@ static mask_t test_mul_sqr ( | |||||
const mpz_t y, | const mpz_t y, | ||||
word_t word | word_t word | ||||
) { | ) { | ||||
struct field_t xx,yy,tt; | |||||
field_a_t xx,yy,tt; | |||||
mpz_t t; | mpz_t t; | ||||
mask_t succ = MASK_SUCCESS; | mask_t succ = MASK_SUCCESS; | ||||
succ = mpz_to_field(&xx,x); | |||||
succ &= mpz_to_field(&yy,y); | |||||
succ = mpz_to_field(xx,x); | |||||
succ &= mpz_to_field(yy,y); | |||||
mpz_init(t); | mpz_init(t); | ||||
field_mul(&tt,&xx,&yy); | |||||
field_mul(tt,xx,yy); | |||||
mpz_mul(t,x,y); | mpz_mul(t,x,y); | ||||
succ &= field_assert_eq_gmp("mul",&xx,&yy,&tt,t,0,1.1); | |||||
succ &= field_assert_eq_gmp("mul",xx,yy,tt,t,0,1.1); | |||||
field_mulw(&tt,&xx,word); | |||||
field_mulw(tt,xx,word); | |||||
mpz_mul_ui(t,x,word); | mpz_mul_ui(t,x,word); | ||||
succ &= field_assert_eq_gmp("mulw",&xx,&yy,&tt,t,0,1.1); | |||||
succ &= field_assert_eq_gmp("mulw",xx,yy,tt,t,0,1.1); | |||||
field_sqr(&tt,&xx); | |||||
field_sqr(tt,xx); | |||||
mpz_mul(t,x,x); | mpz_mul(t,x,x); | ||||
succ &= field_assert_eq_gmp("sqrx",&xx,&yy,&tt,t,0,1.1); | |||||
succ &= field_assert_eq_gmp("sqrx",xx,yy,tt,t,0,1.1); | |||||
field_sqr(&tt,&yy); | |||||
field_sqr(tt,yy); | |||||
mpz_mul(t,y,y); | mpz_mul(t,y,y); | ||||
succ &= field_assert_eq_gmp("sqy",&xx,&yy,&tt,t,0,1.1); | |||||
succ &= field_assert_eq_gmp("sqy",xx,yy,tt,t,0,1.1); | |||||
if (!succ) { | if (!succ) { | ||||
field_print(" x", &xx); | |||||
field_print(" y", &yy); | |||||
field_print(" x", xx); | |||||
field_print(" y", yy); | |||||
} | } | ||||
mpz_clear(t); | mpz_clear(t); | ||||
@@ -168,28 +168,28 @@ static mask_t test_mul_sqr ( | |||||
static mask_t test_isr ( | static mask_t test_isr ( | ||||
const mpz_t x | const mpz_t x | ||||
) { | ) { | ||||
struct field_t xx,yy,ss,tt; | |||||
field_a_t xx,yy,ss,tt; | |||||
mask_t succ = 0; | mask_t succ = 0; | ||||
succ = mpz_to_field(&xx,x); | |||||
succ = mpz_to_field(xx,x); | |||||
field_isr(&ss,&xx); | |||||
field_sqr(&tt,&ss); | |||||
field_mul(&yy,&xx,&tt); | |||||
field_isr(ss,xx); | |||||
field_sqr(tt,ss); | |||||
field_mul(yy,xx,tt); | |||||
field_addw(&tt,1); | |||||
succ |= field_is_zero(&tt); | |||||
field_addw(tt,1); | |||||
succ |= field_is_zero(tt); | |||||
field_subw(&tt,2); | |||||
field_bias(&tt,1); | |||||
succ |= field_is_zero(&tt); | |||||
field_subw(tt,2); | |||||
field_bias(tt,1); | |||||
succ |= field_is_zero(tt); | |||||
field_addw(&tt,1); | |||||
field_addw(tt,1); | |||||
if (~succ) { | if (~succ) { | ||||
youfail(); | youfail(); | ||||
printf("ISR failure.\n"); | printf("ISR failure.\n"); | ||||
field_print(" x", &xx); | |||||
field_print(" s", &ss); | |||||
field_print(" t", &tt); | |||||
field_print(" x", xx); | |||||
field_print(" s", ss); | |||||
field_print(" t", tt); | |||||
} | } | ||||
return succ; | return succ; | ||||
@@ -214,7 +214,7 @@ int test_arithmetic (void) { | |||||
mask_t succ = MASK_SUCCESS; | mask_t succ = MASK_SUCCESS; | ||||
int radix_bits = sizeof(word_t) * FIELD_BITS / sizeof(field_t); | |||||
int radix_bits = sizeof(word_t) * FIELD_BITS / sizeof(field_a_t); | |||||
for (j=0; j<ntests; j++) { | for (j=0; j<ntests; j++) { | ||||
if (j<256) { | if (j<256) { | ||||
@@ -12,15 +12,15 @@ static void | |||||
failprint_ext ( | failprint_ext ( | ||||
const struct extensible_t *a | const struct extensible_t *a | ||||
) { | ) { | ||||
struct field_t zi, scaled; | |||||
field_print(" x", &a->x); | |||||
field_print(" y", &a->y); | |||||
field_print(" z", &a->z); | |||||
field_inverse(&zi, &a->z); | |||||
field_mul(&scaled, &zi, &a->x); | |||||
field_print(" X", &scaled); | |||||
field_mul(&scaled, &zi, &a->y); | |||||
field_print(" Y", &scaled); | |||||
field_a_t zi, scaled; | |||||
field_print(" x", a->x); | |||||
field_print(" y", a->y); | |||||
field_print(" z", a->z); | |||||
field_inverse(zi, a->z); | |||||
field_mul(scaled, zi, a->x); | |||||
field_print(" X", scaled); | |||||
field_mul(scaled, zi, a->y); | |||||
field_print(" Y", scaled); | |||||
printf("\n"); | printf("\n"); | ||||
} | } | ||||
@@ -165,10 +165,10 @@ add_double_test ( | |||||
if (~succ) { | if (~succ) { | ||||
printf(" Bases were:\n"); | printf(" Bases were:\n"); | ||||
field_print(" x1", &base1->x); | |||||
field_print(" y1", &base1->y); | |||||
field_print(" x2", &base2->x); | |||||
field_print(" y2", &base2->y); | |||||
field_print(" x1", base1->x); | |||||
field_print(" y1", base1->y); | |||||
field_print(" x2", base2->x); | |||||
field_print(" y2", base2->y); | |||||
} | } | ||||
return succ ? 0 : -1; | return succ ? 0 : -1; | ||||
@@ -211,18 +211,18 @@ single_twisting_test ( | |||||
succ = 0; | succ = 0; | ||||
} /* FUTURE: quadness */ | } /* FUTURE: quadness */ | ||||
field_t sera,serb; | |||||
untwist_and_double_and_serialize(&sera,&text); | |||||
field_a_t sera,serb; | |||||
untwist_and_double_and_serialize(sera,&text); | |||||
copy_extensible(&tmpext,&exb); | copy_extensible(&tmpext,&exb); | ||||
double_extensible(&tmpext); | double_extensible(&tmpext); | ||||
serialize_extensible(&serb,&tmpext); | |||||
serialize_extensible(serb,&tmpext); | |||||
/* check that their (doubled; FUTURE?) serializations are equal */ | /* check that their (doubled; FUTURE?) serializations are equal */ | ||||
if (~field_eq(&sera,&serb)) { | |||||
if (~field_eq(sera,serb)) { | |||||
youfail(); | youfail(); | ||||
printf(" Different serialization from twist + double ()\n"); | printf(" Different serialization from twist + double ()\n"); | ||||
field_print(" t", &sera); | |||||
field_print(" b", &serb); | |||||
field_print(" t", sera); | |||||
field_print(" b", serb); | |||||
succ = 0; | succ = 0; | ||||
} | } | ||||
@@ -242,8 +242,8 @@ single_twisting_test ( | |||||
if (~succ) { | if (~succ) { | ||||
printf(" Base was:\n"); | printf(" Base was:\n"); | ||||
field_print(" x", &base->x); | |||||
field_print(" y", &base->y); | |||||
field_print(" x", base->x); | |||||
field_print(" y", base->y); | |||||
} | } | ||||
@@ -253,7 +253,7 @@ single_twisting_test ( | |||||
int test_decaf (void) { | int test_decaf (void) { | ||||
struct affine_t base; | struct affine_t base; | ||||
struct tw_affine_t tw_base; | struct tw_affine_t tw_base; | ||||
struct field_t serf; | |||||
field_a_t serf; | |||||
struct crandom_state_t crand; | struct crandom_state_t crand; | ||||
crandom_init_from_buffer(&crand, "my test_decaf random initializer"); | crandom_init_from_buffer(&crand, "my test_decaf random initializer"); | ||||
@@ -267,87 +267,87 @@ int test_decaf (void) { | |||||
#endif | #endif | ||||
ser[0] &= ~1; | ser[0] &= ~1; | ||||
mask_t succ = field_deserialize(&serf, ser); | |||||
mask_t succ = field_deserialize(serf, ser); | |||||
if (!succ) { | if (!succ) { | ||||
youfail(); | youfail(); | ||||
printf(" Unlikely: fail at field_deserialize\n"); | printf(" Unlikely: fail at field_deserialize\n"); | ||||
return -1; | return -1; | ||||
} | } | ||||
succ &= decaf_deserialize_affine(&base, &serf, 0); | |||||
succ &= decaf_deserialize_affine(&base, serf, 0); | |||||
if (!succ) continue; | if (!succ) continue; | ||||
hits++; | hits++; | ||||
struct field_t serf2; | |||||
field_a_t serf2; | |||||
struct extensible_t ext; | struct extensible_t ext; | ||||
convert_affine_to_extensible(&ext, &base); | convert_affine_to_extensible(&ext, &base); | ||||
decaf_serialize_extensible(&serf2, &ext); | |||||
decaf_serialize_extensible(serf2, &ext); | |||||
if (~validate_affine(&base)) { | if (~validate_affine(&base)) { | ||||
youfail(); | youfail(); | ||||
printf("Invalid decaf deser:\n"); | printf("Invalid decaf deser:\n"); | ||||
field_print(" s", &serf); | |||||
field_print(" x", &base.x); | |||||
field_print(" y", &base.y); | |||||
field_print(" s", serf); | |||||
field_print(" x", base.x); | |||||
field_print(" y", base.y); | |||||
fails ++; | fails ++; | ||||
} else if (~field_eq(&serf, &serf2)) { | |||||
} else if (~field_eq(serf, serf2)) { | |||||
youfail(); | youfail(); | ||||
printf("Fail round-trip through decaf ser:\n"); | printf("Fail round-trip through decaf ser:\n"); | ||||
field_print(" s", &serf); | |||||
field_print(" x", &base.x); | |||||
field_print(" y", &base.y); | |||||
field_print(" s", serf); | |||||
field_print(" x", base.x); | |||||
field_print(" y", base.y); | |||||
printf(" deser is %s\n", validate_affine(&base) ? "valid" : "invalid"); | printf(" deser is %s\n", validate_affine(&base) ? "valid" : "invalid"); | ||||
field_print(" S", &serf2); | |||||
field_print(" S", serf2); | |||||
fails ++; | fails ++; | ||||
} else if (~is_even_pt(&ext)) { | } else if (~is_even_pt(&ext)) { | ||||
youfail(); | youfail(); | ||||
printf("Decaf deser isn't even:\n"); | printf("Decaf deser isn't even:\n"); | ||||
field_print(" s", &serf); | |||||
field_print(" x", &base.x); | |||||
field_print(" y", &base.y); | |||||
field_print(" s", serf); | |||||
field_print(" x", base.x); | |||||
field_print(" y", base.y); | |||||
fails ++; | fails ++; | ||||
} | } | ||||
succ = decaf_deserialize_tw_affine(&tw_base, &serf, 0); | |||||
succ = decaf_deserialize_tw_affine(&tw_base, serf, 0); | |||||
struct tw_extensible_t tw_ext, tw_ext2; | struct tw_extensible_t tw_ext, tw_ext2; | ||||
convert_tw_affine_to_tw_extensible(&tw_ext, &tw_base); | convert_tw_affine_to_tw_extensible(&tw_ext, &tw_base); | ||||
decaf_serialize_tw_extensible(&serf2, &tw_ext); | |||||
decaf_serialize_tw_extensible(serf2, &tw_ext); | |||||
twist_even(&tw_ext2, &ext); | twist_even(&tw_ext2, &ext); | ||||
if (~validate_tw_extensible(&tw_ext)) { | if (~validate_tw_extensible(&tw_ext)) { | ||||
youfail(); | youfail(); | ||||
printf("Invalid decaf tw deser:\n"); | printf("Invalid decaf tw deser:\n"); | ||||
field_print(" s", &serf); | |||||
field_print(" x", &tw_base.x); | |||||
field_print(" y", &tw_base.y); | |||||
field_print(" s", serf); | |||||
field_print(" x", tw_base.x); | |||||
field_print(" y", tw_base.y); | |||||
fails ++; | fails ++; | ||||
} else if (~field_eq(&serf, &serf2)) { | |||||
} else if (~field_eq(serf, serf2)) { | |||||
youfail(); | youfail(); | ||||
printf("Fail round-trip through decaf ser:\n"); | printf("Fail round-trip through decaf ser:\n"); | ||||
field_print(" s", &serf); | |||||
field_print(" x", &tw_base.x); | |||||
field_print(" y", &tw_base.y); | |||||
field_print(" s", serf); | |||||
field_print(" x", tw_base.x); | |||||
field_print(" y", tw_base.y); | |||||
printf(" tw deser is %s\n", validate_tw_extensible(&tw_ext) ? "valid" : "invalid"); | printf(" tw deser is %s\n", validate_tw_extensible(&tw_ext) ? "valid" : "invalid"); | ||||
field_print(" S", &serf2); | |||||
field_print(" S", serf2); | |||||
fails ++; | fails ++; | ||||
} else if (~is_even_tw(&tw_ext)) { | } else if (~is_even_tw(&tw_ext)) { | ||||
youfail(); | youfail(); | ||||
printf("Decaf tw deser isn't even:\n"); | printf("Decaf tw deser isn't even:\n"); | ||||
field_print(" s", &serf); | |||||
field_print(" x", &tw_base.x); | |||||
field_print(" y", &tw_base.y); | |||||
field_print(" s", serf); | |||||
field_print(" x", tw_base.x); | |||||
field_print(" y", tw_base.y); | |||||
fails ++; | fails ++; | ||||
} else if (~decaf_eq_tw_extensible(&tw_ext,&tw_ext2)) { | } else if (~decaf_eq_tw_extensible(&tw_ext,&tw_ext2)) { | ||||
youfail(); | youfail(); | ||||
printf("Decaf tw doesn't equal ext:\n"); | printf("Decaf tw doesn't equal ext:\n"); | ||||
field_print(" s", &serf); | |||||
field_print(" x1", &base.x); | |||||
field_print(" y1", &base.y); | |||||
field_print(" x2", &tw_base.x); | |||||
field_print(" y2", &tw_base.y); | |||||
field_print(" X2", &tw_ext2.x); | |||||
field_print(" Y2", &tw_ext2.y); | |||||
field_print(" s", serf); | |||||
field_print(" x1", base.x); | |||||
field_print(" y1", base.y); | |||||
field_print(" x2", tw_base.x); | |||||
field_print(" y2", tw_base.y); | |||||
field_print(" X2", tw_ext2.x); | |||||
field_print(" Y2", tw_ext2.y); | |||||
fails ++; | fails ++; | ||||
} | } | ||||
@@ -365,7 +365,7 @@ int test_decaf (void) { | |||||
int test_pointops (void) { | int test_pointops (void) { | ||||
struct affine_t base, pbase; | struct affine_t base, pbase; | ||||
struct field_t serf; | |||||
field_a_t serf; | |||||
struct crandom_state_t crand; | struct crandom_state_t crand; | ||||
crandom_init_from_buffer(&crand, "test_pointops random initializer"); | crandom_init_from_buffer(&crand, "test_pointops random initializer"); | ||||
@@ -390,7 +390,7 @@ int test_pointops (void) { | |||||
#endif | #endif | ||||
/* TODO: we need a field generate, which can return random or pathological. */ | /* TODO: we need a field generate, which can return random or pathological. */ | ||||
mask_t succ = field_deserialize(&serf, ser); | |||||
mask_t succ = field_deserialize(serf, ser); | |||||
if (!succ) { | if (!succ) { | ||||
youfail(); | youfail(); | ||||
printf(" Unlikely: fail at field_deserialize\n"); | printf(" Unlikely: fail at field_deserialize\n"); | ||||
@@ -400,7 +400,7 @@ int test_pointops (void) { | |||||
if (i) { | if (i) { | ||||
copy_affine(&pbase, &base); | copy_affine(&pbase, &base); | ||||
} | } | ||||
elligator_2s_inject(&base, &serf); | |||||
elligator_2s_inject(&base, serf); | |||||
if (i) { | if (i) { | ||||
ret = add_double_test(&base, &pbase); | ret = add_double_test(&base, &pbase); | ||||
@@ -12,19 +12,19 @@ | |||||
/* 0 = succeed, 1 = inval, -1 = fail */ | /* 0 = succeed, 1 = inval, -1 = fail */ | ||||
static int | static int | ||||
single_scalarmul_compatibility_test ( | single_scalarmul_compatibility_test ( | ||||
const struct field_t *base, | |||||
const field_a_t base, | |||||
const word_t *scalar, | const word_t *scalar, | ||||
int nbits | int nbits | ||||
) { | ) { | ||||
struct tw_extensible_t text, work; | struct tw_extensible_t text, work; | ||||
struct field_t mont, ct, vl, vt; | |||||
field_a_t mont, ct, vl, vt; | |||||
int ret = 0, i; | int ret = 0, i; | ||||
mask_t succ, succm; | mask_t succ, succm; | ||||
succ = deserialize_and_twist_approx(&text, &sqrt_d_minus_1, base); | |||||
succ = deserialize_and_twist_approx(&text, base); | |||||
succm = montgomery_ladder(&mont,base,scalar,nbits,1); | |||||
succm = montgomery_ladder(mont,base,scalar,nbits,1); | |||||
if (succ != succm) { | if (succ != succm) { | ||||
youfail(); | youfail(); | ||||
@@ -52,7 +52,7 @@ single_scalarmul_compatibility_test ( | |||||
const int nparams = sizeof(params)/sizeof(params[0]); | const int nparams = sizeof(params)/sizeof(params[0]); | ||||
struct fixed_base_table_t fbt; | struct fixed_base_table_t fbt; | ||||
const int nsizes = 6; | const int nsizes = 6; | ||||
struct field_t fbout[nparams], wout[nsizes]; | |||||
field_a_t fbout[nparams], wout[nsizes]; | |||||
memset(&fbt, 0, sizeof(fbt)); | memset(&fbt, 0, sizeof(fbt)); | ||||
memset(&fbout, 0, sizeof(fbout)); | memset(&fbout, 0, sizeof(fbout)); | ||||
memset(&wout, 0, sizeof(wout)); | memset(&wout, 0, sizeof(wout)); | ||||
@@ -75,7 +75,7 @@ single_scalarmul_compatibility_test ( | |||||
continue; | continue; | ||||
} | } | ||||
untwist_and_double_and_serialize(&fbout[i], &work); | |||||
untwist_and_double_and_serialize(fbout[i], &work); | |||||
} | } | ||||
/* compute using precomp wNAF */ | /* compute using precomp wNAF */ | ||||
@@ -91,7 +91,7 @@ single_scalarmul_compatibility_test ( | |||||
scalarmul_fixed_base_wnaf_vt(&work, scalar, nbits, pre, i); | scalarmul_fixed_base_wnaf_vt(&work, scalar, nbits, pre, i); | ||||
untwist_and_double_and_serialize(&wout[i], &work); | |||||
untwist_and_double_and_serialize(wout[i], &work); | |||||
} | } | ||||
mask_t consistent = MASK_SUCCESS; | mask_t consistent = MASK_SUCCESS; | ||||
@@ -100,31 +100,31 @@ single_scalarmul_compatibility_test ( | |||||
/* window methods currently only work on FIELD_BITS bits. */ | /* window methods currently only work on FIELD_BITS bits. */ | ||||
copy_tw_extensible(&work, &text); | copy_tw_extensible(&work, &text); | ||||
scalarmul(&work, scalar); | scalarmul(&work, scalar); | ||||
untwist_and_double_and_serialize(&ct, &work); | |||||
untwist_and_double_and_serialize(ct, &work); | |||||
copy_tw_extensible(&work, &text); | copy_tw_extensible(&work, &text); | ||||
scalarmul_vlook(&work, scalar); | scalarmul_vlook(&work, scalar); | ||||
untwist_and_double_and_serialize(&vl, &work); | |||||
untwist_and_double_and_serialize(vl, &work); | |||||
copy_tw_extensible(&work, &text); | copy_tw_extensible(&work, &text); | ||||
scalarmul_vt(&work, scalar, nbits); | scalarmul_vt(&work, scalar, nbits); | ||||
untwist_and_double_and_serialize(&vt, &work); | |||||
untwist_and_double_and_serialize(vt, &work); | |||||
/* check consistency mont vs window */ | /* check consistency mont vs window */ | ||||
consistent &= field_eq(&mont, &ct); | |||||
consistent &= field_eq(&mont, &vl); | |||||
consistent &= field_eq(&mont, &vt); | |||||
consistent &= field_eq(mont, ct); | |||||
consistent &= field_eq(mont, vl); | |||||
consistent &= field_eq(mont, vt); | |||||
} | } | ||||
/* check consistency mont vs combs */ | /* check consistency mont vs combs */ | ||||
for (i=0; i<nparams; i++) { | for (i=0; i<nparams; i++) { | ||||
consistent &= field_eq(&mont,&fbout[i]); | |||||
consistent &= field_eq(mont,fbout[i]); | |||||
} | } | ||||
/* check consistency mont vs wNAF */ | /* check consistency mont vs wNAF */ | ||||
for (i=0; i<nsizes; i++) { | for (i=0; i<nsizes; i++) { | ||||
consistent &= field_eq(&mont,&wout[i]); | |||||
consistent &= field_eq(mont,wout[i]); | |||||
} | } | ||||
/* If inconsistent, complain. */ | /* If inconsistent, complain. */ | ||||
@@ -133,23 +133,23 @@ single_scalarmul_compatibility_test ( | |||||
printf(" Failed scalarmul consistency test with nbits=%d.\n",nbits); | printf(" Failed scalarmul consistency test with nbits=%d.\n",nbits); | ||||
field_print(" base", base); | field_print(" base", base); | ||||
scalar_print(" scal", scalar, (nbits+WORD_BITS-1)/WORD_BITS); | scalar_print(" scal", scalar, (nbits+WORD_BITS-1)/WORD_BITS); | ||||
field_print(" mont", &mont); | |||||
field_print(" mont", mont); | |||||
for (i=0; i<nparams; i++) { | for (i=0; i<nparams; i++) { | ||||
printf(" With n=%d, t=%d, s=%d:\n", params[i].n, params[i].t, params[i].s); | printf(" With n=%d, t=%d, s=%d:\n", params[i].n, params[i].t, params[i].s); | ||||
field_print(" out ", &fbout[i]); | |||||
field_print(" out ", fbout[i]); | |||||
} | } | ||||
for (i=0; i<nsizes; i++) { | for (i=0; i<nsizes; i++) { | ||||
printf(" With w=%d:\n",i); | printf(" With w=%d:\n",i); | ||||
field_print(" wNAF", &wout[i]); | |||||
field_print(" wNAF", wout[i]); | |||||
} | } | ||||
if (nbits == FIELD_BITS) { | if (nbits == FIELD_BITS) { | ||||
field_print(" ct ", &ct); | |||||
field_print(" vl ", &vl); | |||||
field_print(" vt ", &vt); | |||||
field_print(" ct ", ct); | |||||
field_print(" vl ", vl); | |||||
field_print(" vt ", vt); | |||||
} | } | ||||
ret = -1; | ret = -1; | ||||
@@ -160,20 +160,20 @@ single_scalarmul_compatibility_test ( | |||||
static int | static int | ||||
single_linear_combo_test ( | single_linear_combo_test ( | ||||
const struct field_t *base1, | |||||
const field_a_t base1, | |||||
const word_t *scalar1, | const word_t *scalar1, | ||||
int nbits1, | int nbits1, | ||||
const struct field_t *base2, | |||||
const field_a_t base2, | |||||
const word_t *scalar2, | const word_t *scalar2, | ||||
int nbits2 | int nbits2 | ||||
) { | ) { | ||||
struct tw_extensible_t text1, text2, working; | struct tw_extensible_t text1, text2, working; | ||||
struct tw_pniels_t pn; | struct tw_pniels_t pn; | ||||
struct field_t result_comb, result_combo, result_wnaf; | |||||
field_a_t result_comb, result_combo, result_wnaf; | |||||
mask_t succ = | mask_t succ = | ||||
deserialize_and_twist_approx(&text1, &sqrt_d_minus_1, base1) | |||||
& deserialize_and_twist_approx(&text2, &sqrt_d_minus_1, base2); | |||||
deserialize_and_twist_approx(&text1, base1) | |||||
& deserialize_and_twist_approx(&text2, base2); | |||||
if (!succ) return 1; | if (!succ) return 1; | ||||
struct fixed_base_table_t t1, t2; | struct fixed_base_table_t t1, t2; | ||||
@@ -194,22 +194,22 @@ single_linear_combo_test ( | |||||
/* use the dedicated wNAF linear combo algorithm */ | /* use the dedicated wNAF linear combo algorithm */ | ||||
copy_tw_extensible(&working, &text1); | copy_tw_extensible(&working, &text1); | ||||
linear_combo_var_fixed_vt(&working, scalar1, nbits1, scalar2, nbits2, wnaf, 5); | linear_combo_var_fixed_vt(&working, scalar1, nbits1, scalar2, nbits2, wnaf, 5); | ||||
untwist_and_double_and_serialize(&result_wnaf, &working); | |||||
untwist_and_double_and_serialize(result_wnaf, &working); | |||||
/* use the dedicated combs algorithm */ | /* use the dedicated combs algorithm */ | ||||
succ &= linear_combo_combs_vt(&working, scalar1, nbits1, &t1, scalar2, nbits2, &t2); | succ &= linear_combo_combs_vt(&working, scalar1, nbits1, &t1, scalar2, nbits2, &t2); | ||||
untwist_and_double_and_serialize(&result_combo, &working); | |||||
untwist_and_double_and_serialize(result_combo, &working); | |||||
/* use two combs */ | /* use two combs */ | ||||
succ &= scalarmul_fixed_base(&working, scalar1, nbits1, &t1); | succ &= scalarmul_fixed_base(&working, scalar1, nbits1, &t1); | ||||
convert_tw_extensible_to_tw_pniels(&pn, &working); | convert_tw_extensible_to_tw_pniels(&pn, &working); | ||||
succ &= scalarmul_fixed_base(&working, scalar2, nbits2, &t2); | succ &= scalarmul_fixed_base(&working, scalar2, nbits2, &t2); | ||||
add_tw_pniels_to_tw_extensible(&working, &pn); | add_tw_pniels_to_tw_extensible(&working, &pn); | ||||
untwist_and_double_and_serialize(&result_comb, &working); | |||||
untwist_and_double_and_serialize(result_comb, &working); | |||||
mask_t consistent = MASK_SUCCESS; | mask_t consistent = MASK_SUCCESS; | ||||
consistent &= field_eq(&result_combo, &result_wnaf); | |||||
consistent &= field_eq(&result_comb, &result_wnaf); | |||||
consistent &= field_eq(result_combo, result_wnaf); | |||||
consistent &= field_eq(result_comb, result_wnaf); | |||||
if (!succ || !consistent) { | if (!succ || !consistent) { | ||||
youfail(); | youfail(); | ||||
@@ -219,9 +219,9 @@ single_linear_combo_test ( | |||||
scalar_print(" scal1", scalar1, (nbits1+WORD_BITS-1)/WORD_BITS); | scalar_print(" scal1", scalar1, (nbits1+WORD_BITS-1)/WORD_BITS); | ||||
field_print(" base2", base2); | field_print(" base2", base2); | ||||
scalar_print(" scal2", scalar2, (nbits1+WORD_BITS-1)/WORD_BITS); | scalar_print(" scal2", scalar2, (nbits1+WORD_BITS-1)/WORD_BITS); | ||||
field_print(" combs", &result_comb); | |||||
field_print(" combo", &result_combo); | |||||
field_print(" wNAFs", &result_wnaf); | |||||
field_print(" combs", result_comb); | |||||
field_print(" combo", result_combo); | |||||
field_print(" wNAFs", result_wnaf); | |||||
return -1; | return -1; | ||||
} | } | ||||
@@ -234,7 +234,7 @@ single_linear_combo_test ( | |||||
/* 0 = succeed, 1 = inval, -1 = fail */ | /* 0 = succeed, 1 = inval, -1 = fail */ | ||||
static int | static int | ||||
single_scalarmul_commutativity_test ( | single_scalarmul_commutativity_test ( | ||||
const struct field_t *base, | |||||
const field_a_t base, | |||||
const word_t *scalar1, | const word_t *scalar1, | ||||
int nbits1, | int nbits1, | ||||
int ned1, | int ned1, | ||||
@@ -242,12 +242,12 @@ single_scalarmul_commutativity_test ( | |||||
int nbits2, | int nbits2, | ||||
int ned2 | int ned2 | ||||
) { | ) { | ||||
struct field_t m12, m21, tmp1, tmp2; | |||||
mask_t succ12a = montgomery_ladder(&tmp1,base,scalar1,nbits1,ned1); | |||||
mask_t succ12b = montgomery_ladder(&m12,&tmp1,scalar2,nbits2,ned2); | |||||
field_a_t m12, m21, tmp1, tmp2; | |||||
mask_t succ12a = montgomery_ladder(tmp1,base,scalar1,nbits1,ned1); | |||||
mask_t succ12b = montgomery_ladder(m12,tmp1,scalar2,nbits2,ned2); | |||||
mask_t succ21a = montgomery_ladder(&tmp2,base,scalar2,nbits2,ned2); | |||||
mask_t succ21b = montgomery_ladder(&m21,&tmp2,scalar1,nbits1,ned1); | |||||
mask_t succ21a = montgomery_ladder(tmp2,base,scalar2,nbits2,ned2); | |||||
mask_t succ21b = montgomery_ladder(m21,tmp2,scalar1,nbits1,ned1); | |||||
mask_t succ12 = succ12a & succ12b, succ21 = succ21a & succ21b; | mask_t succ12 = succ12a & succ12b, succ21 = succ21a & succ21b; | ||||
@@ -256,8 +256,8 @@ single_scalarmul_commutativity_test ( | |||||
printf(" Failed scalarmul commutativity test with (nbits,ned) = (%d,%d), (%d,%d).\n", | printf(" Failed scalarmul commutativity test with (nbits,ned) = (%d,%d), (%d,%d).\n", | ||||
nbits1,ned1,nbits2,ned2); | nbits1,ned1,nbits2,ned2); | ||||
field_print(" base", base); | field_print(" base", base); | ||||
field_print(" tmp1", &tmp1); | |||||
field_print(" tmp2", &tmp2); | |||||
field_print(" tmp1", tmp1); | |||||
field_print(" tmp2", tmp2); | |||||
scalar_print(" sca1", scalar1, (nbits1+WORD_BITS-1)/WORD_BITS); | scalar_print(" sca1", scalar1, (nbits1+WORD_BITS-1)/WORD_BITS); | ||||
scalar_print(" sca2", scalar2, (nbits1+WORD_BITS-1)/WORD_BITS); | scalar_print(" sca2", scalar2, (nbits1+WORD_BITS-1)/WORD_BITS); | ||||
printf(" good = ((%d,%d),(%d,%d))\n", (int)-succ12a, | printf(" good = ((%d,%d),(%d,%d))\n", (int)-succ12a, | ||||
@@ -269,7 +269,7 @@ single_scalarmul_commutativity_test ( | |||||
return 1; | return 1; | ||||
} | } | ||||
mask_t consistent = field_eq(&m12,&m21); | |||||
mask_t consistent = field_eq(m12,m21); | |||||
if (consistent) { | if (consistent) { | ||||
return 0; | return 0; | ||||
} else { | } else { | ||||
@@ -279,8 +279,8 @@ single_scalarmul_commutativity_test ( | |||||
field_print(" base", base); | field_print(" base", base); | ||||
scalar_print(" sca1", scalar1, (nbits1+WORD_BITS-1)/WORD_BITS); | scalar_print(" sca1", scalar1, (nbits1+WORD_BITS-1)/WORD_BITS); | ||||
scalar_print(" sca2", scalar2, (nbits1+WORD_BITS-1)/WORD_BITS); | scalar_print(" sca2", scalar2, (nbits1+WORD_BITS-1)/WORD_BITS); | ||||
field_print(" m12 ", &m12); | |||||
field_print(" m21 ", &m21); | |||||
field_print(" m12 ", m12); | |||||
field_print(" m21 ", m21); | |||||
return -1; | return -1; | ||||
} | } | ||||
} | } | ||||