const ge_scalarmult_base_tobytes_r: ge_p1p1 = new ge_p1p1()
const ge_scalarmult_base_tobytes_s: ge_p2 = new ge_p2()
const ge_scalarmult_base_tobytes_t: ge_precomp = new ge_precomp()
+const ge_scalarmult_base_tobytes_fe_scratch: FieldElement = fe()
/**
* `h = a * B` (with precomputation)
*
const r = ge_scalarmult_base_tobytes_r
const s = ge_scalarmult_base_tobytes_s
const t = ge_scalarmult_base_tobytes_t
+ const fe_scratch = ge_scalarmult_base_tobytes_fe_scratch
for (let i = 0; i < 32; ++i) {
e[(i << 1) + 0] = (a[i] >> 0) & 15
ge_p1p1_to_p3(h, r)
}
- ge_p3_dbl(r, h)
+ ge_p3_dbl(r, h, fe_scratch)
ge_p1p1_to_p2(s, r)
- ge_p2_dbl(r, s)
+ ge_p2_dbl(r, s, fe_scratch)
ge_p1p1_to_p2(s, r)
- ge_p2_dbl(r, s)
+ ge_p2_dbl(r, s, fe_scratch)
ge_p1p1_to_p2(s, r)
- ge_p2_dbl(r, s)
+ ge_p2_dbl(r, s, fe_scratch)
ge_p1p1_to_p3(h, r)
// base pointer offset = 4 bytes * 12 values * 3 fe * 8 ge = 1152 bytes
ge_p3_to_cached(Ai[0], A)
- ge_p3_dbl(t, A)
+ ge_p3_dbl(t, A, fe_scratch)
ge_p1p1_to_p3(A2, t)
ge_add_cached(t, A2, Ai[0], fe_scratch)
}
for (; i >= 0; --i) {
- ge_p2_dbl(t, p)
+ ge_p2_dbl(t, p, fe_scratch)
if (aslide[i] > 0) {
ge_p1p1_to_p3(u, t)
s[31] ^= fe_isnegative(x, fe_scratch_0) << 7
}
-const ge_p2_dbl_t: FieldElement = fe()
/**
* r = 2 * p
*/
-export function ge_p2_dbl (r: ge_p1p1, p: ge_p2): void {
- const t = ge_p2_dbl_t
+export function ge_p2_dbl (r: ge_p1p1, p: ge_p2, fe_scratch: FieldElement): void {
fe_sq(r.X, p.X)
fe_sq(r.Z, p.Y)
fe_sq2(r.T, p.Z)
fe_add(r.Y, p.X, p.Y)
- fe_sq(t, r.Y)
+ fe_sq(fe_scratch, r.Y)
fe_add(r.Y, r.Z, r.X)
fe_sub(r.Z, r.Z, r.X)
- fe_sub(r.X, t, r.Y)
+ fe_sub(r.X, fe_scratch, r.Y)
fe_sub(r.T, r.T, r.Z)
}
-const ge_p3_dbl_t: FieldElement = fe()
/**
* r = 2 * p
*/
-export function ge_p3_dbl (r: ge_p1p1, p: ge_p3): void {
- const t = ge_p3_dbl_t
+export function ge_p3_dbl (r: ge_p1p1, p: ge_p3, fe_scratch: FieldElement): void {
fe_sq(r.X, p.X)
fe_sq(r.Z, p.Y)
fe_sq2(r.T, p.Z)
fe_add(r.Y, p.X, p.Y)
- fe_sq(t, r.Y)
+ fe_sq(fe_scratch, r.Y)
fe_add(r.Y, r.Z, r.X)
fe_sub(r.Z, r.Z, r.X)
- fe_sub(r.X, t, r.Y)
+ fe_sub(r.X, fe_scratch, r.Y)
fe_sub(r.T, r.T, r.Z)
}