From af97535b7cc64bf4586da77fc0afa146230e758c Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Tue, 17 Aug 2021 14:59:32 +0530 Subject: [PATCH] fix(ext/crypto): exportKey() for HMAC (#11737) Fixes typings and innerKey processing (WPT doesn't test exportKey for HMAC so this wasn't caught earlier). --- cli/tests/unit/webcrypto_test.ts | 5 ++++- ext/crypto/00_crypto.js | 5 +++-- ext/crypto/lib.deno_crypto.d.ts | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cli/tests/unit/webcrypto_test.ts b/cli/tests/unit/webcrypto_test.ts index 23a4e0c578..608e4660a5 100644 --- a/cli/tests/unit/webcrypto_test.ts +++ b/cli/tests/unit/webcrypto_test.ts @@ -160,7 +160,7 @@ unitTest(async function testSignRSASSAKey() { assert(signature); }); -unitTest(async function subtleCryptoHmacImport() { +unitTest(async function subtleCryptoHmacImportExport() { // deno-fmt-ignore const rawKey = new Uint8Array([ 1, 2, 3, 4, 5, 6, 7, 8, @@ -189,4 +189,7 @@ unitTest(async function subtleCryptoHmacImport() { new Uint8Array(actual), expected, ); + + const exportedKey = await crypto.subtle.exportKey("raw", key); + assertEquals(new Uint8Array(exportedKey), rawKey); }); diff --git a/ext/crypto/00_crypto.js b/ext/crypto/00_crypto.js index 5fdbe6ebc9..115271dab5 100644 --- a/ext/crypto/00_crypto.js +++ b/ext/crypto/00_crypto.js @@ -577,16 +577,17 @@ const handle = key[_handle]; // 2. - const bits = WeakMapPrototypeGet(KEY_STORE, handle); + const innerKey = WeakMapPrototypeGet(KEY_STORE, handle); switch (key[_algorithm].name) { case "HMAC": { - if (bits == null) { + if (innerKey == null) { throw new DOMException("Key is not available", "OperationError"); } switch (format) { // 3. case "raw": { + const bits = innerKey.data; for (let _i = 7 & (8 - bits.length % 8); _i > 0; _i--) { bits.push(0); } diff --git a/ext/crypto/lib.deno_crypto.d.ts b/ext/crypto/lib.deno_crypto.d.ts index b89b62f2ec..09273e78af 100644 --- a/ext/crypto/lib.deno_crypto.d.ts +++ b/ext/crypto/lib.deno_crypto.d.ts @@ -107,6 +107,7 @@ interface SubtleCrypto { extractable: boolean, keyUsages: KeyUsage[], ): Promise; + exportKey(format: "raw", key: CryptoKey): Promise; sign( algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, key: CryptoKey,