Skip to content

Commit

Permalink
src: seed V8's random number generator at startup
Browse files Browse the repository at this point in the history
The default entropy source is /dev/urandom on UNIX platforms, which is
okay but we can do better by seeding it from OpenSSL's entropy pool.

On Windows we can certainly do better; on that platform, V8 seeds the
random number generator using only the current system time.

Fixes #6250.

NB: This is a back-port of commit 7ac2391 from the master branch that
for some reason never got back-ported to the v0.10 branch.

The default on UNIX platforms in v0.10 is different and arguably worse
than it is with master: if no entropy source is provided, V8 3.14 calls
srandom() with a xor of the PID and the current time in microseconds.

That means that on systems with a coarse system clock, the initial
state of the PRNG may be easily guessable.

The situation on Windows is even more dire because there the PRNG is
seeded with only the current time... in milliseconds.
  • Loading branch information
bnoordhuis authored and indutny committed Mar 26, 2014
1 parent bd547d6 commit 70f198d
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/node.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3057,6 +3057,12 @@ int Start(int argc, char *argv[]) {
Init(argc, argv_copy);

V8::Initialize();
#if HAVE_OPENSSL
// V8 on Windows doesn't have a good source of entropy. Seed it from
// OpenSSL's pool.
V8::SetEntropySource(crypto::EntropySource);
#endif

{
Locker locker;
HandleScope handle_scope;
Expand Down
8 changes: 8 additions & 0 deletions src/node_crypto.cc
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,14 @@ Handle<Value> ThrowCryptoTypeError(unsigned long err) {
}


bool EntropySource(unsigned char* buffer, size_t length) {
// RAND_bytes() can return 0 to indicate that the entropy data is not truly
// random. That's okay, it's still better than V8's stock source of entropy,
// which is /dev/urandom on UNIX platforms and the current time on Windows.
return RAND_bytes(buffer, length) != -1;
}


void SecureContext::Initialize(Handle<Object> target) {
HandleScope scope;

Expand Down
1 change: 1 addition & 0 deletions src/node_crypto.h
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,7 @@ class Connection : ObjectWrap {
friend class SecureContext;
};

bool EntropySource(unsigned char* buffer, size_t length);
void InitCrypto(v8::Handle<v8::Object> target);

} // namespace crypto
Expand Down

0 comments on commit 70f198d

Please sign in to comment.