]> git.codecow.com Git - libnemo.git/commitdiff
Use set to copy buffer values more efficiently than setting up many for loops. Remove...
authorChris Duncan <chris@zoso.dev>
Sun, 3 Aug 2025 07:22:34 +0000 (00:22 -0700)
committerChris Duncan <chris@zoso.dev>
Sun, 3 Aug 2025 07:22:34 +0000 (00:22 -0700)
src/lib/nano-nacl.ts

index 09f0be1e8d46141633c906bb13418bf0422f7de8..51efcb4e618d50ae1e8b791d0467dc52e38143cf 100644 (file)
@@ -78,9 +78,7 @@ export class NanoNaCl {
                let b: number\r
                const m: Float64Array = this.gf()\r
                const t: Float64Array = this.gf()\r
-               for (let i = 0; i < 16; i++) {\r
-                       t[i] = n[i]\r
-               }\r
+               t.set(n.slice(0, 16), 0)\r
                this.car25519(t)\r
                this.car25519(t)\r
                this.car25519(t)\r
@@ -135,7 +133,8 @@ export class NanoNaCl {
        }\r
 \r
        static M (o: Float64Array, a: Float64Array, b: Float64Array): void {\r
-               let v, c, s = 1 << 16, t = new Array(31)\r
+               let v, c, s = 1 << 16\r
+               const t = new Array(31)\r
                t.fill(0)\r
 \r
                // init t values\r
@@ -169,9 +168,7 @@ export class NanoNaCl {
                t[0] += 38 * (c - 1)\r
 \r
                // assign result to output\r
-               for (let i = 0; i < 16; i++) {\r
-                       o[i] = t[i]\r
-               }\r
+               o.set(t.slice(0, 16), 0)\r
        }\r
 \r
        static S (o: Float64Array, a: Float64Array): void {\r
@@ -180,39 +177,26 @@ export class NanoNaCl {
 \r
        static inv25519 (o: Float64Array, i: Float64Array): void {\r
                const c: Float64Array = new Float64Array(16)\r
-               for (let a = 0; a < 16; a++) {\r
-                       c[a] = i[a]\r
-               }\r
+               c.set(i.slice(0, 16), 0)\r
                for (let a = 253; a >= 0; a--) {\r
                        this.S(c, c)\r
-                       if (a !== 2 && a !== 4) this.M(c, c, i)\r
-               }\r
-               for (let a = 0; a < 16; a++) {\r
-                       o[a] = c[a]\r
+                       if (a !== 2 && a !== 4) {\r
+                               this.M(c, c, i)\r
+                       }\r
                }\r
+               o.set(c, 0)\r
        }\r
 \r
        static pow2523 (o: Float64Array, i: Float64Array): void {\r
                const c: Float64Array = this.gf()\r
-               for (let a = 0; a < 16; a++) {\r
-                       c[a] = i[a]\r
-               }\r
+               c.set(i.slice(0, 16), 0)\r
                for (let a = 250; a >= 0; a--) {\r
                        this.S(c, c)\r
-                       if (a !== 1) this.M(c, c, i)\r
-               }\r
-               for (let a = 0; a < 16; a++) {\r
-                       o[a] = c[a]\r
-               }\r
-       }\r
-\r
-       // Note: difference from TweetNaCl - BLAKE2b used to hash instead of SHA-512.\r
-       static crypto_hash (out: Uint8Array, m: Uint8Array): number {\r
-               const hash = new Blake2b(64).update(m).digest()\r
-               for (let i = 0; i < 64; ++i) {\r
-                       out[i] = hash[i]\r
+                       if (a !== 1) {\r
+                               this.M(c, c, i)\r
+                       }\r
                }\r
-               return 0\r
+               o.set(c, 0)\r
        }\r
 \r
        static add (p: Float64Array[], q: Float64Array[]): void {\r
@@ -323,18 +307,13 @@ export class NanoNaCl {
 \r
        static reduce (r: Uint8Array): void {\r
                let x = new Float64Array(64)\r
-               for (let i = 0; i < 64; i++) {\r
-                       x[i] = r[i]\r
-               }\r
-               for (let i = 0; i < 64; i++) {\r
-                       r[i] = 0\r
-               }\r
+               x.set(r.slice(0, 64), 0)\r
+               r.fill(0, 0, 64)\r
                this.modL(r, x)\r
        }\r
 \r
        // Note: difference from C - smlen returned, not passed as argument.\r
        static crypto_sign (sm: Uint8Array, m: Uint8Array, n: number, sk: Uint8Array, pk: Uint8Array): number {\r
-               const x = new Float64Array(64)\r
                const p: Float64Array[] = [this.gf(), this.gf(), this.gf(), this.gf()]\r
 \r
                const d = new Blake2b(64).update(sk).digest()\r
@@ -343,30 +322,20 @@ export class NanoNaCl {
                d[31] |= 64\r
 \r
                const smlen = n + 64\r
-               for (let i = 0; i < n; i++) {\r
-                       sm[64 + i] = m[i]\r
-               }\r
-               for (let i = 0; i < 32; i++) {\r
-                       sm[32 + i] = d[32 + i]\r
-               }\r
+               sm.set(m.subarray(0, n), 64)\r
+               sm.set(d.subarray(32, 64), 32)\r
 \r
                const r = new Blake2b(64).update(sm.subarray(32)).digest()\r
                this.reduce(r)\r
                this.scalarbase(p, r)\r
                this.pack(sm, p)\r
 \r
-               for (let i = 0; i < 32; i++) {\r
-                       sm[i + 32] = pk[i]\r
-               }\r
+               sm.set(pk, 32)\r
                const h = new Blake2b(64).update(sm).digest()\r
                this.reduce(h)\r
 \r
-               for (let i = 0; i < 64; i++) {\r
-                       x[i] = 0\r
-               }\r
-               for (let i = 0; i < 32; i++) {\r
-                       x[i] = r[i]\r
-               }\r
+               const x = new Float64Array(64)\r
+               x.set(r.subarray(0, 32))\r
                for (let i = 0; i < 32; i++) {\r
                        for (let j = 0; j < 32; j++) {\r
                                x[i + j] += h[i] * d[j]\r
@@ -428,12 +397,8 @@ export class NanoNaCl {
 \r
                if (this.unpackneg(q, pk)) return -1\r
 \r
-               for (let i = 0; i < n; i++) {\r
-                       m[i] = sm[i]\r
-               }\r
-               for (let i = 0; i < 32; i++) {\r
-                       m[i + 32] = pk[i]\r
-               }\r
+               m.set(sm.slice(0, n), 0)\r
+               m.set(pk.slice(0, 32), 32)\r
                const h = new Blake2b(64).update(m).digest()\r
                this.reduce(h)\r
                this.scalarmult(p, q, h)\r
@@ -444,15 +409,10 @@ export class NanoNaCl {
 \r
                n -= 64\r
                if (this.crypto_verify_32(sm, 0, t, 0)) {\r
-                       for (let i = 0; i < n; i++) {\r
-                               m[i] = 0\r
-                       }\r
+                       m.fill(0, 0, n)\r
                        return -1\r
                }\r
-\r
-               for (let i = 0; i < n; i++) {\r
-                       m[i] = sm[i + 64]\r
-               }\r
+               m.set(sm.slice(64, n + 64), 0)\r
                return n\r
        }\r
 \r
@@ -611,12 +571,8 @@ export class NanoNaCl {
                        }\r
                        const sm = new Uint8Array(this.crypto_sign_BYTES + msg.length)\r
                        const m = new Uint8Array(this.crypto_sign_BYTES + msg.length)\r
-                       for (let i = 0; i < this.crypto_sign_BYTES; i++) {\r
-                               sm[i] = sig[i]\r
-                       }\r
-                       for (let i = 0; i < msg.length; i++) {\r
-                               sm[i + this.crypto_sign_BYTES] = msg[i]\r
-                       }\r
+                       sm.set(sig, 0)\r
+                       sm.set(msg, this.crypto_sign_BYTES)\r
                        return (this.crypto_sign_open(m, sm, sm.length, pub) >= 0)\r
                } catch (err) {\r
                        throw new Error('Failed to sign and return signature', { cause: err })\r