From: Chris Duncan Date: Wed, 30 Sep 2026 14:18:17 +0000 (-0700) Subject: Create wrapper for field element addition to start migrating templates. X-Git-Url: https://git.codecow.com/?a=commitdiff_plain;h=cb3fe0d873783a9898b2ea198e56d106083cfa3c;p=nano25519.git Create wrapper for field element addition to start migrating templates. --- diff --git a/scripts/fe.gen.mjs b/scripts/fe.gen.mjs index 9dc9f06..358b52e 100644 --- a/scripts/fe.gen.mjs +++ b/scripts/fe.gen.mjs @@ -82,6 +82,38 @@ export function fe_1 (h: FieldElement): void { store(changetype(h), 1, 0) } +/** + * Add two FieldElements and store the sum. + * + * @param h FieldElement sum destination + * @param f FieldElement summand source + * @param g FieldElement summand source + */ +//@ts-expect-error +@inline +export function fe_add (h: FieldElement, f: FieldElement, g: FieldElement): void { + const h_ptr = changetype(h) + const f_ptr = changetype(f) + const g_ptr = changetype(g) + + let h0: v128, h1: v128, h2: v128 + + let f0 = v128.load(f_ptr, 0) + let f1 = v128.load(f_ptr, 16) + let f2 = v128.load(f_ptr, 32) + + let g0 = v128.load(g_ptr, 0) + let g1 = v128.load(g_ptr, 16) + let g2 = v128.load(g_ptr, 32) + + ${fe_add('h', 'f', 'g')} + + // store h + v128.store(h_ptr, h0, 0) + v128.store(h_ptr, h1, 16) + v128.store_lane(h_ptr, h2, 0, 32) +} + /** * Conditionally copy values from one FieldElement to another. * diff --git a/src/assembly/ed25519/fe.ts b/src/assembly/ed25519/fe.ts index 4a4bb8e..acb4b1a 100644 --- a/src/assembly/ed25519/fe.ts +++ b/src/assembly/ed25519/fe.ts @@ -1,6 +1,5 @@ //! SPDX-FileCopyrightText: 2026 Chris Duncan //! SPDX-License-Identifier: GPL-3.0-or-later - /** * Arithmetic on field elements. These are integers in the range * @@ -14,6 +13,7 @@ * * `n = 2⁰a[0] + 2²⁶a[1] + 2⁷⁷a[2] ... + 2²³⁰a[9]` */ + import { load_3, load_4, sodium_is_zero } from './utils' /** @@ -68,9 +68,25 @@ export function fe_add (h: FieldElement, f: FieldElement, g: FieldElement): void const h_ptr = changetype(h) const f_ptr = changetype(f) const g_ptr = changetype(g) - v128.store(h_ptr, v128.add(v128.load(f_ptr, 0), v128.load(g_ptr, 0)), 0) - v128.store(h_ptr, v128.add(v128.load(f_ptr, 16), v128.load(g_ptr, 16)), 16) - v128.store_lane(h_ptr, v128.add(v128.load(f_ptr, 32), v128.load(g_ptr, 32)), 0, 32) + + let h0: v128, h1: v128, h2: v128 + + let f0 = v128.load(f_ptr, 0) + let f1 = v128.load(f_ptr, 16) + let f2 = v128.load(f_ptr, 32) + + let g0 = v128.load(g_ptr, 0) + let g1 = v128.load(g_ptr, 16) + let g2 = v128.load(g_ptr, 32) + + h0 = v128.add(f0, g0) + h1 = v128.add(f1, g1) + h2 = v128.add(f2, g2) + + // store h + v128.store(h_ptr, h0, 0) + v128.store(h_ptr, h1, 16) + v128.store_lane(h_ptr, h2, 0, 32) } /**