Skip to content

Commit 5627807

Browse files
committed
[Zerocoin] Fix limits for random number generators in GMP bignum implementation
1 parent 7e52f58 commit 5627807

File tree

5 files changed

+19
-14
lines changed

5 files changed

+19
-14
lines changed

src/libzerocoin/bignum.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,13 @@ class CBigNum
6868
* @param range The upper bound on the number.
6969
* @return
7070
*/
71-
static CBigNum randBignum(const CBigNum& range);
71+
static CBigNum randBignum(const CBigNum& range);
7272

7373
/** Generates a cryptographically secure random k-bit number
7474
* @param k The bit length of the number.
7575
* @return
7676
*/
77-
static CBigNum RandKBitBigum(const uint32_t k);
77+
static CBigNum randKBitBignum(const uint32_t k);
7878

7979
/**Returns the size in bits of the underlying bignum.
8080
*
@@ -122,7 +122,7 @@ class CBigNum
122122
* @param e the exponent as an int
123123
* @return
124124
*/
125-
CBigNum pow(const int e) const ;
125+
CBigNum pow(const int e) const;
126126

127127
/**
128128
* exponentiation this^e

src/libzerocoin/bignum_gmp.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,18 @@ CBigNum::CBigNum(const std::vector<unsigned char>& vch)
4848
setvch(vch);
4949
}
5050

51+
/** PRNGs use OpenSSL for consistency with seed initialization **/
52+
5153
/** Generates a cryptographically secure random number between zero and range exclusive
5254
* i.e. 0 < returned number < range
5355
* @param range The upper bound on the number.
5456
* @return
5557
*/
5658
CBigNum CBigNum::randBignum(const CBigNum& range)
5759
{
60+
if (range < 2)
61+
return 0;
62+
5863
size_t size = (mpz_sizeinbase (range.bn, 2) + CHAR_BIT-1) / CHAR_BIT;
5964
std::vector<unsigned char> buf(size);
6065

@@ -64,14 +69,14 @@ CBigNum CBigNum::randBignum(const CBigNum& range)
6469
CBigNum ret(buf);
6570
if (ret < 0)
6671
mpz_neg(ret.bn, ret.bn);
67-
return ret;
72+
return 1 + (ret % (range-1));
6873
}
6974

7075
/** Generates a cryptographically secure random k-bit number
7176
* @param k The bit length of the number.
7277
* @return
7378
*/
74-
CBigNum CBigNum::RandKBitBigum(const uint32_t k)
79+
CBigNum CBigNum::randKBitBignum(const uint32_t k)
7580
{
7681
std::vector<unsigned char> buf((k+7)/8);
7782

@@ -81,7 +86,7 @@ CBigNum CBigNum::RandKBitBigum(const uint32_t k)
8186
CBigNum ret(buf);
8287
if (ret < 0)
8388
mpz_neg(ret.bn, ret.bn);
84-
return ret;
89+
return ret % (CBigNum(1) << k);
8590
}
8691

8792
/**Returns the size in bits of the underlying bignum.
@@ -256,7 +261,7 @@ CBigNum CBigNum::inverse(const CBigNum& m) const
256261
*/
257262
CBigNum CBigNum::generatePrime(const unsigned int numBits, bool safe)
258263
{
259-
CBigNum rand = RandKBitBigum(numBits);
264+
CBigNum rand = randKBitBignum(numBits);
260265
CBigNum prime;
261266
mpz_nextprime(prime.bn, rand.bn);
262267
return prime;

src/libzerocoin/bignum_openssl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ CBigNum CBigNum::randBignum(const CBigNum& range)
7070
* @param k The bit length of the number.
7171
* @return
7272
*/
73-
CBigNum CBigNum::RandKBitBigum(const uint32_t k)
73+
CBigNum CBigNum::randKBitBignum(const uint32_t k)
7474
{
7575
CBigNum ret;
7676
if(!BN_rand(ret.bn, k, -1, 0)){

src/test/zerocoin_denomination_tests.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ BOOST_AUTO_TEST_CASE(zerocoin_spend_test241)
9191
nTotalAmount += currentAmount;
9292
CBigNum value;
9393
CBigNum rand;
94-
CBigNum serial = CBigNum::RandKBitBigum(256);
94+
CBigNum serial = CBigNum::randKBitBignum(256);
9595
bool isUsed = false;
9696
CMintMeta meta;
9797
meta.denom = denom;
@@ -175,7 +175,7 @@ BOOST_AUTO_TEST_CASE(zerocoin_spend_test115)
175175
nTotalAmount += currentAmount;
176176
CBigNum value;
177177
CBigNum rand;
178-
CBigNum serial = CBigNum::RandKBitBigum(256);
178+
CBigNum serial = CBigNum::randKBitBignum(256);
179179
bool isUsed = false;
180180
CMintMeta meta;
181181
meta.denom = denom;
@@ -259,7 +259,7 @@ BOOST_AUTO_TEST_CASE(zerocoin_spend_test_from_245)
259259
nTotalAmount += currentAmount;
260260
CBigNum value;
261261
CBigNum rand;
262-
CBigNum serial = CBigNum::RandKBitBigum(256);
262+
CBigNum serial = CBigNum::randKBitBignum(256);
263263
bool isUsed = false;
264264
CMintMeta meta;
265265
meta.denom = denom;
@@ -361,7 +361,7 @@ BOOST_AUTO_TEST_CASE(zerocoin_spend_test_from_145)
361361
nTotalAmount += currentAmount;
362362
CBigNum value;
363363
CBigNum rand;
364-
CBigNum serial = CBigNum::RandKBitBigum(256);
364+
CBigNum serial = CBigNum::randKBitBignum(256);
365365
bool isUsed = false;
366366
CMintMeta meta;
367367
meta.denom = denom;
@@ -467,7 +467,7 @@ BOOST_AUTO_TEST_CASE(zerocoin_spend_test99)
467467
nTotalAmount += currentAmount;
468468
CBigNum value;
469469
CBigNum rand;
470-
CBigNum serial = CBigNum::RandKBitBigum(256);
470+
CBigNum serial = CBigNum::randKBitBignum(256);
471471
bool isUsed = false;
472472
CMintMeta meta;
473473
meta.denom = denom;

src/test/zerocoin_implementation_tests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ BOOST_AUTO_TEST_CASE(checkzerocoinspend_test)
396396
//Get the checksum of the accumulator we use for the spend and also add it to our checksum map
397397
uint32_t nChecksum_v2 = GetChecksum(accumulator_v2.getValue());
398398
//AddAccumulatorChecksum(nChecksum_v2, accumulator_v2.getValue(), true);
399-
uint256 ptxHash = CBigNum::RandKBitBigum(256).getuint256();
399+
uint256 ptxHash = CBigNum::randKBitBignum(256).getuint256();
400400
CoinSpend coinSpend_v2(Params().Zerocoin_Params(false), Params().Zerocoin_Params(false), privateCoin_v2, accumulator_v2, nChecksum_v2, witness_v2, ptxHash, SpendType::SPEND);
401401

402402
BOOST_CHECK_MESSAGE(coinSpend_v2.HasValidSerial(Params().Zerocoin_Params(false)), "coinspend_v2 does not have a valid serial");

0 commit comments

Comments
 (0)