2024-01-01 14:58:21 -05:00
|
|
|
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
2023-03-26 06:03:10 -04:00
|
|
|
import {
|
|
|
|
assert,
|
|
|
|
assertEquals,
|
|
|
|
assertRejects,
|
|
|
|
assertThrows,
|
2023-12-01 21:20:06 -05:00
|
|
|
} from "../../../../test_util/std/assert/mod.ts";
|
2023-03-26 06:03:10 -04:00
|
|
|
import { assertCallbackErrorUncaught } from "../_test_utils.ts";
|
2023-12-19 21:24:55 -05:00
|
|
|
import { pseudoRandomBytes, randomBytes } from "node:crypto";
|
2023-03-26 06:03:10 -04:00
|
|
|
|
|
|
|
const MAX_RANDOM_VALUES = 65536;
|
|
|
|
const MAX_SIZE = 4294967295;
|
|
|
|
|
|
|
|
Deno.test("randomBytes sync works correctly", function () {
|
|
|
|
assertEquals(randomBytes(0).length, 0, "len: " + 0);
|
|
|
|
assertEquals(randomBytes(3).length, 3, "len: " + 3);
|
|
|
|
assertEquals(randomBytes(30).length, 30, "len: " + 30);
|
|
|
|
assertEquals(randomBytes(300).length, 300, "len: " + 300);
|
|
|
|
assertEquals(
|
|
|
|
randomBytes(17 + MAX_RANDOM_VALUES).length,
|
|
|
|
17 + MAX_RANDOM_VALUES,
|
|
|
|
"len: " + 17 + MAX_RANDOM_VALUES,
|
|
|
|
);
|
|
|
|
assertEquals(
|
|
|
|
randomBytes(MAX_RANDOM_VALUES * 100).length,
|
|
|
|
MAX_RANDOM_VALUES * 100,
|
|
|
|
"len: " + MAX_RANDOM_VALUES * 100,
|
|
|
|
);
|
|
|
|
assertThrows(() => randomBytes(MAX_SIZE + 1));
|
|
|
|
assertThrows(() => randomBytes(-1));
|
|
|
|
});
|
|
|
|
|
|
|
|
Deno.test("randomBytes async works correctly", async function () {
|
|
|
|
randomBytes(0, function (err, resp) {
|
|
|
|
assert(!err);
|
|
|
|
assertEquals(resp?.length, 0, "len: " + 0);
|
|
|
|
});
|
|
|
|
randomBytes(3, function (err, resp) {
|
|
|
|
assert(!err);
|
|
|
|
assertEquals(resp?.length, 3, "len: " + 3);
|
|
|
|
});
|
|
|
|
randomBytes(30, function (err, resp) {
|
|
|
|
assert(!err);
|
|
|
|
assertEquals(resp?.length, 30, "len: " + 30);
|
|
|
|
});
|
|
|
|
randomBytes(300, function (err, resp) {
|
|
|
|
assert(!err);
|
|
|
|
assertEquals(resp?.length, 300, "len: " + 300);
|
|
|
|
});
|
|
|
|
randomBytes(17 + MAX_RANDOM_VALUES, function (err, resp) {
|
|
|
|
assert(!err);
|
|
|
|
assertEquals(
|
|
|
|
resp?.length,
|
|
|
|
17 + MAX_RANDOM_VALUES,
|
|
|
|
"len: " + 17 + MAX_RANDOM_VALUES,
|
|
|
|
);
|
|
|
|
});
|
|
|
|
randomBytes(MAX_RANDOM_VALUES * 100, function (err, resp) {
|
|
|
|
assert(!err);
|
|
|
|
assertEquals(
|
|
|
|
resp?.length,
|
|
|
|
MAX_RANDOM_VALUES * 100,
|
|
|
|
"len: " + MAX_RANDOM_VALUES * 100,
|
|
|
|
);
|
|
|
|
});
|
|
|
|
assertThrows(() =>
|
|
|
|
randomBytes(MAX_SIZE + 1, function (err) {
|
|
|
|
//Shouldn't throw async
|
|
|
|
assert(!err);
|
|
|
|
})
|
|
|
|
);
|
|
|
|
await assertRejects(() =>
|
|
|
|
new Promise((resolve, reject) => {
|
|
|
|
randomBytes(-1, function (err, res) {
|
|
|
|
//Shouldn't throw async
|
|
|
|
if (err) {
|
|
|
|
reject(err);
|
|
|
|
} else {
|
|
|
|
resolve(res);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
})
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
Deno.test("[std/node/crypto] randomBytes callback isn't called twice if error is thrown", async () => {
|
|
|
|
const importUrl = new URL("node:crypto", import.meta.url);
|
|
|
|
await assertCallbackErrorUncaught({
|
|
|
|
prelude: `import { randomBytes } from ${JSON.stringify(importUrl)}`,
|
|
|
|
invocation: "randomBytes(0, ",
|
|
|
|
});
|
|
|
|
});
|
2023-12-19 21:24:55 -05:00
|
|
|
|
|
|
|
// https://github.com/denoland/deno/issues/21632
|
|
|
|
Deno.test("pseudoRandomBytes works", function () {
|
|
|
|
assertEquals(pseudoRandomBytes(0).length, 0, "len: " + 0);
|
|
|
|
assertEquals(pseudoRandomBytes(3).length, 3, "len: " + 3);
|
|
|
|
assertEquals(pseudoRandomBytes(30).length, 30, "len: " + 30);
|
|
|
|
assertEquals(pseudoRandomBytes(300).length, 300, "len: " + 300);
|
|
|
|
assertEquals(
|
|
|
|
pseudoRandomBytes(17 + MAX_RANDOM_VALUES).length,
|
|
|
|
17 + MAX_RANDOM_VALUES,
|
|
|
|
"len: " + 17 + MAX_RANDOM_VALUES,
|
|
|
|
);
|
|
|
|
assertEquals(
|
|
|
|
pseudoRandomBytes(MAX_RANDOM_VALUES * 100).length,
|
|
|
|
MAX_RANDOM_VALUES * 100,
|
|
|
|
"len: " + MAX_RANDOM_VALUES * 100,
|
|
|
|
);
|
|
|
|
assertThrows(() => pseudoRandomBytes(MAX_SIZE + 1));
|
|
|
|
assertThrows(() => pseudoRandomBytes(-1));
|
|
|
|
});
|