]> git.codecow.com Git - nano25519.git/commitdiff
Eliminate redundant buffer clearing.
authorChris Duncan <chris@zoso.dev>
Sat, 15 Aug 2026 07:08:13 +0000 (00:08 -0700)
committerChris Duncan <chris@zoso.dev>
Sat, 15 Aug 2026 07:08:13 +0000 (00:08 -0700)
src/lib/nano25519.ts

index 288bd417b90de6c9046652a0059e0cfc92655ef1..e876fc81dfce874de0e6a74522d3d29ae3ba4553 100644 (file)
@@ -80,14 +80,12 @@ export const nano25519_init = (bytes: number[]): { derive: typeof derive, sign:
                        for (let i = 0; i < 32; i++) {
                                buffer.setUint8(inPtr + i, privateKey[i])
                        }
-                       privateKey.fill(0)
                        exports.derive()
                        const outPtr = exports.getOutputPointer()
                        buffer = new DataView(exports.memory.buffer)
                        for (let i = 0; i < 32; i++) {
                                out[i] = buffer.getUint8(outPtr + i)
                        }
-                       clear(buffer)
                        if (typeof pub === 'undefined') {
                                return
                        } else if (typeof prv === 'string') {
@@ -118,7 +116,6 @@ export const nano25519_init = (bytes: number[]): { derive: typeof derive, sign:
                        for (let i = 0; i < 64; i++) {
                                buffer.setUint8(inPtr + i, secretKey[i])
                        }
-                       secretKey.fill(0)
                        const message = normalize('message', 0, 32768, m)
                        let mPtr = exports.getMessagePointer()
                        for (let i = 0; i < message.byteLength; i++) {
@@ -130,7 +127,6 @@ export const nano25519_init = (bytes: number[]): { derive: typeof derive, sign:
                        for (let i = 0; i < 64; i++) {
                                s[i] = buffer.getUint8(outPtr + i)
                        }
-                       clear(buffer)
                        return typeof k === 'string'
                                ? [...s].map(b => b.toString(16).padStart(2, '0')).join('')
                                : s
@@ -141,29 +137,32 @@ export const nano25519_init = (bytes: number[]): { derive: typeof derive, sign:
        }
 
        function verify (s: unknown, m: unknown, k: unknown): boolean {
-               const signature = normalize('signature', 64, 64, s)
-               const message = normalize('message', 0, 32768, m)
-               const publicKey = normalize('public key', 32, 32, k)
                let buffer: DataView | undefined = new DataView(exports.memory.buffer)
-               let mPtr = exports.getMessagePointer()
-               let inPtr = exports.getInputPointer()
-               for (let i = 0; i < message.byteLength; i++) {
-                       buffer.setUint8(mPtr + i, message[i])
+               try {
+                       const signature = normalize('signature', 64, 64, s)
+                       const message = normalize('message', 0, 32768, m)
+                       const publicKey = normalize('public key', 32, 32, k)
+                       let mPtr = exports.getMessagePointer()
+                       let inPtr = exports.getInputPointer()
+                       for (let i = 0; i < message.byteLength; i++) {
+                               buffer.setUint8(mPtr + i, message[i])
+                       }
+                       for (let i = 0; i < 64; i++) {
+                               buffer.setUint8(inPtr + i, signature[i])
+                       }
+                       inPtr += 64
+                       for (let i = 0; i < 32; i++) {
+                               buffer.setUint8(inPtr + i, publicKey[i])
+                       }
+                       exports.verify(message.byteLength)
+                       const outPtr = exports.getOutputPointer()
+                       const v = new Uint8Array(1)
+                       buffer = new DataView(exports.memory.buffer)
+                       v[0] = buffer.getUint8(outPtr)
+                       return v[0] === 0
+               } finally {
+                       clear(buffer)
                }
-               for (let i = 0; i < 64; i++) {
-                       buffer.setUint8(inPtr + i, signature[i])
-               }
-               inPtr += 64
-               for (let i = 0; i < 32; i++) {
-                       buffer.setUint8(inPtr + i, publicKey[i])
-               }
-               exports.verify(message.byteLength)
-               const outPtr = exports.getOutputPointer()
-               const v = new Uint8Array(1)
-               buffer = new DataView(exports.memory.buffer)
-               v[0] = buffer.getUint8(outPtr)
-               clear(buffer)
-               return v[0] === 0
        }
 
        function clear (buffer: DataView): void {