]> git.codecow.com Git - nano25519.git/commitdiff
Move mutex lock out of try block so it does not clear buffers from underneath the...
authorChris Duncan <chris@zoso.dev>
Sat, 29 Aug 2026 09:17:20 +0000 (02:17 -0700)
committerChris Duncan <chris@zoso.dev>
Sat, 29 Aug 2026 09:17:20 +0000 (02:17 -0700)
src/lib/derive.ts
src/lib/sign.ts
src/lib/verify.ts

index 338f7cc053e2f4439d425b5079ee66b291377404..ae9f83409ecfd87a18bb8fd95504e6029ecc5155 100644 (file)
@@ -12,8 +12,8 @@ export function derive (prv: unknown, out?: unknown): string | Uint8Array<ArrayB
        const privateKey = normalize('private key', KEY_BYTELENGTH, KEY_BYTELENGTH, prv)
        const publicKey = new Uint8Array(KEY_BYTELENGTH)
        let buffer = new Uint8Array(exports.memory.buffer)
+       Mutex.lock()
        try {
-               Mutex.lock()
                for (let i = 0; i < KEY_BYTELENGTH; i++) {
                        buffer[Pointers.INPUT_PRV + i] = privateKey[i]
                }
index bd71a4ea6294268cab30ac14e9ef368f6ba646c4..a7aafc423ab6d37cfb2b0b81a0a02cd466ab0853 100644 (file)
@@ -14,8 +14,8 @@ export function sign (msg: unknown, prv: unknown, pub: unknown, out?: unknown):
        const publicKey = normalize('public key', KEY_BYTELENGTH, KEY_BYTELENGTH, pub)
        const signature = new Uint8Array(SIGNATURE_BYTELENGTH)
        let buffer = new Uint8Array(exports.memory.buffer)
+       Mutex.lock()
        try {
-               Mutex.lock()
                for (let i = 0; i < message.byteLength; i++) {
                        buffer[Pointers.INPUT_MSG + i] = message[i]
                }
index f9124bf05fe20c3b9f4341b3aa75274dc80ed4f8..c001ea7b847be7888d7f243acb5fd21f08754af6 100644 (file)
@@ -7,8 +7,8 @@ const { BLOCKHASH_BYTELENGTH, KEY_BYTELENGTH, MAX_MESSAGE_BYTELENGTH, MAX_VERIFY
 
 export function verify (sig: unknown, msg: unknown, pub: unknown): boolean {
        let buffer = new Uint8Array(exports.memory.buffer)
+       Mutex.lock()
        try {
-               Mutex.lock()
                const message = normalize('message', 0, MAX_MESSAGE_BYTELENGTH, msg)
                const publicKey = normalize('public key', KEY_BYTELENGTH, KEY_BYTELENGTH, pub)
                const signature = normalize('signature', SIGNATURE_BYTELENGTH, SIGNATURE_BYTELENGTH, sig)
@@ -22,7 +22,9 @@ export function verify (sig: unknown, msg: unknown, pub: unknown): boolean {
                        buffer[Pointers.INPUT_SIG + i] = signature[i]
                }
                exports.verify(message.byteLength)
-               buffer = new Uint8Array(exports.memory.buffer)
+               if (exports.memory.buffer !== buffer.buffer) {
+                       throw new Nano25519TypeError('WASM memory buffer detached')
+               }
                const verified = buffer[Pointers.OUTPUT_VERIFY]
                return verified === 0
        } finally {
@@ -41,8 +43,8 @@ export function verify_blocks (pub: unknown, data: unknown): boolean[] {
        }
        const verified = new Uint8Array(count)
        let buffer = new Uint8Array(exports.memory.buffer)
+       Mutex.lock()
        try {
-               Mutex.lock()
                const publicKey = normalize('public key', KEY_BYTELENGTH, KEY_BYTELENGTH, pub)
                for (let i = 0; i < KEY_BYTELENGTH; i++) {
                        buffer[Pointers.INPUT_PUB + i] = publicKey[i]