Skip to content

Commit 484bfa2

Browse files
author
Benjamin Gruenbaum
committed
crypto: accept decimal Number in randomBytes
This change adds the ability to pass a double into randomBytes. PR-URL: #15130 Fixes: #15118 Reviewed-By: Sam Roberts <vieuxtech@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Evan Lucas <evanlucas@me.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Timothy Gu <timothygu99@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
1 parent 8d5b013 commit 484bfa2

File tree

2 files changed

+15
-14
lines changed

2 files changed

+15
-14
lines changed

src/node_crypto.cc

+3-3
Original file line numberDiff line numberDiff line change
@@ -5616,13 +5616,13 @@ void RandomBytesProcessSync(Environment* env,
56165616
void RandomBytes(const FunctionCallbackInfo<Value>& args) {
56175617
Environment* env = Environment::GetCurrent(args);
56185618

5619-
if (!args[0]->IsUint32()) {
5619+
if (!args[0]->IsNumber() || args[0].As<v8::Number>()->Value() < 0) {
56205620
return env->ThrowTypeError("size must be a number >= 0");
56215621
}
56225622

56235623
const int64_t size = args[0]->IntegerValue();
5624-
if (size < 0 || size > Buffer::kMaxLength)
5625-
return env->ThrowRangeError("size is not a valid Smi");
5624+
if (size > Buffer::kMaxLength)
5625+
return env->ThrowTypeError("size must be a uint32");
56265626

56275627
Local<Object> obj = env->randombytes_constructor_template()->
56285628
NewInstance(env->context()).ToLocalChecked();

test/parallel/test-crypto-random.js

+12-11
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,15 @@ crypto.DEFAULT_ENCODING = 'buffer';
3333
// bump, we register a lot of exit listeners
3434
process.setMaxListeners(256);
3535

36+
const errMessages = {
37+
offsetNotNumber: /^TypeError: offset must be a number$/,
38+
offsetOutOfRange: /^RangeError: offset out of range$/,
39+
offsetNotUInt32: /^TypeError: offset must be a uint32$/,
40+
sizeNotNumber: /^TypeError: size must be a number$/,
41+
sizeNotUInt32: /^TypeError: size must be a uint32$/,
42+
bufferTooSmall: /^RangeError: buffer too small$/,
43+
};
44+
3645
const expectedErrorRegexp = /^TypeError: size must be a number >= 0$/;
3746
[crypto.randomBytes, crypto.pseudoRandomBytes].forEach(function(f) {
3847
[-1, undefined, null, false, true, {}, []].forEach(function(value) {
@@ -41,10 +50,10 @@ const expectedErrorRegexp = /^TypeError: size must be a number >= 0$/;
4150
expectedErrorRegexp);
4251
});
4352

44-
[0, 1, 2, 4, 16, 256, 1024].forEach(function(len) {
53+
[0, 1, 2, 4, 16, 256, 1024, 101.2].forEach(function(len) {
4554
f(len, common.mustCall(function(ex, buf) {
4655
assert.strictEqual(ex, null);
47-
assert.strictEqual(buf.length, len);
56+
assert.strictEqual(buf.length, Math.floor(len));
4857
assert.ok(Buffer.isBuffer(buf));
4958
}));
5059
});
@@ -139,14 +148,6 @@ const expectedErrorRegexp = /^TypeError: size must be a number >= 0$/;
139148
Buffer.alloc(10),
140149
new Uint8Array(new Array(10).fill(0))
141150
];
142-
const errMessages = {
143-
offsetNotNumber: /^TypeError: offset must be a number$/,
144-
offsetOutOfRange: /^RangeError: offset out of range$/,
145-
offsetNotUInt32: /^TypeError: offset must be a uint32$/,
146-
sizeNotNumber: /^TypeError: size must be a number$/,
147-
sizeNotUInt32: /^TypeError: size must be a uint32$/,
148-
bufferTooSmall: /^RangeError: buffer too small$/,
149-
};
150151

151152
const max = require('buffer').kMaxLength + 1;
152153

@@ -264,4 +265,4 @@ const expectedErrorRegexp = /^TypeError: size must be a number >= 0$/;
264265
// length exceeds max acceptable value"
265266
assert.throws(function() {
266267
crypto.randomBytes((-1 >>> 0) + 1);
267-
}, /^TypeError: size must be a number >= 0$/);
268+
}, errMessages.sizeNotUInt32);

0 commit comments

Comments
 (0)