mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
rework early-random-seed a bit
This commit is contained in:
parent
d0cf343143
commit
6c3f5aca2a
@ -62,14 +62,6 @@ ConfigVariableDouble extractor_frequency
|
|||||||
ConfigVariableInt patcher_buffer_size
|
ConfigVariableInt patcher_buffer_size
|
||||||
("patcher-buffer-size", 4096);
|
("patcher-buffer-size", 4096);
|
||||||
|
|
||||||
ConfigVariableBool early_random_seed
|
|
||||||
("early-random-seed", true,
|
|
||||||
PRC_DESC("Configure this true (the default) to compute the SSL random seed "
|
|
||||||
"early on in the application (specifically, when the first "
|
|
||||||
"HTTPClient is created), or false to defer this until it is actually "
|
|
||||||
"needed, causing a delay the first time a https connection is "
|
|
||||||
"attempted."));
|
|
||||||
|
|
||||||
ConfigVariableBool verify_ssl
|
ConfigVariableBool verify_ssl
|
||||||
("verify-ssl", true,
|
("verify-ssl", true,
|
||||||
PRC_DESC("Configure this true (the default) to insist on verifying all SSL "
|
PRC_DESC("Configure this true (the default) to insist on verifying all SSL "
|
||||||
@ -156,9 +148,50 @@ ConfigVariableList http_username
|
|||||||
"If the server or realm is empty, they will match anything."));
|
"If the server or realm is empty, they will match anything."));
|
||||||
|
|
||||||
ConfigureFn(config_downloader) {
|
ConfigureFn(config_downloader) {
|
||||||
|
init_libdownloader();
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: init_libdownloader
|
||||||
|
// Description: Initializes the library. This must be called at
|
||||||
|
// least once before any of the functions or classes in
|
||||||
|
// this library can be used. Normally it will be
|
||||||
|
// called by the static initializers and need not be
|
||||||
|
// called explicitly, but special cases exist.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void
|
||||||
|
init_libdownloader() {
|
||||||
|
static bool initialized = false;
|
||||||
|
if (initialized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
initialized = true;
|
||||||
|
|
||||||
#ifdef HAVE_SSL
|
#ifdef HAVE_SSL
|
||||||
HTTPChannel::init_type();
|
HTTPChannel::init_type();
|
||||||
|
|
||||||
|
// We need to define this here, rather than above, to guarantee that
|
||||||
|
// it has been initialized by the time we check it.
|
||||||
|
ConfigVariableBool early_random_seed
|
||||||
|
("early-random-seed", false,
|
||||||
|
PRC_DESC("Configure this true to compute the SSL random seed "
|
||||||
|
"early on in the application (specifically, when the libpandaexpress "
|
||||||
|
"library is loaded), or false to defer this until it is actually "
|
||||||
|
"needed (which will be the first time you open an https connection "
|
||||||
|
"or otherwise use encryption services). You can also call "
|
||||||
|
"HTTPClient::initialize_ssl() to "
|
||||||
|
"do this when you are ready. The issue is that on Windows, "
|
||||||
|
"OpenSSL will attempt to "
|
||||||
|
"randomize its seed by crawling through the entire heap of "
|
||||||
|
"allocated memory, which can be extremely large in a Panda "
|
||||||
|
"application, especially if you have already opened a window and "
|
||||||
|
"started rendering; and so this can take as much as 30 seconds "
|
||||||
|
"or more. For this reason it is best to initialize the random "
|
||||||
|
"seed at startup, when the application is still very small."));
|
||||||
|
if (early_random_seed) {
|
||||||
|
HTTPClient::init_random_seed();
|
||||||
|
}
|
||||||
|
|
||||||
PandaSystem *ps = PandaSystem::get_global_ptr();
|
PandaSystem *ps = PandaSystem::get_global_ptr();
|
||||||
ps->add_system("OpenSSL");
|
ps->add_system("OpenSSL");
|
||||||
#endif
|
#endif
|
||||||
|
@ -46,7 +46,6 @@ extern ConfigVariableDouble extractor_frequency;
|
|||||||
|
|
||||||
extern ConfigVariableInt patcher_buffer_size;
|
extern ConfigVariableInt patcher_buffer_size;
|
||||||
|
|
||||||
extern ConfigVariableBool early_random_seed;
|
|
||||||
extern ConfigVariableBool verify_ssl;
|
extern ConfigVariableBool verify_ssl;
|
||||||
extern ConfigVariableString ssl_cipher_list;
|
extern ConfigVariableString ssl_cipher_list;
|
||||||
extern ConfigVariableList expected_ssl_server;
|
extern ConfigVariableList expected_ssl_server;
|
||||||
@ -64,4 +63,6 @@ extern ConfigVariableFilename http_client_certificate_filename;
|
|||||||
extern ConfigVariableString http_client_certificate_passphrase;
|
extern ConfigVariableString http_client_certificate_passphrase;
|
||||||
extern ConfigVariableList http_username;
|
extern ConfigVariableList http_username;
|
||||||
|
|
||||||
|
extern EXPCL_PANDAEXPRESS void init_libdownloader();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -193,6 +193,29 @@ HTTPClient::
|
|||||||
unload_client_certificate();
|
unload_client_certificate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: HTTPClient::init_random_seed
|
||||||
|
// Access: Published, Static
|
||||||
|
// Description: This may be called once, presumably at the beginning
|
||||||
|
// of an application, to initialize OpenSSL's random
|
||||||
|
// seed. On Windows, it is particularly important to
|
||||||
|
// call this at startup if you are going to be perfoming
|
||||||
|
// any https operations or otherwise use encryption,
|
||||||
|
// since the Windows algorithm for getting a random seed
|
||||||
|
// takes 2-3 seconds at startup, but can take 30 seconds
|
||||||
|
// or more after you have opened a 3-D graphics window
|
||||||
|
// and started rendering.
|
||||||
|
//
|
||||||
|
// There is no harm in calling this method multiple
|
||||||
|
// times, or in not calling it at all.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void HTTPClient::
|
||||||
|
init_random_seed() {
|
||||||
|
// This call is sufficient to kick OpenSSL into generating its
|
||||||
|
// random seed if it hasn't already.
|
||||||
|
RAND_status();
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: HTTPClient::set_proxy_spec
|
// Function: HTTPClient::set_proxy_spec
|
||||||
// Access: Published
|
// Access: Published
|
||||||
@ -1354,13 +1377,6 @@ unload_client_certificate() {
|
|||||||
void HTTPClient::
|
void HTTPClient::
|
||||||
initialize_ssl() {
|
initialize_ssl() {
|
||||||
OpenSSL_add_all_algorithms();
|
OpenSSL_add_all_algorithms();
|
||||||
|
|
||||||
// Call RAND_status() here to force the random number generator to
|
|
||||||
// initialize early.
|
|
||||||
if (early_random_seed) {
|
|
||||||
RAND_status();
|
|
||||||
}
|
|
||||||
|
|
||||||
_ssl_initialized = true;
|
_ssl_initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,6 +65,8 @@ PUBLISHED:
|
|||||||
void operator = (const HTTPClient ©);
|
void operator = (const HTTPClient ©);
|
||||||
~HTTPClient();
|
~HTTPClient();
|
||||||
|
|
||||||
|
static void init_random_seed();
|
||||||
|
|
||||||
void set_proxy_spec(const string &proxy_spec);
|
void set_proxy_spec(const string &proxy_spec);
|
||||||
string get_proxy_spec() const;
|
string get_proxy_spec() const;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user