summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/node/polyfills/internal/crypto/_randomFill.mjs4
-rw-r--r--tests/unit_node/crypto/crypto_misc_test.ts12
2 files changed, 15 insertions, 1 deletions
diff --git a/ext/node/polyfills/internal/crypto/_randomFill.mjs b/ext/node/polyfills/internal/crypto/_randomFill.mjs
index 5de756536..e53918b39 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 8132f2e99..47a48b1bf 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));
+});