blob: 117547bdfec523668d2682932beca180d2ed457b [file] [log] [blame]
// Generated from Bedrock code in Fiat Cryptography. Avoid editing directly.
static inline br_word_t br_broadcast_odd(br_word_t x) {
br_word_t y;
x = br_value_barrier(x&1);
y = 0u-x;
return y;
}
static inline void p256_coord_halve(br_word_t y, br_word_t x) {
br_word_t m, mmh;
uint8_t _br_stackalloc_mmh[32] = {0}; mmh = (br_word_t)&_br_stackalloc_mmh;
m = br_broadcast_odd(_br_load(x));
u256_set_p256_minushalf_conditional(mmh, m);
u256_shr(y, x, (br_word_t)1);
p256_coord_sub(y, y, mmh);
}
static inline br_word_t p256_point_iszero(br_word_t p_P) {
br_word_t z, nz;
nz = p256_coord_nonzero((p_P+32)+32);
z = ~nz;
return z;
}
static inline void p256_point_double(br_word_t out, br_word_t in1) {
br_word_t t2, tmp, A, D;
uint8_t _br_stackalloc_D[32] = {0}; D = (br_word_t)&_br_stackalloc_D;
uint8_t _br_stackalloc_A[32] = {0}; A = (br_word_t)&_br_stackalloc_A;
uint8_t _br_stackalloc_tmp[32] = {0}; tmp = (br_word_t)&_br_stackalloc_tmp;
p256_coord_add(D, in1+32, in1+32);
p256_coord_sqr(tmp, (in1+32)+32);
p256_coord_sqr(D, D);
p256_coord_mul((out+32)+32, (in1+32)+32, in1+32);
p256_coord_add((out+32)+32, (out+32)+32, (out+32)+32);
p256_coord_add(A, in1, tmp);
p256_coord_sub(tmp, in1, tmp);
uint8_t _br_stackalloc_t2[32] = {0}; t2 = (br_word_t)&_br_stackalloc_t2;
p256_coord_add(t2, tmp, tmp);
p256_coord_add(tmp, t2, tmp);
p256_coord_sqr(out+32, D);
p256_coord_mul(A, A, tmp);
p256_coord_mul(D, D, in1);
p256_coord_sqr(out, A);
p256_coord_add(tmp, D, D);
p256_coord_sub(out, out, tmp);
p256_coord_sub(D, D, out);
p256_coord_mul(D, D, A);
p256_coord_halve(out+32, out+32);
p256_coord_sub(out+32, D, out+32);
}
static inline br_word_t p256_point_add_nz_nz_neq(br_word_t p_out, br_word_t p_P, br_word_t p_Q) {
br_word_t z1z1, z2z2, u1, Hsqr, ok, different_x, different_y, u2, Hcub, s1, r, h, s2;
uint8_t _br_stackalloc_z1z1[32] = {0}; z1z1 = (br_word_t)&_br_stackalloc_z1z1;
uint8_t _br_stackalloc_z2z2[32] = {0}; z2z2 = (br_word_t)&_br_stackalloc_z2z2;
uint8_t _br_stackalloc_u1[32] = {0}; u1 = (br_word_t)&_br_stackalloc_u1;
uint8_t _br_stackalloc_u2[32] = {0}; u2 = (br_word_t)&_br_stackalloc_u2;
uint8_t _br_stackalloc_h[32] = {0}; h = (br_word_t)&_br_stackalloc_h;
uint8_t _br_stackalloc_s1[32] = {0}; s1 = (br_word_t)&_br_stackalloc_s1;
uint8_t _br_stackalloc_s2[32] = {0}; s2 = (br_word_t)&_br_stackalloc_s2;
uint8_t _br_stackalloc_r[32] = {0}; r = (br_word_t)&_br_stackalloc_r;
uint8_t _br_stackalloc_Hsqr[32] = {0}; Hsqr = (br_word_t)&_br_stackalloc_Hsqr;
uint8_t _br_stackalloc_Hcub[32] = {0}; Hcub = (br_word_t)&_br_stackalloc_Hcub;
p256_coord_sqr(z1z1, (p_P+32)+32);
p256_coord_mul(u2, p_Q, z1z1);
p256_coord_sqr(z2z2, (p_Q+32)+32);
p256_coord_mul(u1, p_P, z2z2);
p256_coord_sub(h, u2, u1);
p256_coord_mul(s2, (p_P+32)+32, z1z1);
p256_coord_mul((p_out+32)+32, h, (p_P+32)+32);
p256_coord_mul((p_out+32)+32, (p_out+32)+32, (p_Q+32)+32);
p256_coord_mul(s2, s2, p_Q+32);
p256_coord_mul(s1, (p_Q+32)+32, z2z2);
p256_coord_mul(s1, s1, p_P+32);
p256_coord_sub(r, s2, s1);
p256_coord_sqr(Hsqr, h);
p256_coord_sqr(p_out, r);
p256_coord_mul(Hcub, Hsqr, h);
p256_coord_mul(u2, u1, Hsqr);
different_x = p256_coord_nonzero(Hcub);
different_y = p256_coord_nonzero(p_out);
ok = br_value_barrier(different_x|different_y);
p256_coord_sub(p_out, p_out, Hcub);
p256_coord_sub(p_out, p_out, u2);
p256_coord_sub(p_out, p_out, u2);
p256_coord_sub(h, u2, p_out);
p256_coord_mul(s2, Hcub, s1);
p256_coord_mul(h, h, r);
p256_coord_sub(p_out+32, h, s2);
return ok;
}
static inline void p256_point_add_vartime_if_doubling(br_word_t p_out, br_word_t p_P, br_word_t p_Q) {
br_word_t p_tmp, zeroP, zeroQ, ok, p_sel;
zeroP = p256_point_iszero(p_P);
zeroQ = p256_point_iszero(p_Q);
uint8_t _br_stackalloc_p_tmp[96] = {0}; p_tmp = (br_word_t)&_br_stackalloc_p_tmp;
ok = p256_point_add_nz_nz_neq(p_tmp, p_P, p_Q);
ok = br_declassify((zeroP|zeroQ)|ok);
uint8_t _br_stackalloc_p_sel[96] = {0}; p_sel = (br_word_t)&_br_stackalloc_p_sel;
br_memset(p_sel, (br_word_t)0, (br_word_t)96);
br_memcxor(p_sel, p_tmp, (br_word_t)96, (~zeroP)&(~zeroQ));
br_memcxor(p_sel, p_P, (br_word_t)96, (~zeroP)&zeroQ);
br_memcxor(p_sel, p_Q, (br_word_t)96, zeroP&(~zeroQ));
if (ok) {
/*skip*/
} else {
p256_point_double(p_sel, p_P);
}
br_memcpy(p_out, p_sel, (br_word_t)96);
}