void RandAddSeedPerfmon() { RandAddSeed(); // This can take up to 2 seconds, so only do it every 10 minutes static int64 nLastPerfmon; if (GetTime() < nLastPerfmon + 10 * 60) return; nLastPerfmon = GetTime(); #ifdef __WXMSW__ // Don't need this on Linux, OpenSSL automatically uses /dev/urandom // Seed with the entire set of perfmon data unsigned char pdata[250000]; memset(pdata, 0, sizeof(pdata)); unsigned long nSize = sizeof(pdata); long ret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, "Global", NULL, NULL, pdata, &nSize); RegCloseKey(HKEY_PERFORMANCE_DATA); if (ret == ERROR_SUCCESS) { RAND_add(pdata, nSize, nSize/100.0); memset(pdata, 0, nSize); printf("%s RandAddSeed() %d bytes\n", DateTimeStrFormat("%x %H:%M", GetTime()).c_str(), nSize); } #endif }
CInit() { // Init openssl library multithreading support ppmutexOpenSSL = (boost::interprocess::interprocess_mutex**)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(boost::interprocess::interprocess_mutex*)); for (int i = 0; i < CRYPTO_num_locks(); i++) ppmutexOpenSSL[i] = new boost::interprocess::interprocess_mutex(); CRYPTO_set_locking_callback(locking_callback); #ifdef __WXMSW__ // Seed random number generator with screen scrape and other hardware sources RAND_screen(); #endif // Seed random number generator with performance counter RandAddSeed(); }
void CDB::Close() { if (!pdb) return; if (!vTxn.empty()) vTxn.front()->abort(); vTxn.clear(); pdb->close(0); delete pdb; pdb = NULL; dbenv.txn_checkpoint(0, 0, 0); CRITICAL_BLOCK(cs_db) --mapFileUseCount[strFile]; RandAddSeed(); }
CInit() { // Init OpenSSL library multithreading support ppmutexOpenSSL.reset(new CCriticalSection[CRYPTO_num_locks()]); CRYPTO_set_locking_callback(locking_callback); // OpenSSL can optionally load a config file which lists optional loadable modules and engines. // We don't use them so we don't require the config. However some of our libs may call functions // which attempt to load the config file, possibly resulting in an exit() or crash if it is missing // or corrupt. Explicitly tell OpenSSL not to try to load the file. The result for our libs will be // that the config appears to have been loaded and there are no modules/engines available. OPENSSL_no_config(); #ifdef WIN32 // Seed OpenSSL PRNG with current contents of the screen RAND_screen(); #endif // Seed OpenSSL PRNG with performance counter RandAddSeed(); }
void RandAddSeedPerfmon() { RandAddSeed(); #ifdef WIN32 // Don't need this on Linux, OpenSSL automatically uses /dev/urandom // Seed with the entire set of perfmon data // This can take up to 2 seconds, so only do it every 10 minutes static int64_t nLastPerfmon; if (GetTime() < nLastPerfmon + 10 * 60) return; nLastPerfmon = GetTime(); std::vector<unsigned char> vData(250000, 0); long ret = 0; unsigned long nSize = 0; const size_t nMaxSize = 10000000; // Bail out at more than 10MB of performance data while (true) { nSize = vData.size(); ret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, "Global", NULL, NULL, begin_ptr(vData), &nSize); if (ret != ERROR_MORE_DATA || vData.size() >= nMaxSize) break; vData.resize(std::max((vData.size() * 3) / 2, nMaxSize)); // Grow size of buffer exponentially } RegCloseKey(HKEY_PERFORMANCE_DATA); if (ret == ERROR_SUCCESS) { RAND_add(begin_ptr(vData), nSize, nSize / 100.0); memory_cleanse(begin_ptr(vData), nSize); LogPrint("rand", "%s: %lu bytes\n", __func__, nSize); } else { static bool warned = false; // Warn only once if (!warned) { LogPrint("INFO", "%s: Warning: RegQueryValueExA(HKEY_PERFORMANCE_DATA) failed with code %i\n", __func__, ret); warned = true; } } #endif }
CDB::CDB(const char* pszFile, const char* pszMode, bool fTxn) : pdb(NULL) { int ret; if (pszFile == NULL) return; bool fCreate = strchr(pszMode, 'c'); bool fReadOnly = (!strchr(pszMode, '+') && !strchr(pszMode, 'w')); unsigned int nFlags = DB_THREAD; if (fCreate) nFlags |= DB_CREATE; else if (fReadOnly) nFlags |= DB_RDONLY; if (!fReadOnly || fTxn) nFlags |= DB_AUTO_COMMIT; CRITICAL_BLOCK(cs_db) { if (!fDbEnvInit) { string strAppDir = GetAppDir(); string strLogDir = strAppDir + "\\database"; _mkdir(strLogDir.c_str()); printf("dbenv.open strAppDir=%s\n", strAppDir.c_str()); dbenv.set_lg_dir(strLogDir.c_str()); dbenv.set_lg_max(10000000); dbenv.set_lk_max_locks(10000); dbenv.set_lk_max_objects(10000); dbenv.set_errfile(fopen("db.log", "a")); /// debug ///dbenv.log_set_config(DB_LOG_AUTO_REMOVE, 1); /// causes corruption ret = dbenv.open(strAppDir.c_str(), DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN | DB_THREAD | DB_PRIVATE | DB_RECOVER, 0); if (ret > 0) throw runtime_error(strprintf("CDB() : error %d opening database environment\n", ret)); fDbEnvInit = true; } strFile = pszFile; ++mapFileUseCount[strFile]; } pdb = new Db(&dbenv, 0); ret = pdb->open(NULL, // Txn pointer pszFile, // Filename "main", // Logical db name DB_BTREE, // Database type nFlags, // Flags 0); if (ret > 0) { delete pdb; pdb = NULL; CRITICAL_BLOCK(cs_db) --mapFileUseCount[strFile]; strFile = ""; throw runtime_error(strprintf("CDB() : can't open database file %s, error %d\n", pszFile, ret)); } if (fCreate && !Exists(string("version"))) WriteVersion(VERSION); RandAddSeed(); }
void PaperWalletDialog::setModel(WalletModel *model) { RandAddSeed(); this->model = model; this->on_getNewAddress_clicked(); }
void RandomNumbers::platformAddPerformanceMonitorEntropy () { // VFALCO TODO Remove all this fancy stuff struct { int64 operator () () const { return time (NULL); } } GetTime; struct { void operator () () { struct { // VFALCO TODO clean this up int64 operator () () const { int64 nCounter = 0; #if BEAST_WIN32 QueryPerformanceCounter ((LARGE_INTEGER*)&nCounter); #else timeval t; gettimeofday (&t, NULL); nCounter = t.tv_sec * 1000000 + t.tv_usec; #endif return nCounter; } } GetPerformanceCounter; // Seed with CPU performance counter int64 nCounter = GetPerformanceCounter (); RAND_add (&nCounter, sizeof (nCounter), 1.5); memset (&nCounter, 0, sizeof (nCounter)); } } RandAddSeed; RandAddSeed (); // This can take up to 2 seconds, so only do it every 10 minutes static int64 nLastPerfmon; if (GetTime () < nLastPerfmon + 10 * 60) return; nLastPerfmon = GetTime (); #if BEAST_WIN32 // Don't need this on Linux, OpenSSL automatically uses /dev/urandom // Seed with the entire set of perfmon data unsigned char pdata[250000]; memset (pdata, 0, sizeof (pdata)); unsigned long nSize = sizeof (pdata); long ret = RegQueryValueExA (HKEY_PERFORMANCE_DATA, "Global", NULL, NULL, pdata, &nSize); RegCloseKey (HKEY_PERFORMANCE_DATA); if (ret == ERROR_SUCCESS) { RAND_add (pdata, nSize, nSize / 100.0); memset (pdata, 0, nSize); //printf("%s RandAddSeed() %d bytes\n", DateTimeStrFormat("%x %H:%M", GetTime()).c_str(), nSize); } #endif }