From 2a30daad9a6073c3d4ace08c71741e7a36f5d15d Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Mon, 21 Sep 2026 16:22:45 -0700 Subject: [PATCH] Webcrypto: use constant-time HMAC verification --- external/njs_webcrypto_module.c | 3 ++- external/qjs_webcrypto_module.c | 3 ++- test/webcrypto/verify.t.mjs | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/external/njs_webcrypto_module.c b/external/njs_webcrypto_module.c index 0d54a262..cc4ef26f 100644 --- a/external/njs_webcrypto_module.c +++ b/external/njs_webcrypto_module.c @@ -4787,7 +4787,8 @@ njs_ext_sign(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, } if (verify) { - ret = (sig.length == outlen && memcmp(sig.start, dst, outlen) == 0); + ret = (sig.length == outlen + && CRYPTO_memcmp(sig.start, dst, outlen) == 0); } break; diff --git a/external/qjs_webcrypto_module.c b/external/qjs_webcrypto_module.c index 29f1931c..9a06a50f 100644 --- a/external/qjs_webcrypto_module.c +++ b/external/qjs_webcrypto_module.c @@ -4758,7 +4758,8 @@ qjs_webcrypto_sign(JSContext *cx, JSValueConst this_val, int argc, } if (verify) { - rc = (sig.length == outlen && memcmp(sig.start, dst, outlen) == 0); + rc = (sig.length == outlen + && CRYPTO_memcmp(sig.start, dst, outlen) == 0); } break; diff --git a/test/webcrypto/verify.t.mjs b/test/webcrypto/verify.t.mjs index 5f77ad47..a4fb9e94 100644 --- a/test/webcrypto/verify.t.mjs +++ b/test/webcrypto/verify.t.mjs @@ -73,6 +73,7 @@ let hmac_tsuite = { tests: [ { signature: "text.base64.sha256.hmac.sig", expected: true }, { signature: "text.base64.sha256.hmac.sig.broken", expected: false }, + { signature: "text.base64.sha1.hmac.sig", expected: false }, { import_alg: { hash: "SHA-1" }, signature: "text.base64.sha1.hmac.sig", expected: true }, { import_alg: { hash: "SHA-1" }, signature: "text.base64.sha256.hmac.sig", expected: false }, { key: { file: "aabbccdd" }, signature: "text.base64.sha256.hmac.sig", expected: false }, -- 2.47.3