From bb9edd7bea600b9377ef9d02cab69c548e4a8f20 Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Sat, 29 Aug 2026 14:24:56 -0700 Subject: [PATCH] Return exit code from crypto_sign to allow buffer cleanup. --- src/assembly/crypto_sign.ts | 8 ++++---- src/assembly/index.ts | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/assembly/crypto_sign.ts b/src/assembly/crypto_sign.ts index 50f6b12..55e2a8a 100644 --- a/src/assembly/crypto_sign.ts +++ b/src/assembly/crypto_sign.ts @@ -39,16 +39,14 @@ const S = new StaticArray(64) * @param {StaticArray} prv 32-byte private key from input buffer * @param {StaticArray} pub 32-byte public key from input buffer */ -export function crypto_sign (RS: StaticArray, M: StaticArray, mlen: i32, prv: StaticArray, pub: StaticArray): void { +export function crypto_sign (RS: StaticArray, M: StaticArray, mlen: i32, prv: StaticArray, pub: StaticArray): i32 { // Derive `A` from private key and throw if it does not match public key crypto_derive(A, prv) let c = 0 for (let i = 0; i < KEY_BYTELENGTH; i++) { c |= A[i] ^ pub[i] } - if (c != 0) { - throw new Error('Invalid public key') - } + if (c != 0) return -1 // Hash private key to `h` blake2b.init().update(prv, KEY_BYTELENGTH).digest(h) @@ -88,4 +86,6 @@ export function crypto_sign (RS: StaticArray, M: StaticArray, mlen: i32, R.fill(0) memory.copy(changetype(RS) + 32, changetype(S), 32) S.fill(0) + + return 0 } diff --git a/src/assembly/index.ts b/src/assembly/index.ts index 8905fad..a277617 100644 --- a/src/assembly/index.ts +++ b/src/assembly/index.ts @@ -131,16 +131,16 @@ export function sign (mlen: i32): void { INPUT_PUB.fill(0) // Sign message from buffer, then clear local input - crypto_sign(sig, INPUT_MSG, mlen, prv, pub) + const result = crypto_sign(OUTPUT_SIGN, INPUT_MSG, mlen, prv, pub) prv.fill(0) pub.fill(0) INPUT_MSG.fill(0) - - // Copy local result to output buffer - memory.copy(changetype(OUTPUT_SIGN), changetype(sig), SIGNATURE_BYTELENGTH) - - // Clear local result - sig.fill(0) + + // Clear signature output buffer if signing failed + if (result != 0) { + OUTPUT_SIGN.fill(0) + throw new Error('Failed to sign, check keypair and message are valid') + } } /** -- 2.52.0