@@ -4346,8 +4346,6 @@ PBKDF2(const Arguments& args) {
4346
4346
}
4347
4347
4348
4348
4349
- typedef int (*RandomBytesGenerator)(unsigned char * buf, int size);
4350
-
4351
4349
struct RandomBytesRequest {
4352
4350
~RandomBytesRequest ();
4353
4351
Persistent<Object> obj_;
@@ -4370,26 +4368,26 @@ void RandomBytesFree(char* data, void* hint) {
4370
4368
}
4371
4369
4372
4370
4373
- template <RandomBytesGenerator generator >
4371
+ template <bool pseudoRandom >
4374
4372
void RandomBytesWork (uv_work_t * work_req) {
4375
- RandomBytesRequest* req =
4376
- container_of (work_req, RandomBytesRequest, work_req_);
4377
-
4378
- int r = generator (reinterpret_cast <unsigned char *>(req->data_ ), req->size_ );
4379
-
4380
- switch (r) {
4381
- case 0 :
4382
- // RAND_bytes() returns 0 on error, RAND_pseudo_bytes() returns 0
4383
- // when the result is not cryptographically strong - the latter
4384
- // sucks but is not an error
4385
- if (generator == RAND_bytes)
4386
- req->error_ = ERR_get_error ();
4387
- break ;
4373
+ RandomBytesRequest* req = container_of (work_req,
4374
+ RandomBytesRequest,
4375
+ work_req_);
4376
+ int r;
4377
+
4378
+ if (pseudoRandom == true ) {
4379
+ r = RAND_pseudo_bytes (reinterpret_cast <unsigned char *>(req->data_ ),
4380
+ req->size_ );
4381
+ } else {
4382
+ r = RAND_bytes (reinterpret_cast <unsigned char *>(req->data_ ), req->size_ );
4383
+ }
4388
4384
4389
- case -1 :
4390
- // not supported - can this actually happen?
4391
- req->error_ = (unsigned long ) -1 ;
4392
- break ;
4385
+ // RAND_bytes() returns 0 on error. RAND_pseudo_bytes() returns 0 when the
4386
+ // result is not cryptographically strong - but that's not an error.
4387
+ if (r == 0 && pseudoRandom == false ) {
4388
+ req->error_ = ERR_get_error ();
4389
+ } else if (r == -1 ) {
4390
+ req->error_ = static_cast <unsigned long >(-1 );
4393
4391
}
4394
4392
}
4395
4393
@@ -4414,10 +4412,10 @@ void RandomBytesCheck(RandomBytesRequest* req, Local<Value> argv[2]) {
4414
4412
}
4415
4413
4416
4414
4417
- template <RandomBytesGenerator generator>
4418
4415
void RandomBytesAfter (uv_work_t * work_req) {
4419
- RandomBytesRequest* req =
4420
- container_of (work_req, RandomBytesRequest, work_req_);
4416
+ RandomBytesRequest* req = container_of (work_req,
4417
+ RandomBytesRequest,
4418
+ work_req_);
4421
4419
4422
4420
HandleScope scope;
4423
4421
Local<Value> argv[2 ];
@@ -4428,7 +4426,7 @@ void RandomBytesAfter(uv_work_t* work_req) {
4428
4426
}
4429
4427
4430
4428
4431
- template <RandomBytesGenerator generator >
4429
+ template <bool pseudoRandom >
4432
4430
Handle <Value> RandomBytes (const Arguments& args) {
4433
4431
HandleScope scope;
4434
4432
@@ -4452,14 +4450,14 @@ Handle<Value> RandomBytes(const Arguments& args) {
4452
4450
4453
4451
uv_queue_work (uv_default_loop (),
4454
4452
&req->work_req_ ,
4455
- RandomBytesWork<generator >,
4456
- RandomBytesAfter<generator> );
4453
+ RandomBytesWork<pseudoRandom >,
4454
+ RandomBytesAfter);
4457
4455
4458
4456
return req->obj_ ;
4459
4457
}
4460
4458
else {
4461
4459
Local<Value> argv[2 ];
4462
- RandomBytesWork<generator >(&req->work_req_ );
4460
+ RandomBytesWork<pseudoRandom >(&req->work_req_ );
4463
4461
RandomBytesCheck (req, argv);
4464
4462
delete req;
4465
4463
@@ -4508,8 +4506,8 @@ void InitCrypto(Handle<Object> target) {
4508
4506
Verify::Initialize (target);
4509
4507
4510
4508
NODE_SET_METHOD (target, " PBKDF2" , PBKDF2);
4511
- NODE_SET_METHOD (target, " randomBytes" , RandomBytes<RAND_bytes >);
4512
- NODE_SET_METHOD (target, " pseudoRandomBytes" , RandomBytes<RAND_pseudo_bytes >);
4509
+ NODE_SET_METHOD (target, " randomBytes" , RandomBytes<false >);
4510
+ NODE_SET_METHOD (target, " pseudoRandomBytes" , RandomBytes<true >);
4513
4511
4514
4512
subject_symbol = NODE_PSYMBOL (" subject" );
4515
4513
issuer_symbol = NODE_PSYMBOL (" issuer" );
0 commit comments