From 8c0f97b8e842578c000470f4a5190d3b9e121e34 Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Mon, 17 Aug 2026 08:46:03 -0700 Subject: [PATCH] Change WASM buffer view to Uint8Array since we don't need endianness features of DataView. Reduce input buffer size to maximum needed and minimum required for verify() signature and public key. --- src/lib/nano25519.ts | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/lib/nano25519.ts b/src/lib/nano25519.ts index 4476bb9..f2f7324 100644 --- a/src/lib/nano25519.ts +++ b/src/lib/nano25519.ts @@ -72,18 +72,18 @@ export const nano25519_init = (bytes: number[]): { derive: typeof derive, sign: } const privateKey = new Uint8Array(32) const publicKey = new Uint8Array(32) - let buffer = new DataView(exports.memory.buffer) + let buffer = new Uint8Array(exports.memory.buffer) try { privateKey.set(normalize('private key', 32, 32, k)) let inPtr = exports.getInputPointer() for (let i = 0; i < 32; i++) { - buffer.setUint8(inPtr + i, privateKey[i]) + buffer[inPtr + i] = privateKey[i] } exports.derive() const outPtr = exports.getOutputPointer() - buffer = new DataView(exports.memory.buffer) + buffer = new Uint8Array(exports.memory.buffer) for (let i = 0; i < 32; i++) { - publicKey[i] = buffer.getUint8(outPtr + i) + publicKey[i] = buffer[outPtr + i] } if (typeof k === 'string') { let hex = '' @@ -110,23 +110,23 @@ export const nano25519_init = (bytes: number[]): { derive: typeof derive, sign: } const secretKey = new Uint8Array(64) const signature = new Uint8Array(64) - let buffer: DataView | undefined = new DataView(exports.memory.buffer) + let buffer = new Uint8Array(exports.memory.buffer) try { secretKey.set(normalize('secret key', 64, 64, k)) let inPtr = exports.getInputPointer() for (let i = 0; i < 64; i++) { - buffer.setUint8(inPtr + i, secretKey[i]) + buffer[inPtr + i] = secretKey[i] } const message = normalize('message', 0, 32768, m) let mPtr = exports.getMessagePointer() for (let i = 0; i < message.byteLength; i++) { - buffer.setUint8(mPtr + i, message[i]) + buffer[mPtr + i] = message[i] } exports.sign(message.byteLength) const outPtr = exports.getOutputPointer() - buffer = new DataView(exports.memory.buffer) + buffer = new Uint8Array(exports.memory.buffer) for (let i = 0; i < 64; i++) { - signature[i] = buffer.getUint8(outPtr + i) + signature[i] = buffer[outPtr + i] } if (typeof k === 'string') { let hex = '' @@ -148,7 +148,7 @@ export const nano25519_init = (bytes: number[]): { derive: typeof derive, sign: } function verify (s: unknown, m: unknown, k: unknown): boolean { - let buffer: DataView | undefined = new DataView(exports.memory.buffer) + let buffer = new Uint8Array(exports.memory.buffer) try { const signature = normalize('signature', 64, 64, s) const message = normalize('message', 0, 32768, m) @@ -156,14 +156,14 @@ export const nano25519_init = (bytes: number[]): { derive: typeof derive, sign: let mPtr = exports.getMessagePointer() let inPtr = exports.getInputPointer() for (let i = 0; i < message.byteLength; i++) { - buffer.setUint8(mPtr + i, message[i]) + buffer[mPtr + i] = message[i] } for (let i = 0; i < 64; i++) { - buffer.setUint8(inPtr + i, signature[i]) + buffer[inPtr + i] = signature[i] } inPtr += 64 for (let i = 0; i < 32; i++) { - buffer.setUint8(inPtr + i, publicKey[i]) + buffer[inPtr + i] = publicKey[i] } const v = exports.verify(message.byteLength) return v === 0 @@ -172,13 +172,11 @@ export const nano25519_init = (bytes: number[]): { derive: typeof derive, sign: } } - function clear (buffer: DataView): void { + function clear (buffer: Uint8Array): void { let inPtr = exports.getInputPointer() let outPtr = exports.getOutputPointer() - for (let i = 0; i < 64; i++) { - buffer.setUint16(inPtr + (i << 1), 0) - buffer.setUint8(outPtr + i, 0) - } + buffer.fill(0, inPtr, inPtr + 96) + buffer.fill(0, outPtr, outPtr + 64) } function isBytes (a: unknown): a is Uint8Array { -- 2.52.0