Files
node/test/parallel/test-webcrypto-random.js
Filip Skokan e329423cd8 crypto: convert getRandomValues views
Apply Web IDL view conversion before checking the integer array type,
including shared and resizable backing-buffer restrictions.

Signed-off-by: Filip Skokan <panva.ip@gmail.com>
Assisted-by: Codex
PR-URL: https://github.com/nodejs/node/pull/66237
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Aviv Keller <me@aviv.sh>
2026-09-25 13:23:07 +00:00

88 lines
1.9 KiB
JavaScript

'use strict';
const common = require('../common');
if (!common.hasCrypto)
common.skip('missing crypto');
const { Buffer } = require('buffer');
const assert = require('assert');
const { crypto } = globalThis;
for (const value of [undefined, null, '', 1, {}, [], new ArrayBuffer(1)]) {
assert.throws(() => crypto.getRandomValues(value), TypeError);
}
[
new Float32Array(1),
new Float64Array(1),
new DataView(new ArrayBuffer(1)),
].forEach((i) => {
assert.throws(
() => crypto.getRandomValues(i),
{ name: 'TypeMismatchError', code: 17 },
);
});
{
const buf = new Uint8Array(0);
crypto.getRandomValues(buf);
}
const intTypedConstructors = [
Int8Array,
Int16Array,
Int32Array,
Uint8Array,
Uint16Array,
Uint32Array,
Uint8ClampedArray,
BigInt64Array,
BigUint64Array,
];
for (const ctor of intTypedConstructors) {
const buf = new ctor(10);
const before = Buffer.from(buf.buffer).toString('hex');
crypto.getRandomValues(buf);
const after = Buffer.from(buf.buffer).toString('hex');
assert.notStrictEqual(before, after);
}
{
const buf = Buffer.alloc(10);
const before = buf.toString('hex');
crypto.getRandomValues(buf);
const after = buf.toString('hex');
assert.notStrictEqual(before, after);
}
{
let kData;
try {
kData = Buffer.alloc(65536 + 1);
} catch {
// Ignore if error here.
}
if (kData !== undefined) {
assert.throws(
() => crypto.getRandomValues(kData),
(err) => {
assert.strictEqual(err.name, 'QuotaExceededError');
assert.strictEqual(err.code, 22);
assert(err instanceof DOMException);
assert(err instanceof QuotaExceededError);
assert.strictEqual(err.quota, null);
assert.strictEqual(err.requested, null);
return true;
},
);
}
}
{
const typedArray = new Uint8Array(32);
assert.strictEqual(crypto.getRandomValues(typedArray), typedArray);
}