//! 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
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]
}
}
} finally {
privateKey.fill(0)
- clear(buffer)
+ clearMemory()
}
}
//! 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
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]
}
} finally {
privateKey.fill(0)
publicKey.fill(0)
- clear(buffer)
+ clearMemory()
}
}
//! 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
const verified = buffer[Pointers.OUTPUT_VERIFY]
return verified === 0
} finally {
- clear(buffer)
+ clearMemory()
}
}
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()
}
}
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)