From d3a9072d5b78b63520467fbc4988930e85e0962a Mon Sep 17 00:00:00 2001 From: LiviaMedeiros Date: Wed, 12 Jan 2022 00:49:56 +0800 Subject: [PATCH] crypto: adjust types for getRandomValues prevents Web Crypto API's getRandomValues from accepting DataView - Fixes: https://github.com/nodejs/node/issues/41480 - Refs: https://www.w3.org/TR/WebCryptoAPI/#Crypto-method-getRandomValues --- lib/internal/crypto/random.js | 3 ++- test/parallel/test-webcrypto-random.js | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/internal/crypto/random.js b/lib/internal/crypto/random.js index 8812120091f930..1423ea4295443e 100644 --- a/lib/internal/crypto/random.js +++ b/lib/internal/crypto/random.js @@ -50,6 +50,7 @@ const { const { isArrayBufferView, isAnyArrayBuffer, + isTypedArray, isFloat32Array, isFloat64Array, } = require('internal/util/types'); @@ -307,7 +308,7 @@ function onJobDone(buf, callback, error) { // not allowed to exceed 65536 bytes, and can only // be an integer-type TypedArray. function getRandomValues(data) { - if (!isArrayBufferView(data) || + if (!isTypedArray(data) || isFloat32Array(data) || isFloat64Array(data)) { // Ordinarily this would be an ERR_INVALID_ARG_TYPE. However, diff --git a/test/parallel/test-webcrypto-random.js b/test/parallel/test-webcrypto-random.js index f2bf2c396fd20a..e17cc834b6c2bf 100644 --- a/test/parallel/test-webcrypto-random.js +++ b/test/parallel/test-webcrypto-random.js @@ -13,6 +13,7 @@ const { getRandomValues } = require('crypto').webcrypto; undefined, null, '', 1, {}, [], new Float32Array(1), new Float64Array(1), + new DataView(new ArrayBuffer(1)), ].forEach((i) => { assert.throws( () => getRandomValues(i), @@ -32,6 +33,7 @@ const intTypedConstructors = [ Uint8Array, Uint16Array, Uint32Array, + Uint8ClampedArray, BigInt64Array, BigUint64Array, ]; @@ -47,7 +49,7 @@ for (const ctor of intTypedConstructors) { { const buf = new Uint16Array(10); const before = Buffer.from(buf).toString('hex'); - getRandomValues(new DataView(buf.buffer)); + getRandomValues(buf); const after = Buffer.from(buf).toString('hex'); assert.notStrictEqual(before, after); }