crypto: migrate crypto.randomBytes to internal/errors

PR-URL: https://github.com/nodejs/node/pull/16454
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Reviewed-By: Anatoli Papirovski <apapirovski@mac.com>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
This commit is contained in:
James M Snell 2017-10-24 12:26:03 -07:00
parent 76b8803630
commit 0a03e350fb
3 changed files with 36 additions and 15 deletions

View File

@ -3,7 +3,7 @@
const errors = require('internal/errors');
const { isArrayBufferView } = require('internal/util/types');
const {
randomBytes,
randomBytes: _randomBytes,
randomFill: _randomFill
} = process.binding('crypto');
@ -24,7 +24,7 @@ function assertOffset(offset, length) {
}
}
function assertSize(size, offset, length) {
function assertSize(size, offset = 0, length = Infinity) {
if (typeof size !== 'number' || size !== size) {
throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'size', 'number');
}
@ -38,6 +38,13 @@ function assertSize(size, offset, length) {
}
}
function randomBytes(size, cb) {
assertSize(size);
if (cb !== undefined && typeof cb !== 'function')
throw new errors.TypeError('ERR_INVALID_CALLBACK');
return _randomBytes(size, cb);
}
function randomFillSync(buf, offset = 0, size) {
if (!isArrayBufferView(buf)) {
throw new errors.TypeError('ERR_INVALID_ARG_TYPE',

View File

@ -5526,13 +5526,8 @@ void RandomBytesProcessSync(Environment* env,
void RandomBytes(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
if (!args[0]->IsNumber() || args[0].As<v8::Number>()->Value() < 0) {
return env->ThrowTypeError("size must be a number >= 0");
}
const int64_t size = args[0]->IntegerValue();
if (size > Buffer::kMaxLength)
return env->ThrowTypeError("size must be a uint32");
CHECK(size <= Buffer::kMaxLength);
Local<Object> obj = env->randombytes_constructor_template()->
NewInstance(env->context()).ToLocalChecked();

View File

@ -33,12 +33,26 @@ crypto.DEFAULT_ENCODING = 'buffer';
// bump, we register a lot of exit listeners
process.setMaxListeners(256);
const expectedErrorRegexp = /^TypeError: size must be a number >= 0$/;
[crypto.randomBytes, crypto.pseudoRandomBytes].forEach(function(f) {
[-1, undefined, null, false, true, {}, []].forEach(function(value) {
assert.throws(function() { f(value); }, expectedErrorRegexp);
assert.throws(function() { f(value, common.mustNotCall()); },
expectedErrorRegexp);
common.expectsError(
() => f(value),
{
code: 'ERR_INVALID_ARG_TYPE',
type: TypeError,
message: /^The "size" argument must be of type (number|uint32)$/
}
);
common.expectsError(
() => f(value, common.mustNotCall()),
{
code: 'ERR_INVALID_ARG_TYPE',
type: TypeError,
message: /^The "size" argument must be of type (number|uint32)$/
}
);
});
[0, 1, 2, 4, 16, 256, 1024, 101.2].forEach(function(len) {
@ -464,9 +478,14 @@ const expectedErrorRegexp = /^TypeError: size must be a number >= 0$/;
// #5126, "FATAL ERROR: v8::Object::SetIndexedPropertiesToExternalArrayData()
// length exceeds max acceptable value"
assert.throws(function() {
crypto.randomBytes((-1 >>> 0) + 1);
}, /^TypeError: size must be a uint32$/);
common.expectsError(
() => crypto.randomBytes((-1 >>> 0) + 1),
{
code: 'ERR_INVALID_ARG_TYPE',
type: TypeError,
message: 'The "size" argument must be of type uint32'
}
);
[1, true, NaN, null, undefined, {}, []].forEach((i) => {
common.expectsError(