Skip to content

Commit

Permalink
fix(ext/node): resource leak in createHmac (#18229)
Browse files Browse the repository at this point in the history
This commit fixes #18140.
Verified that test fails on `main`.
  • Loading branch information
littledivy authored Mar 16, 2023
1 parent 2c7174a commit 1300d61
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
24 changes: 24 additions & 0 deletions cli/tests/unit_node/crypto_hash.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
import { createHash, createHmac } from "node:crypto";
import { assertEquals } from "../../../test_util/std/testing/asserts.ts";

// https://github.com/denoland/deno/issues/18140
Deno.test({
name: "createHmac digest",
fn() {
assertEquals(
createHmac("sha256", "secret").update("hello").digest("hex"),
"88aab3ede8d3adf94d26ab90d3bafd4a2083070c3bcce9c014ee04a443847c0b",
);
},
});

Deno.test({
name: "createHash digest",
fn() {
assertEquals(
createHash("sha256").update("hello").digest("hex"),
"2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824",
);
},
});
4 changes: 2 additions & 2 deletions ext/node/polyfills/internal/crypto/hash.ts
Original file line number Diff line number Diff line change
Expand Up @@ -178,15 +178,15 @@ class HmacImpl extends Transform {
const u8Key = prepareSecretKey(key, options?.encoding) as Buffer;

const alg = hmac.toLowerCase();
this.#hash = new Hash(alg, options);
this.#algorithm = alg;
const blockSize = (alg === "sha512" || alg === "sha384") ? 128 : 64;
const keySize = u8Key.length;

let bufKey: Buffer;

if (keySize > blockSize) {
bufKey = this.#hash.update(u8Key).digest() as Buffer;
const hash = new Hash(alg, options);
bufKey = hash.update(u8Key).digest() as Buffer;
} else {
bufKey = Buffer.concat([u8Key, this.#ZEROES], blockSize);
}
Expand Down

0 comments on commit 1300d61

Please sign in to comment.