diff --git a/ext/node/polyfills/internal/crypto/_randomFill.mjs b/ext/node/polyfills/internal/crypto/_randomFill.mjs index 5de756536a..e53918b399 100644 --- a/ext/node/polyfills/internal/crypto/_randomFill.mjs +++ b/ext/node/polyfills/internal/crypto/_randomFill.mjs @@ -86,7 +86,9 @@ export function randomFillSync(buf, offset = 0, size) { return buf; } - const bytes = new Uint8Array(buf.buffer ? buf.buffer : buf, offset, size); + const bytes = isAnyArrayBuffer(buf) + ? new Uint8Array(buf, offset, size) + : new Uint8Array(buf.buffer, buf.byteOffset + offset, size); op_node_generate_secret(bytes); return buf; diff --git a/tests/unit_node/crypto/crypto_misc_test.ts b/tests/unit_node/crypto/crypto_misc_test.ts index 8132f2e99c..47a48b1bf8 100644 --- a/tests/unit_node/crypto/crypto_misc_test.ts +++ b/tests/unit_node/crypto/crypto_misc_test.ts @@ -1,6 +1,7 @@ // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. import { randomFillSync, randomUUID } from "node:crypto"; import { assert, assertEquals } from "../../unit/test_util.ts"; +import { assertNotEquals } from "@std/assert"; Deno.test("[node/crypto.getRandomUUID] works the same way as Web Crypto API", () => { assertEquals(randomUUID().length, crypto.randomUUID().length); @@ -16,3 +17,14 @@ Deno.test("[node/crypto.randomFillSync] supported arguments", () => { assert(randomFillSync(buf.buffer)); assert(randomFillSync(new DataView(buf.buffer))); }); + +Deno.test("[node/crypto.randomFillSync] array buffer view", () => { + const buf = new Uint8Array(32); + const view = new Uint8Array(buf.buffer, 8, 16); + + assert(randomFillSync(view)); + assertEquals(view.length, 16); + assertNotEquals(view, new Uint8Array(16)); + assertEquals(buf.subarray(0, 8), new Uint8Array(8)); + assertEquals(buf.subarray(24, 32), new Uint8Array(8)); +});