]> git.codecow.com Git - nano25519.git/commitdiff
Inline some base point conditional move ops.
authorChris Duncan <chris@zoso.dev>
Mon, 28 Sep 2026 04:17:08 +0000 (21:17 -0700)
committerChris Duncan <chris@zoso.dev>
Mon, 28 Sep 2026 04:17:08 +0000 (21:17 -0700)
src/assembly/ed25519/ge.ts
src/assembly/ed25519/utils.ts

index 7b9882332496e0b4cfee8206c36a5e5b7256536b..dbc93fe76b8cd6a9f9e6426b52ab2ecbeb566628 100644 (file)
@@ -20,7 +20,7 @@ import { base } from './base'
 import { base2 } from './base2'
 import { FieldElement, fe, fe_1, fe_add, fe_cmov, fe_frombytes, fe_isnegative, fe_iszero, fe_memcmov, fe_memcopy, fe_memneg, fe_mul, fe_neg, fe_pow22523, fe_sq, fe_sub } from './fe'
 import { ge_add_cached, ge_add_precomp, ge_cached, ge_p1p1, ge_p1p1_0, ge_p1p1_to_p2, ge_p1p1_to_p3, ge_p2, ge_p2_0, ge_p2_dbl, ge_p2_to_p3, ge_p3, ge_p3_0, ge_p3_dbl, ge_p3_to_cached, ge_p3_tobytes, ge_precomp, ge_precomp_0, ge_sub_cached, ge_sub_precomp } from './p'
-import { equal, negative } from './utils'
+import { equal } from './utils'
 
 /**
  * √-1
@@ -37,39 +37,31 @@ const ed25519_d: FieldElement = StaticArray.fromArray<i32>([
        -10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116, 0, 0
 ])
 
-//@ts-expect-error
-@inline
-function ge_cmov (t: ge_precomp, u: usize, b: u8): void {
-       fe_memcmov(changetype<usize>(t.yplusx), u, b)
-       fe_memcmov(changetype<usize>(t.yminusx), u + 48, b)
-       fe_memcmov(changetype<usize>(t.xy2d), u + 96, b)
-}
-
 /** Scratch array equivalent to a `ge_precomp`: 3x 12-limb FieldElements */
 const minust = new StaticArray<i32>(36)
 //@ts-expect-error
 @inline
 function ge_cmov8_base (t: ge_precomp, bp: usize, b: i8): void {
-       const bnegative: u8 = negative(b)
+       const bnegative: u8 = u8(b) >> 7 /* b == 0..127: positive; b == 128..255: negative */
        const babs: u8 = b - (((-bnegative) & b) * (i8(1) << 1))
 
        ge_precomp_0(t)
 
        // base pointer offset += 144n = (4 bytes * 12 values * 3 fields) * n
-       ge_cmov(t, bp, equal(babs, 1))
-       ge_cmov(t, bp += 144, equal(babs, 2))
-       ge_cmov(t, bp += 144, equal(babs, 3))
-       ge_cmov(t, bp += 144, equal(babs, 4))
-       ge_cmov(t, bp += 144, equal(babs, 5))
-       ge_cmov(t, bp += 144, equal(babs, 6))
-       ge_cmov(t, bp += 144, equal(babs, 7))
-       ge_cmov(t, bp += 144, equal(babs, 8))
+       for (let i: i8 = 1; i < 9; i++, bp += 144) {
+               fe_memcmov(changetype<usize>(t.yplusx), bp, equal(babs, i))
+               fe_memcmov(changetype<usize>(t.yminusx), bp + 48, equal(babs, i))
+               fe_memcmov(changetype<usize>(t.xy2d), bp + 96, equal(babs, i))
+       }
 
        fe_memcopy(changetype<usize>(minust), changetype<usize>(t.yminusx))
        fe_memcopy(changetype<usize>(minust) + 48, changetype<usize>(t.yplusx))
        fe_memneg(changetype<usize>(minust) + 96, changetype<usize>(t.xy2d))
 
-       ge_cmov(t, changetype<usize>(minust), bnegative)
+       fe_memcmov(changetype<usize>(t.yplusx), changetype<usize>(minust), bnegative)
+       fe_memcmov(changetype<usize>(t.yminusx), changetype<usize>(minust) + 48, bnegative)
+       fe_memcmov(changetype<usize>(t.xy2d), changetype<usize>(minust) + 96, bnegative)
+
        minust.fill(0)
 }
 
index 16ff44f93388586a3ddf91b8c053970a661ee832..29c06eb1113a392ceab2e5dc91f2cf828ef60813 100644 (file)
@@ -59,13 +59,6 @@ export function load_4 (input: StaticArray<u8>, i: u8): u64 {
        return result
 }
 
-//@ts-expect-error
-@inline
-export function negative (b: i8): u8 {
-       const x: u8 = u8(b) /* 0..127: no 128..255: yes */
-       return x >> 7 /* 1: yes; 0: no */
-}
-
 //@ts-expect-error
 @inline
 export function sodium_is_zero (n: StaticArray<u8>, nlen: i32): u8 {