From d287fc6534e8f15fc1531c424fc87ee511caac9d Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Sun, 27 Sep 2026 21:17:08 -0700 Subject: [PATCH] Inline some base point conditional move ops. --- src/assembly/ed25519/ge.ts | 30 +++++++++++------------------- src/assembly/ed25519/utils.ts | 7 ------- 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/src/assembly/ed25519/ge.ts b/src/assembly/ed25519/ge.ts index 7b98823..dbc93fe 100644 --- a/src/assembly/ed25519/ge.ts +++ b/src/assembly/ed25519/ge.ts @@ -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([ -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(t.yplusx), u, b) - fe_memcmov(changetype(t.yminusx), u + 48, b) - fe_memcmov(changetype(t.xy2d), u + 96, b) -} - /** Scratch array equivalent to a `ge_precomp`: 3x 12-limb FieldElements */ const minust = new StaticArray(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(t.yplusx), bp, equal(babs, i)) + fe_memcmov(changetype(t.yminusx), bp + 48, equal(babs, i)) + fe_memcmov(changetype(t.xy2d), bp + 96, equal(babs, i)) + } fe_memcopy(changetype(minust), changetype(t.yminusx)) fe_memcopy(changetype(minust) + 48, changetype(t.yplusx)) fe_memneg(changetype(minust) + 96, changetype(t.xy2d)) - ge_cmov(t, changetype(minust), bnegative) + fe_memcmov(changetype(t.yplusx), changetype(minust), bnegative) + fe_memcmov(changetype(t.yminusx), changetype(minust) + 48, bnegative) + fe_memcmov(changetype(t.xy2d), changetype(minust) + 96, bnegative) + minust.fill(0) } diff --git a/src/assembly/ed25519/utils.ts b/src/assembly/ed25519/utils.ts index 16ff44f..29c06eb 100644 --- a/src/assembly/ed25519/utils.ts +++ b/src/assembly/ed25519/utils.ts @@ -59,13 +59,6 @@ export function load_4 (input: StaticArray, 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, nlen: i32): u8 { -- 2.52.0