mirror of
https://github.com/zebrajr/node.git
synced 2025-12-07 00:20:38 +01:00
src: seed V8's random number generator at startup
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.
This commit is contained in:
parent
03738183c7
commit
7ac23910c5
|
|
@ -3224,6 +3224,12 @@ int Start(int argc, char** argv) {
|
||||||
Init(&argc, const_cast<const char**>(argv), &exec_argc, &exec_argv);
|
Init(&argc, const_cast<const char**>(argv), &exec_argc, &exec_argv);
|
||||||
|
|
||||||
V8::Initialize();
|
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(node_isolate);
|
Locker locker(node_isolate);
|
||||||
Environment* env =
|
Environment* env =
|
||||||
|
|
|
||||||
|
|
@ -185,6 +185,14 @@ void 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(Environment* env, Handle<Object> target) {
|
void SecureContext::Initialize(Environment* env, Handle<Object> target) {
|
||||||
Local<FunctionTemplate> t = FunctionTemplate::New(SecureContext::New);
|
Local<FunctionTemplate> t = FunctionTemplate::New(SecureContext::New);
|
||||||
t->InstanceTemplate()->SetInternalFieldCount(1);
|
t->InstanceTemplate()->SetInternalFieldCount(1);
|
||||||
|
|
|
||||||
|
|
@ -509,6 +509,7 @@ class DiffieHellman : public ObjectWrap {
|
||||||
DH* dh;
|
DH* dh;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool EntropySource(unsigned char* buffer, size_t length);
|
||||||
void InitCrypto(v8::Handle<v8::Object> target);
|
void InitCrypto(v8::Handle<v8::Object> target);
|
||||||
|
|
||||||
} // namespace crypto
|
} // namespace crypto
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user