diff options
author | Riccardo Spagni <ric@spagni.net> | 2017-01-15 14:58:09 -0500 |
---|---|---|
committer | Riccardo Spagni <ric@spagni.net> | 2017-01-15 14:58:09 -0500 |
commit | b2e1568335228869de84ac39bb74f5589bc1b6db (patch) | |
tree | e6c812cc5046a6ab6bf56485fe4df312da789af1 /src | |
parent | Merge pull request #1577 (diff) | |
parent | mnemonics: fix language detection with checksum word (diff) | |
download | monero-b2e1568335228869de84ac39bb74f5589bc1b6db.tar.xz |
Merge pull request #1579
f5f4109f mnemonics: fix language detection with checksum word (moneromooo-monero)
Diffstat (limited to 'src')
-rw-r--r-- | src/mnemonics/electrum-words.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/mnemonics/electrum-words.cpp b/src/mnemonics/electrum-words.cpp index 33d36d2d0..f0e254ba4 100644 --- a/src/mnemonics/electrum-words.cpp +++ b/src/mnemonics/electrum-words.cpp @@ -64,12 +64,15 @@ namespace { + uint32_t create_checksum_index(const std::vector<std::string> &word_list, + uint32_t unique_prefix_length); + bool checksum_test(std::vector<std::string> seed, uint32_t unique_prefix_length); /*! * \brief Finds the word list that contains the seed words and puts the indices * where matches occured in matched_indices. * \param seed List of words to match. - * \param has_checksum If word list passed checksum test, we need to only do a prefix check. + * \param has_checksum The seed has a checksum word (maybe not checked). * \param matched_indices The indices where the seed words were found are added to this. * \param language Language instance pointer to write to after it is found. * \return true if all the words were present in some language false if not. @@ -88,6 +91,7 @@ namespace Language::Singleton<Language::Russian>::instance(), Language::Singleton<Language::OldEnglish>::instance() }); + Language::Base *fallback = NULL; // Iterate through all the languages and find a match for (std::vector<Language::Base*>::iterator it1 = language_instances.begin(); @@ -126,12 +130,33 @@ namespace } if (full_match) { + // if we were using prefix only, and we have a checksum, check it now + // to avoid false positives due to prefix set being too common + if (has_checksum) + if (!checksum_test(seed, (*it1)->get_unique_prefix_length())) + { + fallback = *it1; + full_match = false; + } + } + if (full_match) + { *language = *it1; return true; } // Some didn't match. Clear the index array. matched_indices.clear(); } + + // if we get there, we've not found a good match, but we might have a fallback, + // if we detected a match which did not fit the checksum, which might be a badly + // typed/transcribed seed in the right language + if (fallback) + { + *language = fallback; + return true; + } + return false; } |