]> git.codecow.com Git - nano25519.git/commitdiff
Throw if memory grows instead of just rewrapping it.
authorChris Duncan <chris@zoso.dev>
Sat, 29 Aug 2026 08:53:51 +0000 (01:53 -0700)
committerChris Duncan <chris@zoso.dev>
Sat, 29 Aug 2026 08:53:51 +0000 (01:53 -0700)
src/lib/derive.ts
src/lib/sign.ts
src/lib/verify.ts
src/lib/wasm.ts

index 30f01ad2fe605951325cdace7f58730ae7554f81..338f7cc053e2f4439d425b5079ee66b291377404 100644 (file)
@@ -1,7 +1,7 @@
 //! SPDX-FileCopyrightText: 2026 Chris Duncan <chris@codecow.com>
 //! SPDX-License-Identifier: GPL-3.0-or-later
 
-import { Mutex, Pointers, clear, constants, exports, isBytes, normalize } from './wasm'
+import { Mutex, Nano25519TypeError, Pointers, clearMemory, constants, exports, isBytes, normalize } from './wasm'
 
 const { KEY_BYTELENGTH, } = constants
 
@@ -18,7 +18,9 @@ export function derive (prv: unknown, out?: unknown): string | Uint8Array<ArrayB
                        buffer[Pointers.INPUT_PRV + i] = privateKey[i]
                }
                exports.derive()
-               buffer = new Uint8Array(exports.memory.buffer)
+               if (exports.memory.buffer !== buffer.buffer) {
+                       throw new Nano25519TypeError('WASM memory buffer detached')
+               }
                for (let i = 0; i < KEY_BYTELENGTH; i++) {
                        publicKey[i] = buffer[Pointers.OUTPUT_DERIVE + i]
                }
@@ -37,6 +39,6 @@ export function derive (prv: unknown, out?: unknown): string | Uint8Array<ArrayB
                }
        } finally {
                privateKey.fill(0)
-               clear(buffer)
+               clearMemory()
        }
 }
index fe505707b80e3938a328ab3e05a81f56236bc1c4..bd71a4ea6294268cab30ac14e9ef368f6ba646c4 100644 (file)
@@ -1,7 +1,7 @@
 //! SPDX-FileCopyrightText: 2026 Chris Duncan <chris@codecow.com>
 //! SPDX-License-Identifier: GPL-3.0-or-later
 
-import { Mutex, Pointers, clear, constants, exports, isBytes, normalize } from './wasm'
+import { Mutex, Nano25519TypeError, Pointers, clearMemory, constants, exports, isBytes, normalize } from './wasm'
 
 const { KEY_BYTELENGTH, MAX_MESSAGE_BYTELENGTH, SIGNATURE_BYTELENGTH, } = constants
 
@@ -26,7 +26,9 @@ export function sign (msg: unknown, prv: unknown, pub: unknown, out?: unknown):
                        buffer[Pointers.INPUT_PUB + i] = publicKey[i]
                }
                exports.sign(message.byteLength)
-               buffer = new Uint8Array(exports.memory.buffer)
+               if (exports.memory.buffer !== buffer.buffer) {
+                       throw new Nano25519TypeError('WASM memory buffer detached')
+               }
                for (let i = 0; i < SIGNATURE_BYTELENGTH; i++) {
                        signature[i] = buffer[Pointers.OUTPUT_SIGN + i]
                }
@@ -46,6 +48,6 @@ export function sign (msg: unknown, prv: unknown, pub: unknown, out?: unknown):
        } finally {
                privateKey.fill(0)
                publicKey.fill(0)
-               clear(buffer)
+               clearMemory()
        }
 }
index 2b2ae1ef085ab6c500df8ce180c54682af1a763d..f9124bf05fe20c3b9f4341b3aa75274dc80ed4f8 100644 (file)
@@ -1,7 +1,7 @@
 //! SPDX-FileCopyrightText: 2026 Chris Duncan <chris@codecow.com>
 //! SPDX-License-Identifier: GPL-3.0-or-later
 
-import { Mutex, Pointers, clear, constants, exports, normalize, } from './wasm'
+import { Mutex, Nano25519TypeError, Pointers, clearMemory, constants, exports, normalize, } from './wasm'
 
 const { BLOCKHASH_BYTELENGTH, KEY_BYTELENGTH, MAX_MESSAGE_BYTELENGTH, MAX_VERIFY_BLOCKS, SIGNATURE_BYTELENGTH, } = constants
 
@@ -26,7 +26,7 @@ export function verify (sig: unknown, msg: unknown, pub: unknown): boolean {
                const verified = buffer[Pointers.OUTPUT_VERIFY]
                return verified === 0
        } finally {
-               clear(buffer)
+               clearMemory()
        }
 }
 
@@ -70,12 +70,14 @@ export function verify_blocks (pub: unknown, data: unknown): boolean[] {
                        p += BLOCKHASH_BYTELENGTH
                }
                exports.verify_blocks(count)
-               buffer = new Uint8Array(exports.memory.buffer)
+               if (exports.memory.buffer !== buffer.buffer) {
+                       throw new Nano25519TypeError('WASM memory buffer detached')
+               }
                for (let i = 0; i < count; i++) {
                        verified[i] = buffer[Pointers.OUTPUT_VERIFY + i]
                }
                return [...verified].map(v => v === 0)
        } finally {
-               clear(buffer)
+               clearMemory()
        }
 }
index 664070027b68ac1a1f359f600fbffa8f43e59206..61e332aa2747e037e718714610acdc1ca23bf466 100644 (file)
@@ -103,7 +103,8 @@ export class Pointers {
        static get OUTPUT_VERIFY (): number { return this.#get(OUTPUT_VERIFY) }
 }
 
-export function clear (memory: Uint8Array): void {
+export function clearMemory (): void {
+       const memory = new Uint8Array(exports.memory.buffer)
        memory.fill(0, INPUT_MSG, INPUT_MSG + MAX_MESSAGE_BYTELENGTH)
        memory.fill(0, INPUT_PRV, INPUT_PRV + KEY_BYTELENGTH)
        memory.fill(0, INPUT_PUB, INPUT_PUB + KEY_BYTELENGTH)