]> git.codecow.com Git - nano25519.git/commitdiff
Create wrapper for field element addition to start migrating templates.
authorChris Duncan <chris@codecow.com>
Wed, 30 Sep 2026 14:18:17 +0000 (07:18 -0700)
committerChris Duncan <chris@codecow.com>
Wed, 30 Sep 2026 14:18:17 +0000 (07:18 -0700)
scripts/fe.gen.mjs
src/assembly/ed25519/fe.ts

index 9dc9f06b98b5879e691d1228e0393acc8224feb6..358b52e93de0dcb20a78cff772cafa92ad082487 100644 (file)
@@ -82,6 +82,38 @@ export function fe_1 (h: FieldElement): void {
        store<i32>(changetype<usize>(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<usize>(h)
+       const f_ptr = changetype<usize>(f)
+       const g_ptr = changetype<usize>(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<u64>(h_ptr, h2, 0, 32)
+}
+
 /**
  * Conditionally copy values from one FieldElement to another.
  *
index 4a4bb8e609384d2197a90fd20daa01c76dfb0065..acb4b1add33b511d6d634b8b94d215ed78ddc0c1 100644 (file)
@@ -1,6 +1,5 @@
 //! SPDX-FileCopyrightText: 2026 Chris Duncan <chris@codecow.com>
 //! 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<usize>(h)
        const f_ptr = changetype<usize>(f)
        const g_ptr = changetype<usize>(g)
-       v128.store(h_ptr, v128.add<i32>(v128.load(f_ptr, 0), v128.load(g_ptr, 0)), 0)
-       v128.store(h_ptr, v128.add<i32>(v128.load(f_ptr, 16), v128.load(g_ptr, 16)), 16)
-       v128.store_lane<i64>(h_ptr, v128.add<i32>(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<i32>(f0, g0)
+       h1 = v128.add<i32>(f1, g1)
+       h2 = v128.add<i32>(f2, g2)
+
+       // store h
+       v128.store(h_ptr, h0, 0)
+       v128.store(h_ptr, h1, 16)
+       v128.store_lane<u64>(h_ptr, h2, 0, 32)
 }
 
 /**