From 8dc6efca2009ff50b8f9aab07e38b88a12da8a2b Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Sat, 29 Aug 2026 01:53:51 -0700 Subject: [PATCH] Throw if memory grows instead of just rewrapping it. --- src/lib/derive.ts | 8 +++++--- src/lib/sign.ts | 8 +++++--- src/lib/verify.ts | 10 ++++++---- src/lib/wasm.ts | 3 ++- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/lib/derive.ts b/src/lib/derive.ts index 30f01ad..338f7cc 100644 --- a/src/lib/derive.ts +++ b/src/lib/derive.ts @@ -1,7 +1,7 @@ //! SPDX-FileCopyrightText: 2026 Chris Duncan //! 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 //! 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() } } diff --git a/src/lib/verify.ts b/src/lib/verify.ts index 2b2ae1e..f9124bf 100644 --- a/src/lib/verify.ts +++ b/src/lib/verify.ts @@ -1,7 +1,7 @@ //! SPDX-FileCopyrightText: 2026 Chris Duncan //! 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() } } diff --git a/src/lib/wasm.ts b/src/lib/wasm.ts index 6640700..61e332a 100644 --- a/src/lib/wasm.ts +++ b/src/lib/wasm.ts @@ -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) -- 2.52.0