Skip to content

Commit

Permalink
Additional comments for the testing PRNG and a seeding fix.
Browse files Browse the repository at this point in the history
Rw has additional short-cycle inputs because 2^32/0x464fffff >= 2.
  • Loading branch information
gmaxwell committed Feb 7, 2015
1 parent 6efd6e7 commit 34b898d
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 2 deletions.
4 changes: 3 additions & 1 deletion src/testrand.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
#include "libsecp256k1-config.h"
#endif

/** Seed the pseudorandom number generator. */
/* A non-cryptographic RNG used only for test infrastructure. */

/** Seed the pseudorandom number generator for testing. */
SECP256K1_INLINE static void secp256k1_rand_seed(uint64_t v);

/** Generate a pseudorandom 32-bit number. */
Expand Down
6 changes: 5 additions & 1 deletion src/testrand_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,19 @@ SECP256K1_INLINE static void secp256k1_rand_seed(uint64_t v) {
secp256k1_Rz = v >> 32;
secp256k1_Rw = v;

/* There are two seeds with short (length 1) cycles for the Rz PRNG. */
if (secp256k1_Rz == 0 || secp256k1_Rz == 0x9068ffffU) {
secp256k1_Rz = 111;
}
if (secp256k1_Rw == 0 || secp256k1_Rw == 0x464fffffU) {
/* There are four seeds with short (length 1) cycles for the Rw PRNG. */
if (secp256k1_Rw == 0 || secp256k1_Rw == 0x464fffffU ||
secp256k1_Rw == 0x8c9ffffeU || secp256k1_Rw == 0xd2effffdU) {
secp256k1_Rw = 111;
}
}

SECP256K1_INLINE static uint32_t secp256k1_rand32(void) {
/* MWC PRNG for tests. */
secp256k1_Rz = 36969 * (secp256k1_Rz & 0xFFFF) + (secp256k1_Rz >> 16);
secp256k1_Rw = 18000 * (secp256k1_Rw & 0xFFFF) + (secp256k1_Rw >> 16);
return (secp256k1_Rw << 16) + (secp256k1_Rw >> 16) + secp256k1_Rz;
Expand Down

0 comments on commit 34b898d

Please sign in to comment.