@@ -42,12 +42,6 @@ p448_neg ( | |||
p448_t *out, | |||
const p448_t *a | |||
) __attribute__((unused,always_inline)); | |||
static __inline__ void | |||
p448_cond_neg ( | |||
p448_t *a, | |||
mask_t doNegate | |||
) __attribute__((unused,always_inline)); | |||
static __inline__ void | |||
p448_addw ( | |||
@@ -120,12 +114,6 @@ p448_deserialize ( | |||
const uint8_t serial[56] | |||
); | |||
static inline mask_t | |||
p448_eq ( | |||
const struct p448_t *a, | |||
const struct p448_t *b | |||
) __attribute__((always_inline,unused)); | |||
/* -------------- Inline functions begin here -------------- */ | |||
void | |||
@@ -194,25 +182,6 @@ p448_neg ( | |||
*/ | |||
} | |||
void | |||
p448_cond_neg( | |||
p448_t *a, | |||
mask_t doNegate | |||
) { | |||
unsigned int i; | |||
struct p448_t negated; | |||
big_register_t *aa = (big_register_t *)a; | |||
big_register_t *nn = (big_register_t*)&negated; | |||
big_register_t m = br_set_to_mask(doNegate); | |||
p448_neg(&negated, a); | |||
p448_bias(&negated, 2); | |||
for (i=0; i<sizeof(*a)/sizeof(*aa); i++) { | |||
aa[i] = (aa[i] & ~m) | (nn[i] & m); | |||
} | |||
} | |||
void | |||
p448_addw ( | |||
p448_t *a, | |||
@@ -265,21 +234,6 @@ p448_weak_reduce ( | |||
a->limb[0] = (a->limb[0] & mask) + tmp; | |||
} | |||
mask_t | |||
p448_eq ( | |||
const struct p448_t *a, | |||
const struct p448_t *b | |||
) { | |||
struct p448_t ra, rb; | |||
p448_copy(&ra, a); | |||
p448_copy(&rb, b); | |||
p448_weak_reduce(&ra); | |||
p448_weak_reduce(&rb); | |||
p448_sub(&ra, &ra, &rb); | |||
p448_bias(&ra, 2); | |||
return p448_is_zero(&ra); | |||
} | |||
#ifdef __cplusplus | |||
}; /* extern "C" */ | |||
#endif | |||
@@ -42,12 +42,6 @@ p448_neg ( | |||
p448_t *out, | |||
const p448_t *a | |||
) __attribute__((unused,always_inline)); | |||
static __inline__ void | |||
p448_cond_neg ( | |||
p448_t *a, | |||
mask_t doNegate | |||
) __attribute__((unused,always_inline)); | |||
static __inline__ void | |||
p448_addw ( | |||
@@ -119,12 +113,6 @@ p448_deserialize ( | |||
p448_t *x, | |||
const uint8_t serial[56] | |||
); | |||
static inline mask_t | |||
p448_eq ( | |||
const struct p448_t *a, | |||
const struct p448_t *b | |||
) __attribute__((always_inline,unused)); | |||
/* -------------- Inline functions begin here -------------- */ | |||
@@ -194,29 +182,6 @@ p448_neg ( | |||
*/ | |||
} | |||
void | |||
p448_cond_neg( | |||
p448_t *a, | |||
mask_t doNegate | |||
) { | |||
unsigned int i; | |||
struct p448_t negated; | |||
big_register_t *aa = (big_register_t *)a; | |||
big_register_t *nn = (big_register_t*)&negated; | |||
#if __ARM_NEON__ | |||
big_register_t m = vdupq_n_u32(doNegate); | |||
#else | |||
big_register_t m = doNegate; | |||
#endif | |||
p448_neg(&negated, a); | |||
p448_bias(&negated, 2); | |||
for (i=0; i<sizeof(*a)/sizeof(*aa); i++) { | |||
aa[i] = (aa[i] & ~m) | (nn[i] & m); | |||
} | |||
} | |||
void | |||
p448_addw ( | |||
p448_t *a, | |||
@@ -269,21 +234,6 @@ p448_weak_reduce ( | |||
a->limb[0] = (a->limb[0] & mask) + tmp; | |||
} | |||
mask_t | |||
p448_eq ( | |||
const struct p448_t *a, | |||
const struct p448_t *b | |||
) { | |||
struct p448_t ra, rb; | |||
p448_copy(&ra, a); | |||
p448_copy(&rb, b); | |||
p448_weak_reduce(&ra); | |||
p448_weak_reduce(&rb); | |||
p448_sub(&ra, &ra, &rb); | |||
p448_bias(&ra, 2); | |||
return p448_is_zero(&ra); | |||
} | |||
#ifdef __cplusplus | |||
}; /* extern "C" */ | |||
#endif | |||
@@ -42,12 +42,6 @@ p448_neg ( | |||
p448_t *out, | |||
const p448_t *a | |||
) __attribute__((unused,always_inline)); | |||
static __inline__ void | |||
p448_cond_neg ( | |||
p448_t *a, | |||
mask_t doNegate | |||
) __attribute__((unused,always_inline)); | |||
static __inline__ void | |||
p448_addw ( | |||
@@ -120,12 +114,6 @@ p448_deserialize ( | |||
const uint8_t serial[56] | |||
); | |||
static inline mask_t | |||
p448_eq ( | |||
const struct p448_t *a, | |||
const struct p448_t *b | |||
) __attribute__((always_inline,unused)); | |||
/* -------------- Inline functions begin here -------------- */ | |||
void | |||
@@ -194,25 +182,6 @@ p448_neg ( | |||
*/ | |||
} | |||
void | |||
p448_cond_neg( | |||
p448_t *a, | |||
mask_t doNegate | |||
) { | |||
unsigned int i; | |||
struct p448_t negated; | |||
big_register_t *aa = (big_register_t *)a; | |||
big_register_t *nn = (big_register_t*)&negated; | |||
big_register_t m = br_set_to_mask(doNegate); | |||
p448_neg(&negated, a); | |||
p448_bias(&negated, 2); | |||
for (i=0; i<sizeof(*a)/sizeof(*aa); i++) { | |||
aa[i] = (aa[i] & ~m) | (nn[i] & m); | |||
} | |||
} | |||
void | |||
p448_addw ( | |||
p448_t *a, | |||
@@ -265,21 +234,6 @@ p448_weak_reduce ( | |||
a->limb[0] = (a->limb[0] & mask) + tmp; | |||
} | |||
mask_t | |||
p448_eq ( | |||
const struct p448_t *a, | |||
const struct p448_t *b | |||
) { | |||
struct p448_t ra, rb; | |||
p448_copy(&ra, a); | |||
p448_copy(&rb, b); | |||
p448_weak_reduce(&ra); | |||
p448_weak_reduce(&rb); | |||
p448_sub(&ra, &ra, &rb); | |||
p448_bias(&ra, 2); | |||
return p448_is_zero(&ra); | |||
} | |||
#ifdef __cplusplus | |||
}; /* extern "C" */ | |||
#endif | |||
@@ -45,12 +45,6 @@ p448_neg ( | |||
p448_t *out, | |||
const p448_t *a | |||
) __attribute__((unused,always_inline)); | |||
static __inline__ void | |||
p448_cond_neg ( | |||
p448_t *a, | |||
mask_t doNegate | |||
) __attribute__((unused,always_inline)); | |||
static __inline__ void | |||
p448_addw ( | |||
@@ -123,12 +117,6 @@ p448_deserialize ( | |||
const uint8_t serial[56] | |||
); | |||
static inline mask_t | |||
p448_eq ( | |||
const struct p448_t *a, | |||
const struct p448_t *b | |||
) __attribute__((always_inline,unused)); | |||
/* -------------- Inline functions begin here -------------- */ | |||
void | |||
@@ -191,25 +179,6 @@ p448_neg ( | |||
*/ | |||
} | |||
void | |||
p448_cond_neg( | |||
p448_t *a, | |||
mask_t doNegate | |||
) { | |||
unsigned int i; | |||
struct p448_t negated; | |||
big_register_t *aa = (big_register_t *)a; | |||
big_register_t *nn = (big_register_t*)&negated; | |||
big_register_t m = br_set_to_mask(doNegate); | |||
p448_neg(&negated, a); | |||
p448_bias(&negated, 2); | |||
for (i=0; i<sizeof(*a)/sizeof(*aa); i++) { | |||
aa[i] = (aa[i] & ~m) | (nn[i] & m); | |||
} | |||
} | |||
void | |||
p448_addw ( | |||
p448_t *a, | |||
@@ -263,21 +232,6 @@ p448_weak_reduce ( | |||
aa[0] = (aa[0] & vmask) + vrev64_u32(tmp) + (tmp&vm2); | |||
} | |||
mask_t | |||
p448_eq ( | |||
const struct p448_t *a, | |||
const struct p448_t *b | |||
) { | |||
struct p448_t ra, rb; | |||
p448_copy(&ra, a); | |||
p448_copy(&rb, b); | |||
p448_weak_reduce(&ra); | |||
p448_weak_reduce(&rb); | |||
p448_sub(&ra, &ra, &rb); | |||
p448_bias(&ra, 2); | |||
return p448_is_zero(&ra); | |||
} | |||
#ifdef __cplusplus | |||
}; /* extern "C" */ | |||
#endif | |||
@@ -43,12 +43,6 @@ p448_neg ( | |||
p448_t *out, | |||
const p448_t *a | |||
) __attribute__((unused)); | |||
static __inline__ void | |||
p448_cond_neg ( | |||
p448_t *a, | |||
mask_t doNegate | |||
) __attribute__((unused)); | |||
static __inline__ void | |||
p448_addw ( | |||
@@ -127,12 +121,6 @@ p448_deserialize ( | |||
const uint8_t serial[56] | |||
); | |||
static inline mask_t | |||
p448_eq ( | |||
const struct p448_t *a, | |||
const struct p448_t *b | |||
) __attribute__((always_inline,unused)); | |||
/* -------------- Inline functions begin here -------------- */ | |||
void | |||
@@ -187,23 +175,6 @@ p448_neg ( | |||
p448_weak_reduce(out); | |||
} | |||
void | |||
p448_cond_neg( | |||
struct p448_t *a, | |||
mask_t doNegate | |||
) { | |||
unsigned int i; | |||
struct p448_t negated; | |||
p448_neg(&negated, a); | |||
p448_bias(&negated, 2); | |||
for (i=0; i<8; i++) { | |||
a->limb[i] = ( a->limb[i] & ~doNegate ) | |||
| ( negated.limb[i] & doNegate ); | |||
} | |||
} | |||
void | |||
p448_addw ( | |||
p448_t *a, | |||
@@ -267,18 +238,6 @@ p448_weak_reduce ( | |||
a->limb[0] = (a->limb[0] & mask) + tmp; | |||
} | |||
mask_t | |||
p448_eq ( | |||
const struct p448_t *a, | |||
const struct p448_t *b | |||
) { | |||
struct p448_t ra, rb; | |||
p448_copy(&ra, a); | |||
p448_copy(&rb, b); | |||
p448_sub(&ra, &ra, &rb); | |||
return p448_is_zero(&ra); | |||
} | |||
#ifdef __cplusplus | |||
}; /* extern "C" */ | |||
#endif | |||
@@ -42,12 +42,6 @@ p448_neg ( | |||
p448_t *out, | |||
const p448_t *a | |||
) __attribute__((unused,always_inline)); | |||
static __inline__ void | |||
p448_cond_neg ( | |||
p448_t *a, | |||
mask_t doNegate | |||
) __attribute__((unused,always_inline)); | |||
static __inline__ void | |||
p448_addw ( | |||
@@ -120,12 +114,6 @@ p448_deserialize ( | |||
const uint8_t serial[56] | |||
); | |||
static inline mask_t | |||
p448_eq ( | |||
const struct p448_t *a, | |||
const struct p448_t *b | |||
) __attribute__((always_inline,unused)); | |||
/* -------------- Inline functions begin here -------------- */ | |||
void | |||
@@ -193,25 +181,6 @@ p448_neg ( | |||
*/ | |||
} | |||
void | |||
p448_cond_neg( | |||
struct p448_t *a, | |||
mask_t doNegate | |||
) { | |||
unsigned int i; | |||
struct p448_t negated; | |||
big_register_t *aa = (big_register_t *)a; | |||
big_register_t *nn = (big_register_t*)&negated; | |||
big_register_t m = br_set_to_mask(doNegate); | |||
p448_neg(&negated, a); | |||
p448_bias(&negated, 2); | |||
for (i=0; i<sizeof(*a)/sizeof(*aa); i++) { | |||
aa[i] = (aa[i] & ~m) | (nn[i] & m); | |||
} | |||
} | |||
void | |||
p448_addw ( | |||
p448_t *a, | |||
@@ -227,4 +227,64 @@ constant_time_mask ( | |||
} | |||
} | |||
/** | |||
* @brief Constant-time a = mask ? bTrue : bFalse. | |||
* | |||
* The input and output must be at least as aligned as elem_bytes. | |||
* | |||
* Note that the output is not __restrict__, but if it overlaps either | |||
* input, it must be equal and not partially overlap. | |||
*/ | |||
static __inline__ void | |||
__attribute__((unused,always_inline)) | |||
constant_time_select ( | |||
void *a_, | |||
const void *bTrue_, | |||
const void *bFalse_, | |||
word_t elem_bytes, | |||
mask_t mask | |||
) { | |||
unsigned char *a = (unsigned char *)a_; | |||
const unsigned char *bTrue = (const unsigned char *)bTrue_; | |||
const unsigned char *bFalse = (const unsigned char *)bFalse_; | |||
word_t k; | |||
big_register_t br_mask = br_set_to_mask(mask); | |||
for (k=0; k<=elem_bytes-sizeof(big_register_t); k+=sizeof(big_register_t)) { | |||
if (elem_bytes % sizeof(big_register_t)) { | |||
/* unaligned */ | |||
((unaligned_br_t*)(&a[k]))->unaligned = | |||
( br_mask & ((const unaligned_br_t*)(&bTrue [k]))->unaligned) | |||
| (~br_mask & ((const unaligned_br_t*)(&bFalse[k]))->unaligned); | |||
} else { | |||
/* aligned */ | |||
*(big_register_t *)(a+k) = | |||
( br_mask & *(const big_register_t*)(&bTrue [k])) | |||
| (~br_mask & *(const big_register_t*)(&bFalse[k])); | |||
} | |||
} | |||
if (elem_bytes % sizeof(big_register_t) >= sizeof(word_t)) { | |||
for (; k<=elem_bytes-sizeof(word_t); k+=sizeof(word_t)) { | |||
if (elem_bytes % sizeof(word_t)) { | |||
/* unaligned */ | |||
((unaligned_word_t*)(&a[k]))->unaligned = | |||
( mask & ((const unaligned_word_t*)(&bTrue [k]))->unaligned) | |||
| (~mask & ((const unaligned_word_t*)(&bFalse[k]))->unaligned); | |||
} else { | |||
/* aligned */ | |||
*(word_t *)(a+k) = | |||
( mask & *(const word_t*)(&bTrue [k])) | |||
| (~mask & *(const word_t*)(&bFalse[k])); | |||
} | |||
} | |||
} | |||
if (elem_bytes % sizeof(word_t)) { | |||
for (; k<elem_bytes; k+=1) { | |||
a[k] = ( mask & bTrue[k]) | (~mask & bFalse[k]); | |||
} | |||
} | |||
} | |||
#endif /* __CONSTANT_TIME_H__ */ |
@@ -10,6 +10,7 @@ | |||
#define __FIELD_H__ | |||
#include <string.h> | |||
#include "constant_time.h" | |||
#include "p448.h" | |||
#define FIELD_BITS 448 | |||
@@ -24,9 +25,13 @@ | |||
#define field_neg p448_neg | |||
#define field_set_ui p448_set_ui | |||
#define field_bias p448_bias | |||
#define field_cond_neg p448_cond_neg | |||
#define field_inverse p448_inverse | |||
#define field_eq p448_eq | |||
#define field_isr p448_isr | |||
#define field_simultaneous_invert p448_simultaneous_invert | |||
#define field_weak_reduce p448_weak_reduce | |||
#define field_strong_reduce p448_strong_reduce | |||
#define field_cond_neg p448_cond_neg | |||
#define field_serialize p448_serialize | |||
#define field_deserialize p448_deserialize | |||
#define field_is_zero p448_is_zero | |||
@@ -54,6 +59,21 @@ field_copy ( | |||
memcpy(a,b,sizeof(*a)); | |||
} | |||
/** | |||
* Negate a in place if doNegate. | |||
*/ | |||
static inline void | |||
__attribute__((unused,always_inline)) | |||
field_cond_neg( | |||
field_t *a, | |||
mask_t doNegate | |||
) { | |||
struct field_t negated; | |||
field_neg(&negated, a); | |||
field_bias(&negated, 2); | |||
constant_time_select(a, &negated, a, sizeof(negated), doNegate); | |||
} | |||
/** | |||
* Returns 1/sqrt(+- x). | |||
* | |||
@@ -75,8 +95,8 @@ field_isr ( | |||
*/ | |||
void | |||
field_simultaneous_invert ( | |||
struct p448_t *__restrict__ out, | |||
const struct p448_t *in, | |||
struct field_t *__restrict__ out, | |||
const struct field_t *in, | |||
unsigned int n | |||
); | |||