]> git.codecow.com Git - nano25519.git/commitdiff
Move remaining p scratch buffers except for tobytes.
authorChris Duncan <chris@zoso.dev>
Fri, 2 Oct 2026 09:57:51 +0000 (02:57 -0700)
committerChris Duncan <chris@zoso.dev>
Fri, 2 Oct 2026 09:57:51 +0000 (02:57 -0700)
src/assembly/ed25519/ge.ts
src/assembly/ed25519/p.ts

index bb3cd19ec2389581e49e113209d367e2eee6975e..cfd0df13d972db25515bed171f03ae585d53980c 100644 (file)
@@ -264,6 +264,7 @@ const ge_scalarmult_base_tobytes_e: StaticArray<i8> = new StaticArray<i8>(64)
 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)
  *
@@ -287,6 +288,7 @@ export function ge_scalarmult_base_tobytes (S: StaticArray<u8>, a: StaticArray<u
        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
@@ -314,13 +316,13 @@ export function ge_scalarmult_base_tobytes (S: StaticArray<u8>, a: StaticArray<u
                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
@@ -381,7 +383,7 @@ export function ge_double_scalarmult_vartime_to_p3 (r: ge_p3, a: StaticArray<u8>
 
        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)
@@ -421,7 +423,7 @@ export function ge_double_scalarmult_vartime_to_p3 (r: ge_p3, a: StaticArray<u8>
        }
 
        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)
index 6cb144e3097e4b00b7b73d810f3b0faa6fee15f8..c9d9f6c1f5081939d4cef354c8ae31e9c50845a8 100644 (file)
@@ -127,37 +127,33 @@ export function ge_p3_tobytes (s: StaticArray<u8>, h: ge_p3): void {
        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)
 }