From d579879d71352b2a271aeeff5911fef1d309506f Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 4 Apr 2023 14:08:53 +0200 Subject: [PATCH 1/4] common/include/eoskeygen/key_search.hpp: make prefix into a variable (we need it for k1 keys). --- common/include/eoskeygen/key_search.hpp | 6 ++++++ common/src/key_search.cpp | 12 +++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/common/include/eoskeygen/key_search.hpp b/common/include/eoskeygen/key_search.hpp index 21e3c2a..040023a 100644 --- a/common/include/eoskeygen/key_search.hpp +++ b/common/include/eoskeygen/key_search.hpp @@ -47,6 +47,8 @@ public : public : KeySearch(); + void setPrefix(const std::string& prefix); + // Add a word to search for. void addWord(const std::string& str); @@ -97,6 +99,10 @@ protected : void _search_linear(); protected : + + // Public key prefix. + std::string m_prefix; + // List of words to search for. strlist_t m_words; diff --git a/common/src/key_search.cpp b/common/src/key_search.cpp index f7af039..7b8c086 100644 --- a/common/src/key_search.cpp +++ b/common/src/key_search.cpp @@ -31,6 +31,7 @@ namespace eoskeygen { KeySearch::KeySearch() : + m_prefix ("EOS"), m_max (0), m_count (0), #ifdef EOSIOKEYGEN_HAVE_THREADS @@ -40,6 +41,11 @@ KeySearch::KeySearch() : { } +void KeySearch::setPrefix(const std::string& prefix) +{ + m_prefix = prefix; +} + void KeySearch::addWord(const std::string& str) { std::string tmp = str; @@ -107,14 +113,14 @@ void KeySearch::find(size_t num_results) bool KeySearch::_contains_word(const struct libeosio::ec_keypair* key, struct result& result) { - // skip first 3 chars, as those are always "EOS" - std::string pubstr = libeosio::wif_pub_encode(key->pub).substr(3); + size_t prefix_len = m_prefix.length(); + std::string pubstr = libeosio::wif_pub_encode(key->pub, m_prefix).substr(prefix_len); strtolower(pubstr); for(auto const& w: m_words) { size_t p = pubstr.find(w); if (p != std::string::npos) { - result.pos = p + 3; + result.pos = p + prefix_len; result.len = w.length(); return true; } From cbe6902d0376f576bc38b5842b37d2b4ec05234f Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 4 Apr 2023 19:05:48 +0200 Subject: [PATCH 2/4] common/cmake/libeosio.cmake: Use libeosio v0.1.7 --- common/cmake/libeosio.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/cmake/libeosio.cmake b/common/cmake/libeosio.cmake index 11c5d15..780f05f 100644 --- a/common/cmake/libeosio.cmake +++ b/common/cmake/libeosio.cmake @@ -2,7 +2,7 @@ # Variables # -------------------------------- set( LIBEOSIO_GIT_URL "https://github.com/eosswedenorg/libeosio.git" ) -set( LIBEOSIO_WANTED_VERSION v0.1.6 ) +set( LIBEOSIO_WANTED_VERSION v0.1.7 ) # -------------------------------- # Macros From e18886e074bbe510c1181fc6482111cb13faa322 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 4 Apr 2023 18:58:14 +0200 Subject: [PATCH 3/4] cli: implement support for K1 keys (default, can be switched with --legacy flag) --- cli/src/cli_key_search_result.cpp | 13 +++++++------ cli/src/cli_key_search_result.hpp | 5 +++-- cli/src/main.cpp | 21 +++++++++++++++------ 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/cli/src/cli_key_search_result.cpp b/cli/src/cli_key_search_result.cpp index fa3d009..d0cc9fd 100644 --- a/cli/src/cli_key_search_result.cpp +++ b/cli/src/cli_key_search_result.cpp @@ -38,22 +38,23 @@ static size_t highlight(console::Color color, const std::string& str, size_t pos return len; } -CliKeySearchResult::CliKeySearchResult(const Dictionary& dict, const std::string& prefix) : +CliKeySearchResult::CliKeySearchResult(const Dictionary& dict, const libeosio::wif_codec_t& codec) : m_dict (dict), -m_prefix (prefix) +m_codec (codec) { } void CliKeySearchResult::onResult(const struct libeosio::ec_keypair* key, const struct KeySearch::result& result) { - std::string pub = libeosio::wif_pub_encode(key->pub); + std::string pub = libeosio::wif_pub_encode(key->pub, m_codec.pub); Dictionary::search_result_t dict_res = m_dict.search(pub); + int pub_prefix_len = (int) m_codec.pub.length(); std::cout << "----" << std::endl; std::cout << "Found: " << pub.substr(result.pos, result.len) << std::endl; - std::cout << "Public: " << m_prefix.substr(0, 3); - for(size_t i = 3; i < pub.length(); ) { + std::cout << "Public: " << m_codec.pub; + for(size_t i = pub_prefix_len; i < pub.length(); ) { if (i == result.pos) { i += highlight(console::red, pub, result.pos, result.len); @@ -70,7 +71,7 @@ void CliKeySearchResult::onResult(const struct libeosio::ec_keypair* key, const } std::cout << std::endl - << "Private: " << libeosio::wif_priv_encode(key->secret) << std::endl; + << "Private: " << libeosio::wif_priv_encode(key->secret, m_codec.pvt) << std::endl; } } // namespace eoskeygen diff --git a/cli/src/cli_key_search_result.hpp b/cli/src/cli_key_search_result.hpp index a81a877..254ee8f 100644 --- a/cli/src/cli_key_search_result.hpp +++ b/cli/src/cli_key_search_result.hpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -37,7 +38,7 @@ class Dictionary; class CliKeySearchResult : public IKeySearchResult { public: - CliKeySearchResult(const Dictionary& dict, const std::string& prefix); + CliKeySearchResult(const Dictionary& dict, const libeosio::wif_codec_t& codec); virtual void onResult(const struct libeosio::ec_keypair* key, const struct KeySearch::result& result); @@ -45,7 +46,7 @@ protected : const Dictionary& m_dict; - std::string m_prefix; + libeosio::wif_codec_t m_codec; }; } // namespace eoskeygen diff --git a/cli/src/main.cpp b/cli/src/main.cpp index 74a7aa0..ddb8dc6 100644 --- a/cli/src/main.cpp +++ b/cli/src/main.cpp @@ -40,7 +40,7 @@ // Command line options. bool option_l33t = false; -std::string key_prefix = "EOS"; +libeosio::wif_codec_t key_codec; #ifdef EOSIOKEYGEN_HAVE_THREADS size_t option_num_threads; @@ -65,8 +65,9 @@ public: int cmd_search(const eoskeygen::strlist_t& words, const eoskeygen::Dictionary& dict, int count) { eoskeygen::KeySearch ks; - eoskeygen::CliKeySearchResult rs(dict, key_prefix); + eoskeygen::CliKeySearchResult rs(dict, key_codec); + ks.setPrefix(key_codec.pub); ks.setCallback(&rs); for(auto it = words.begin(); it != words.end(); it++) { @@ -122,6 +123,7 @@ int main(int argc, char **argv) { std::vector dict_list; std::vector lang_list; std::string search_words; + std::string key_format; int search_count; size_t bench_count; int rc = 0; @@ -129,7 +131,7 @@ int main(int argc, char **argv) { libeosio::ec_init(); CLI::Option* version = cmd.add_flag("-v,--version", "Show version"); - CLI::Option* fio = cmd.add_flag("--fio", "Generate keys from FIO network instead of EOSIO."); + cmd.add_option("--format", key_format, "valid values: K1, fio, legacy")->default_val("K1"); // Search CLI::App* search_cmd = cmd.add_subcommand("search", @@ -171,8 +173,15 @@ int main(int argc, char **argv) { goto end; } - if (*fio) { - key_prefix = "FIO"; + if (key_format == "fio") { + key_codec = libeosio::wif_create_legacy_codec("FIO"); + } else if (key_format == "legacy") { + key_codec = libeosio::WIF_CODEC_LEG; + } else if (key_format == "K1") { + key_codec = libeosio::WIF_CODEC_K1; + } else { + std::cerr << "invalid key format: " << key_format << std::endl; + goto end; } if (search_cmd->parsed()) { @@ -229,7 +238,7 @@ int main(int argc, char **argv) { else { struct libeosio::ec_keypair pair; libeosio::ec_generate_key(&pair); - libeosio::wif_print_key(&pair, key_prefix); + libeosio::wif_print_key(&pair, key_codec); goto end; } From 9ed6e6ab80d81089c5f91072a10514fe86572528 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 4 Apr 2023 19:06:55 +0200 Subject: [PATCH 4/4] gui: implement support for K1 keys. --- gui/src/GenerateWindow.cpp | 8 +++--- gui/src/MainWindow.cpp | 53 +++++++++++++++++++++++++++++++------- gui/src/MainWindow.hpp | 8 ++++-- gui/src/SearchWindow.cpp | 13 +++++++--- gui/src/Settings.cpp | 12 ++++----- gui/src/Settings.hpp | 6 +++-- 6 files changed, 73 insertions(+), 27 deletions(-) diff --git a/gui/src/GenerateWindow.cpp b/gui/src/GenerateWindow.cpp index 8880ffb..fa8711c 100644 --- a/gui/src/GenerateWindow.cpp +++ b/gui/src/GenerateWindow.cpp @@ -92,14 +92,16 @@ m_btn_copy_both ("Copy keys") void GenerateWindow::generate_key() { - std::string pubstr; + std::string pubstr, pvtstr; struct libeosio::ec_keypair pair; + const libeosio::wif_codec_t& codec = Settings::getKeyCodec(); libeosio::ec_generate_key(&pair); - pubstr = libeosio::wif_pub_encode(pair.pub, Settings::shouldGenerateFioKeys() ? "FIO" : "EOS"); + pubstr = libeosio::wif_pub_encode(pair.pub, codec.pub); + pvtstr = libeosio::wif_priv_encode(pair.secret, codec.pvt); m_pub.setText(QString::fromStdString(pubstr)); - m_priv.setText(QString::fromStdString(libeosio::wif_priv_encode(pair.secret))); + m_priv.setText(QString::fromStdString(pvtstr)); } void GenerateWindow::copy_both_keys() diff --git a/gui/src/MainWindow.cpp b/gui/src/MainWindow.cpp index 78b3a7a..4001ef4 100644 --- a/gui/src/MainWindow.cpp +++ b/gui/src/MainWindow.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include "gui_text.h" #include "Settings.hpp" #include "GenerateWindow.hpp" @@ -32,8 +33,10 @@ #include "MainWindow.hpp" MainWindow::MainWindow(QWidget *parent) : -QMainWindow (parent), -m_fio_action (nullptr) +QMainWindow (parent), +m_format_fio_action (nullptr), +m_format_legacy_action (nullptr), +m_format_k1_action (nullptr) { libeosio::ec_init(); @@ -51,12 +54,28 @@ m_fio_action (nullptr) // Settings - m_fio_action = new QAction("FIO Keys", this); - m_fio_action->setCheckable(true); - connect(m_fio_action, SIGNAL(triggered()), this, SLOT(fioKeysCheckboxChanged())); + QActionGroup* formatGroup = new QActionGroup(this); - QMenu *settings_menu = menuBar()->addMenu("Settings"); - settings_menu->addAction(m_fio_action); + m_format_fio_action = new QAction("FIO", formatGroup); + m_format_fio_action->setCheckable(true); + m_format_legacy_action = new QAction("Legacy", formatGroup); + m_format_legacy_action->setCheckable(true); + m_format_k1_action = new QAction("K1", formatGroup); + m_format_k1_action->setCheckable(true); + + // Set k1 and trigger the changed action so we set the codec. + m_format_k1_action->setChecked(true); + formatK1CheckboxChanged(); + + connect(m_format_fio_action, SIGNAL(triggered()), this, SLOT(formatFioCheckboxChanged())); + connect(m_format_legacy_action, SIGNAL(triggered()), this, SLOT(formatLegacyCheckboxChanged())); + connect(m_format_k1_action, SIGNAL(triggered()), this, SLOT(formatK1CheckboxChanged())); + + QMenu *settings = menuBar()->addMenu("Settings"); + QMenu *format_menu = settings->addMenu("Key Format"); + format_menu->addAction(m_format_k1_action); + format_menu->addAction(m_format_legacy_action); + format_menu->addAction(m_format_fio_action); // About menuBar()->addAction("About", this, SLOT(showAbout())); @@ -84,7 +103,23 @@ void MainWindow::showAbout() EOSIOKEYGEN_GUI_TEXT_ABOUT_BODY); } -void MainWindow::fioKeysCheckboxChanged() +void MainWindow::formatFioCheckboxChanged() { - Settings::setGenerateFioKeys(m_fio_action ? m_fio_action->isChecked() : false); + if (m_format_fio_action->isChecked()) { + Settings::setKeyCodec(libeosio::wif_create_legacy_codec("FIO")); + } +} + +void MainWindow::formatLegacyCheckboxChanged() +{ + if (m_format_legacy_action->isChecked()) { + Settings::setKeyCodec(libeosio::WIF_CODEC_LEG); + } +} + +void MainWindow::formatK1CheckboxChanged() +{ + if (m_format_k1_action->isChecked()) { + Settings::setKeyCodec(libeosio::WIF_CODEC_K1); + } } diff --git a/gui/src/MainWindow.hpp b/gui/src/MainWindow.hpp index 06d3fcb..3d4b172 100644 --- a/gui/src/MainWindow.hpp +++ b/gui/src/MainWindow.hpp @@ -47,13 +47,17 @@ private slots : void showAbout(); - void fioKeysCheckboxChanged(); + void formatFioCheckboxChanged(); + void formatLegacyCheckboxChanged(); + void formatK1CheckboxChanged(); private : QStackedWidget* m_stacked; - QPointer m_fio_action; + QPointer m_format_fio_action; + QPointer m_format_legacy_action; + QPointer m_format_k1_action; }; #endif /* MAIN_WINDOW_H */ diff --git a/gui/src/SearchWindow.cpp b/gui/src/SearchWindow.cpp index 23e2cf3..7af886d 100644 --- a/gui/src/SearchWindow.cpp +++ b/gui/src/SearchWindow.cpp @@ -150,14 +150,16 @@ void SearchWindow::onResult(const struct libeosio::ec_keypair* key, const struct { int pos = (int) result.pos; int len = (int) result.len; - QString pub = QString::fromStdString(libeosio::wif_pub_encode(key->pub, Settings::shouldGenerateFioKeys() ? "FIO" : "EOS")); + libeosio::wif_codec_t codec = Settings::getKeyCodec(); + QString pub = QString::fromStdString(libeosio::wif_pub_encode(key->pub, codec.pub)); + int pub_prefix_len = (int) codec.pub.length(); QString mid = pub.mid(pos, len); QString left = pub.left(pos); QString right = pub.mid(pos + len, pub.size() - pos); eoskeygen::Dictionary::search_result_t dict_res = m_dict.search(pub.toStdString()); - QString out = "Public: " + pub.left(3); - for(int i = 3; i < pub.length(); ) { + QString out = "Public: " + pub.left(pub_prefix_len); + for(int i = pub_prefix_len; i < pub.length(); ) { if (i == pos) { out += "" + pub.mid(pos, len) + ""; @@ -178,7 +180,7 @@ void SearchWindow::onResult(const struct libeosio::ec_keypair* key, const struct out += pub[i++]; } - out += "
Private: " + QString::fromStdString(libeosio::wif_priv_encode(key->secret)); + out += "
Private: " + QString::fromStdString(libeosio::wif_priv_encode(key->secret, codec.pvt)); // As this function could be called from a non-gui thread. we use signals. emit addOutput("

