30#include "gtest/gtest.h"
39#include <boost/algorithm/string.hpp>
55#include <boost/algorithm/string.hpp>
64 void compare_vectors(
const std::vector<std::string> &expected,
const std::vector<std::string> &present)
66 std::vector<std::string>::const_iterator it1, it2;
67 for (it1 = expected.begin(), it2 = present.begin(); it1 != expected.end() && it2 != present.end();
81 std::string seed, return_seed;
84 for (
size_t ii = 0; ii <
sizeof(randkey); ++ii)
86 randkey.data[ii] =
rand();
89 seed = std::string(w_seed.
data(), w_seed.
size());
91 const char *space = strrchr(seed.c_str(),
' ');
93 seed = std::string(seed.c_str(), space-seed.c_str());
95 std::cout <<
"Test seed without checksum:\n";
96 std::cout << seed << std::endl;
99 std::string language_name;
101 std::vector<std::string> seed_vector, return_seed_vector;
102 std::string checksum_word;
107 std::cout <<
"Detected language: " << language_name << std::endl;
112 return_seed = std::string(w_return_seed.data(), w_return_seed.size());
114 std::cout <<
"Returned seed:\n";
115 std::cout << return_seed << std::endl;
116 boost::split(seed_vector, seed, boost::is_any_of(
" "));
117 boost::split(return_seed_vector, return_seed, boost::is_any_of(
" "));
120 checksum_word = return_seed_vector.back();
121 return_seed_vector.pop_back();
122 ASSERT_EQ(seed_vector.size(), return_seed_vector.size());
124 compare_vectors(seed_vector, return_seed_vector);
127 seed += (
" " + checksum_word);
128 std::cout <<
"Test seed with checksum:\n";
129 std::cout << seed << std::endl;
132 std::cout <<
"Detected language: " << language_name << std::endl;
137 return_seed = std::string(w_return_seed.data(), w_return_seed.size());
139 std::cout <<
"Returned seed:\n";
140 std::cout << return_seed << std::endl;
143 return_seed_vector.clear();
144 boost::split(seed_vector, seed, boost::is_any_of(
" "));
145 boost::split(return_seed_vector, return_seed, boost::is_any_of(
" "));
146 ASSERT_EQ(seed_vector.size(), return_seed_vector.size());
147 compare_vectors(seed_vector, return_seed_vector);
154 std::vector<std::string> language_list;
157 catch(
const std::exception &e)
159 std::cout <<
"Error initializing mnemonics: " << e.what() << std::endl;
167 std::vector<Language::Base*> languages({
182 for (std::vector<Language::Base*>::iterator it = languages.begin(); it != languages.end(); it++)
185 test_language(*(*it));
187 catch (
const std::exception &e) {
188 std::cout <<
"Error testing " << (*it)->get_language_name() <<
" language: " << e.what() << std::endl;
194TEST(mnemonics, language_detection_with_bad_checksum)
197 std::string language_name;
201 const std::string base_seed =
"cinzento luxuriante leonardo gnostico digressao cupula fifa broxar iniquo louvor ovario dorsal ideologo besuntar decurso rosto susto lemure unheiro pagodeiro nitroglicerina eclusa mazurca bigorna";
202 const std::string real_checksum =
"gnostico";
232 std::string language_name_1;
233 const std::string seed_1 =
"Neubau umarmen Abart umarmen Turban feilen Brett Bargeld Episode Milchkuh Substanz Jahr Armband Maibaum Tand Grünalge Tabak erziehen Federboa Lobrede Tenor Leuchter Curry Diskurs Tenor";
239 std::string language_name_2;
241 std::string seed_2 =
"neubau umarmen Abart umarmen Turban feilen Brett Bargeld Episode Milchkuh Substanz Jahr Armband Maibaum Tand Grünalge Tabak erziehen Federboa Lobrede Tenor Leuchter Curry Diskurs tenor";
242 boost::algorithm::to_lower(seed_2);
250TEST(mnemonics, partial_word_tolerance)
255 std::string language_name_1;
256 const std::string seed_1 =
"crim bam scamp gna limi woma wron tuit birth mundane donuts square cohesive dolphin titans narrate fue saved wrap aloof magic mirr toget upda wra";
Simplified Chinese word list and map.
A base language class which all languages have to inherit from for Polymorphism.
const std::string & get_language_name() const
Returns the name of the language.
const char * data() const noexcept
size_t size() const noexcept
New Dutch word list and map.
Mnemonic seed generation and wallet restoration from them.
New English word list and map.
Older version of English word list and map.
New Esperanto word list and map.
#define ASSERT_EQ(val1, val2)
#define ASSERT_STREQ(s1, s2)
#define TEST(test_case_name, test_name)
#define ASSERT_TRUE(condition)
French word list and map.
German word list and map.
Italian word list and map.
Japanese word list and map.
Language Base class for Polymorphism.
New Lojban word list and map.
T utf8prefix(const T &s, size_t count)
Returns a string made of (at most) the first count characters in s. Assumes well formedness....
std::vector< const Language::Base * > get_language_list()
bool words_to_bytes(const epee::wipeable_string &words, epee::wipeable_string &dst, size_t len, bool duplicate, std::string &language_name)
Converts seed words to bytes (secret key).
bool bytes_to_words(const char *src, size_t len, epee::wipeable_string &words, const std::string &language_name)
Converts bytes (secret key) to seed words.
epee::mlocked< tools::scrubbed< ec_scalar > > secret_key
void rand(size_t N, uint8_t *bytes)
Portuguese word list and map.
Russian word list and map.
A singleton helper class based on template.
Spanish word list and map.