2014-06-26 05:41:53 -07:00
|
|
|
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
2014-12-16 17:47:57 -08:00
|
|
|
// Copyright (c) 2009-2014 The Bitcoin Core developers
|
2023-01-23 10:31:54 -08:00
|
|
|
// Copyright (c) 2016-2023 The Zcash developers
|
2014-12-12 20:09:33 -08:00
|
|
|
// Distributed under the MIT software license, see the accompanying
|
2019-07-18 07:16:09 -07:00
|
|
|
// file COPYING or https://www.opensource.org/licenses/mit-license.php .
|
2014-06-26 05:41:53 -07:00
|
|
|
|
|
|
|
#include "random.h"
|
|
|
|
|
2015-01-20 16:23:25 -08:00
|
|
|
#include "support/cleanse.h"
|
2014-06-26 05:41:53 -07:00
|
|
|
#ifdef WIN32
|
|
|
|
#include "compat.h" // for Windows API
|
|
|
|
#endif
|
2018-05-15 02:27:14 -07:00
|
|
|
#include "logging.h" // for LogPrint()
|
2018-10-22 15:51:11 -07:00
|
|
|
#include "util/time.h" // for GetTime()
|
2014-06-26 05:41:53 -07:00
|
|
|
|
2014-09-14 03:43:56 -07:00
|
|
|
#include <limits>
|
|
|
|
|
2014-06-26 05:41:53 -07:00
|
|
|
#ifndef WIN32
|
2018-05-15 02:27:14 -07:00
|
|
|
#include <fcntl.h>
|
2014-06-26 05:41:53 -07:00
|
|
|
#include <sys/time.h>
|
|
|
|
#endif
|
2014-09-14 03:43:56 -07:00
|
|
|
|
2020-07-13 22:34:03 -07:00
|
|
|
#include <librustzcash.h>
|
2014-06-26 05:41:53 -07:00
|
|
|
|
|
|
|
static inline int64_t GetPerformanceCounter()
|
|
|
|
{
|
|
|
|
int64_t nCounter = 0;
|
|
|
|
#ifdef WIN32
|
|
|
|
QueryPerformanceCounter((LARGE_INTEGER*)&nCounter);
|
|
|
|
#else
|
|
|
|
timeval t;
|
|
|
|
gettimeofday(&t, NULL);
|
|
|
|
nCounter = (int64_t)(t.tv_sec * 1000000 + t.tv_usec);
|
|
|
|
#endif
|
|
|
|
return nCounter;
|
|
|
|
}
|
|
|
|
|
2016-10-28 19:03:55 -07:00
|
|
|
void GetRandBytes(unsigned char* buf, size_t num)
|
2014-06-26 05:41:53 -07:00
|
|
|
{
|
2020-07-13 22:34:03 -07:00
|
|
|
librustzcash_getrandom(buf, num);
|
2014-06-26 05:41:53 -07:00
|
|
|
}
|
|
|
|
|
2023-04-14 18:08:04 -07:00
|
|
|
uint128_t GetRandUInt128(uint128_t nMax)
|
2014-06-26 05:41:53 -07:00
|
|
|
{
|
2023-04-14 18:08:04 -07:00
|
|
|
return GetRandGeneric(nMax);
|
|
|
|
}
|
2014-06-26 05:41:53 -07:00
|
|
|
|
2023-04-14 18:08:04 -07:00
|
|
|
int128_t GetRandInt128(int128_t nMax)
|
|
|
|
{
|
2023-04-18 04:44:43 -07:00
|
|
|
assert(nMax >= 0);
|
2023-04-14 18:08:04 -07:00
|
|
|
return GetRandUInt128(nMax);
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t GetRand(uint64_t nMax)
|
|
|
|
{
|
|
|
|
return GetRandGeneric(nMax);
|
2014-06-26 05:41:53 -07:00
|
|
|
}
|
|
|
|
|
2023-02-03 02:38:25 -08:00
|
|
|
int64_t GetRandInt64(int64_t nMax)
|
|
|
|
{
|
2023-04-18 04:44:43 -07:00
|
|
|
assert(nMax >= 0);
|
2023-02-03 02:38:25 -08:00
|
|
|
return GetRand(nMax);
|
|
|
|
}
|
|
|
|
|
2014-06-26 05:41:53 -07:00
|
|
|
int GetRandInt(int nMax)
|
|
|
|
{
|
2023-04-18 04:44:43 -07:00
|
|
|
assert(nMax >= 0);
|
2014-06-26 05:41:53 -07:00
|
|
|
return GetRand(nMax);
|
|
|
|
}
|
|
|
|
|
|
|
|
uint256 GetRandHash()
|
|
|
|
{
|
|
|
|
uint256 hash;
|
|
|
|
GetRandBytes((unsigned char*)&hash, sizeof(hash));
|
|
|
|
return hash;
|
|
|
|
}
|
|
|
|
|
2017-02-15 17:45:22 -08:00
|
|
|
void FastRandomContext::RandomSeed()
|
2014-06-26 05:41:53 -07:00
|
|
|
{
|
2017-02-15 17:45:22 -08:00
|
|
|
uint256 seed = GetRandHash();
|
|
|
|
rng.SetKey(seed.begin(), 32);
|
|
|
|
requires_seed = false;
|
|
|
|
}
|
|
|
|
|
2017-05-02 11:04:31 -07:00
|
|
|
uint256 FastRandomContext::rand256()
|
|
|
|
{
|
|
|
|
if (bytebuf_size < 32) {
|
|
|
|
FillByteBuffer();
|
|
|
|
}
|
|
|
|
uint256 ret;
|
|
|
|
memcpy(ret.begin(), bytebuf + 64 - bytebuf_size, 32);
|
|
|
|
bytebuf_size -= 32;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::vector<unsigned char> FastRandomContext::randbytes(size_t len)
|
|
|
|
{
|
|
|
|
std::vector<unsigned char> ret(len);
|
|
|
|
if (len > 0) {
|
|
|
|
rng.Output(&ret[0], len);
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2017-02-15 17:45:22 -08:00
|
|
|
FastRandomContext::FastRandomContext(const uint256& seed) : requires_seed(false), bytebuf_size(0), bitbuf_size(0)
|
|
|
|
{
|
|
|
|
rng.SetKey(seed.begin(), 32);
|
2014-06-26 05:41:53 -07:00
|
|
|
}
|
2016-11-05 14:12:41 -07:00
|
|
|
|
|
|
|
int GenIdentity(int n)
|
|
|
|
{
|
|
|
|
return n-1;
|
|
|
|
}
|
2017-02-15 17:45:22 -08:00
|
|
|
|
|
|
|
FastRandomContext::FastRandomContext(bool fDeterministic) : requires_seed(!fDeterministic), bytebuf_size(0), bitbuf_size(0)
|
|
|
|
{
|
|
|
|
if (!fDeterministic) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
uint256 seed;
|
|
|
|
rng.SetKey(seed.begin(), 32);
|
|
|
|
}
|