" + out + "

"); @@ -253,6 +255,9 @@ void SearchWindow::langFileAdd() void SearchWindow::searchStarted() { + // Set prefix for search + m_ksearch.setPrefix(Settings::getKeyCodec().pub); + m_btn_exec.setText("Cancel"); m_txt_search.setEnabled(false); diff --git a/gui/src/Settings.cpp b/gui/src/Settings.cpp index d49c408..733e028 100644 --- a/gui/src/Settings.cpp +++ b/gui/src/Settings.cpp @@ -24,16 +24,14 @@ #include "Settings.hpp" namespace priv { - bool fio_keys = false; + libeosio::wif_codec_t key_format = libeosio::WIF_CODEC_K1; } // namespace priv -bool Settings::shouldGenerateFioKeys() -{ - return priv::fio_keys; +void Settings::setKeyCodec(const libeosio::wif_codec_t& format) { + priv::key_format = format; } -void Settings::setGenerateFioKeys(bool value) -{ - priv::fio_keys = value; +const libeosio::wif_codec_t& Settings::getKeyCodec() { + return priv::key_format; } diff --git a/gui/src/Settings.hpp b/gui/src/Settings.hpp index d47c26f..4cf04be 100644 --- a/gui/src/Settings.hpp +++ b/gui/src/Settings.hpp @@ -24,11 +24,13 @@ #ifndef SETTINGS_H #define SETTINGS_H +#include + namespace Settings { - bool shouldGenerateFioKeys(); + void setKeyCodec(const libeosio::wif_codec_t& format); - void setGenerateFioKeys(bool value); + const libeosio::wif_codec_t& getKeyCodec(); }; #endif /* SEARCH_WINDOW_H */