fe_mul(out, t1, t0)
}
-const fe_isnegative_t = fe()
/**
* return 1 if f is in {1,3,5,...,q-2}
* return 0 if f is in {0,2,4,...,q-1}
* Preconditions:
* |f| bounded by 1.1x2²⁶,1.1x2²⁵,1.1x2²⁶,1.1x2²⁵,etc.
*/
-export function fe_isnegative (f: FieldElement): u8 {
- const t = fe_isnegative_t
+export function fe_isnegative (f: FieldElement, t: FieldElement): u8 {
fe_reduce(t, f)
- return load<u8>(changetype<usize>(t), 0) & 1
+ return u8(t[0] & 1)
}
const fe_iszero_s = new StaticArray<u8>(32)
v128.store_lane<u64>(td, v128.bitselect(v128.neg<i32>(d2), d2, n), 0, 32)
}
+const t: FieldElement = fe()
const u: FieldElement = fe()
const v: FieldElement = fe()
const v3: FieldElement = fe()
fe_mul(h.X, h.X, fe_sqrtm1)
}
- if (fe_isnegative(h.X) == (s[31] >> 7)) {
+ if (fe_isnegative(h.X, t) == (s[31] >> 7)) {
fe_neg(h.X, h.X)
}
fe_mul(h.T, h.X, h.Y)
return 0
}
+const ge_frombytes_t: FieldElement = fe()
const ge_frombytes_u: FieldElement = fe()
const ge_frombytes_v: FieldElement = fe()
const ge_frombytes_vxx: FieldElement = fe()
* @returns {i32} 0 if `s` decodes to a valid point, else -1
*/
export function ge_frombytes (h: ge_p3, s: StaticArray<u8>): i32 {
+ const t = ge_frombytes_t
const u = ge_frombytes_u
const v = ge_frombytes_v
const vxx = ge_frombytes_vxx
fe_cmov(h.X, x_sqrtm1, 1 - has_m_root)
fe_neg(negx, h.X)
- fe_cmov(h.X, negx, fe_isnegative(h.X) ^ (s[31] >> 7))
+ fe_cmov(h.X, negx, fe_isnegative(h.X, t) ^ (s[31] >> 7))
fe_mul(h.T, h.X, h.Y)
return i32(has_m_root | has_p_root) - 1