mnemonics: fix language detection with checksum word

If a checksum word is present, language detection would use
just the word prefixes. However, a set of word prefixes may
be found in more than one language, and so the wrong language
may be found first, which could then fail the checksum, since
the check may be done with a different unique prefix length
from the one it was created from.

We now make a checksum test when we we detect a language from
prefixes only, to make sure we have the correct one.
This commit is contained in:
moneromooo-monero 2017-01-15 10:48:44 +00:00
parent d98db4868d
commit f5f4109f9a
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3
2 changed files with 45 additions and 1 deletions

View file

@ -148,3 +148,22 @@ TEST(mnemonics, all_languages)
test_language(*(*it));
}
}
TEST(mnemonics, language_detection_with_bad_checksum)
{
crypto::secret_key key;
std::string language_name;
bool res;
// This Portuguese (4-prefix) seed has all its words with 3-prefix that's also present in English
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";
const std::string real_checksum = "gnostico";
res = crypto::ElectrumWords::words_to_bytes(base_seed, key, language_name);
ASSERT_EQ(true, res);
ASSERT_STREQ(language_name.c_str(), "Portuguese");
res = crypto::ElectrumWords::words_to_bytes(base_seed + " " + real_checksum, key, language_name);
ASSERT_EQ(true, res);
ASSERT_STREQ(language_name.c_str(), "Portuguese");
}