From 8d20784f7adc1eee6cd58f1b797263fc19d07327 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Bertron?= Date: Tue, 4 Oct 2022 08:10:34 +0200 Subject: fix(ext/crypto): deriveBits for ECDH not taking length into account (#16128) Fixes #16047 --- cli/tests/unit/webcrypto_test.ts | 65 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) (limited to 'cli/tests/unit') diff --git a/cli/tests/unit/webcrypto_test.ts b/cli/tests/unit/webcrypto_test.ts index 6695b157a..c5f5dc6c2 100644 --- a/cli/tests/unit/webcrypto_test.ts +++ b/cli/tests/unit/webcrypto_test.ts @@ -541,6 +541,71 @@ Deno.test(async function testHkdfDeriveBitsWithLargeKeySize() { ); }); +Deno.test(async function testEcdhDeriveBitsWithShorterLength() { + const keypair = await crypto.subtle.generateKey( + { + name: "ECDH", + namedCurve: "P-384", + }, + true, + ["deriveBits", "deriveKey"], + ); + const result = await crypto.subtle.deriveBits( + { + name: "ECDH", + public: keypair.publicKey, + }, + keypair.privateKey, + 256, + ); + assertEquals(result.byteLength * 8, 256); +}); + +Deno.test(async function testEcdhDeriveBitsWithLongerLength() { + const keypair = await crypto.subtle.generateKey( + { + name: "ECDH", + namedCurve: "P-384", + }, + true, + ["deriveBits", "deriveKey"], + ); + await assertRejects( + () => + crypto.subtle.deriveBits( + { + name: "ECDH", + public: keypair.publicKey, + }, + keypair.privateKey, + 512, + ), + DOMException, + "Invalid length", + ); +}); + +Deno.test(async function testEcdhDeriveBitsWithNullLength() { + const keypair = await crypto.subtle.generateKey( + { + name: "ECDH", + namedCurve: "P-384", + }, + true, + ["deriveBits", "deriveKey"], + ); + const result = await crypto.subtle.deriveBits( + { + name: "ECDH", + public: keypair.publicKey, + }, + keypair.privateKey, + // @ts-ignore: necessary until .d.ts file allows passing null (see https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1416) + null, + ); + assertEquals(result.byteLength * 8, 384); +}); + Deno.test(async function testDeriveKey() { // Test deriveKey const rawKey = await crypto.getRandomValues(new Uint8Array(16)); -- cgit v1.2.3