From e254cd0b368d72bd8a5beb71b5d5533a5020c452 Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Wed, 25 Feb 2026 15:16:19 -0800 Subject: [PATCH] Add check for canonical scalar S from signature. --- assembly/nano-nacl.ts | 24 +++++++++++++++++++++--- index.html | 9 ++++++++- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/assembly/nano-nacl.ts b/assembly/nano-nacl.ts index 5bcc896..1119380 100644 --- a/assembly/nano-nacl.ts +++ b/assembly/nano-nacl.ts @@ -806,6 +806,20 @@ function unpackneg (r: Array>, p: StaticArray): i8 { return 0 } +// Validate signature scalar S is canonical (S < L) +function canonical (S: StaticArray): boolean { + // If S >= 2^253 then S >= L for sure. + if ((S[32] & 0xE0) != 0) return false + + // Check S-L for underflow (c=1) which means S < L + let c = 0 + for (let i = 0; i < 32; i++) { + const diff = S[i] - L[i] - c + c = (diff >> 31) & 1 + } + return c == 1 +} + const blake2b = new Blake2b() function crypto_hash (o: StaticArray, i: StaticArray): void { blake2b.init().update(i).digest(o) @@ -917,9 +931,7 @@ function crypto_verify (h: StaticArray, s: StaticArray, k: StaticArray, s: StaticArray, k: StaticArray