unit_tests: fix mnemonics unit test testing invalid seeds
Some word triplets, such as "mugged names nail", are not valid results from any 32 bit value. If used to decode a 32 bit value, the result will therefore encode to a different word triplet. Fix this by using random words converted from an actual random bitstring, ensuring we always get valid triplets.
This commit is contained in:
parent
cf88e4dd24
commit
c4344800eb
|
@ -44,16 +44,6 @@
|
|||
|
||||
namespace
|
||||
{
|
||||
/*!
|
||||
* \brief Returns random index from 0 to max-1
|
||||
* \param max Range maximum
|
||||
* \return required random index
|
||||
*/
|
||||
uint32_t get_random_index(int max)
|
||||
{
|
||||
return rand() % max;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Compares vectors for equality
|
||||
* \param expected expected vector
|
||||
|
@ -78,11 +68,17 @@ namespace
|
|||
const std::vector<std::string> &word_list = language.get_word_list();
|
||||
std::string seed = "", return_seed = "";
|
||||
// Generate a random seed without checksum
|
||||
for (int ii = 0; ii < crypto::ElectrumWords::seed_length; ii++)
|
||||
crypto::secret_key randkey;
|
||||
for (size_t ii = 0; ii < sizeof(randkey); ++ii)
|
||||
{
|
||||
seed += (word_list[get_random_index(word_list.size())] + ' ');
|
||||
randkey.data[ii] = rand();
|
||||
}
|
||||
seed.pop_back();
|
||||
crypto::ElectrumWords::bytes_to_words(randkey, seed, language.get_language_name());
|
||||
// remove the checksum word
|
||||
const char *space = strrchr(seed.c_str(), ' ');
|
||||
ASSERT_TRUE(space != NULL);
|
||||
seed = std::string(seed.c_str(), space-seed.c_str());
|
||||
|
||||
std::cout << "Test seed without checksum:\n";
|
||||
std::cout << seed << std::endl;
|
||||
|
||||
|
|
Loading…
Reference in New Issue