1
0
Fork 0
mirror of https://github.com/eosswedenorg/antelope-keygen synced 2026-06-16 03:44:56 +02:00

Compare commits

...

209 commits

Author SHA1 Message Date
6c4769a030 .github/workflows/package.yml: fix qt5 package for fedora 38 2023-08-27 14:19:35 +02:00
24136406a7 .github/workflows/package.yml: for ubuntu, use matrix includes for qt package instead of the if/else in bash. 2023-08-25 12:41:19 +02:00
7e8b1d6e66 README.md: fix link to CI tests. 2023-08-25 12:38:34 +02:00
8949a80b11 .github/workflows/package.yml: set-output command to environment variables. 2023-08-17 17:14:26 +02:00
2874862d70 .github/workflows/package.yml: Package for fedora 37 2023-08-17 16:55:05 +02:00
d03d27589e .github/workflows/package.yml: build and package for fedora 38 2023-08-16 18:57:48 +02:00
772d03a6e3 .github/workflows/package.yml: Typofix, change "DBM" to "DEB" 2023-08-16 18:57:33 +02:00
53644e9ceb .github/workflows/ci.yml: update actions/checkout to version 3. 2023-08-16 18:52:15 +02:00
1ef3424638 .github/workflows/ci.yml: Update qt version for windows/mac to 5.15.2 2023-08-16 18:52:15 +02:00
ad5d464792 .github/workflows/package.yml: Update actions/checkout to version 3 2023-08-16 18:52:15 +02:00
baaf7e5b54 common/cmake/libantelope.cmake: Use version 0.2.2 2023-08-16 16:00:10 +02:00
1c4e01a726
README.md: Fix link 2023-07-05 05:00:01 +02:00
83f09d494c common/cmake/libantelope.cmake: use version 0.2.1 2023-05-31 19:21:05 +02:00
b82ba44544 Version 1.1.0 2023-05-04 13:42:24 +02:00
54ca24bbd9 .github/workflows/package.yml: fix ls command for finding the package files. 2023-05-04 13:38:51 +02:00
8cab0cbced .github/workflows/package.yml: Use Environment files for output parameters 2023-05-04 13:37:51 +02:00
a421ceb5d8 .github/workflows/package.yml: bump cmake version for fedora 2023-05-04 13:11:40 +02:00
a73b52b987 CMakeLists.txt: Update project description 2023-05-04 12:55:21 +02:00
ec07b199ed cli/src/main.cpp: update program description 2023-05-04 12:54:47 +02:00
9a83929029 gui/README.md: Update security notice. 2023-04-10 16:40:02 +02:00
19f8b67fdd gui/README.md: change from eosio-keygen to antelope-keygen 2023-04-10 16:39:20 +02:00
133aa230fb cli/docs/antelope-keygen.1.in: remove subcommands and refer to their man pages. update security notice and some formatting fixes. 2023-04-10 16:36:20 +02:00
3a2c80e9b5 cli/docs: adding antelope-keygen-benchmark.1.in and antelope-keygen-search.1.in 2023-04-10 16:35:15 +02:00
6554e6c806 cli/docs/README.md.in: use @PROJECT_NAME@ in some missed places that used hardcoded values. 2023-04-10 16:33:43 +02:00
2f92e6b2b2 cli/docs/README.md.in: Update to reflect new cli syntax and security notice. 2023-04-10 16:31:53 +02:00
25025c21b4 README.md: Update security notice. 2023-04-10 16:10:54 +02:00
10ec4355e6 cli/docs/antelope-keygen.1.in: Update to reflect new cli syntax and change eosio to antelope. 2023-04-10 15:41:56 +02:00
2b4ab78176 rename namespace and header guards from eosio to antelope 2023-04-10 14:53:26 +02:00
2679dc6ef4 README.md: change "EOS Sweden" to "Sw/eden" 2023-04-06 15:23:37 +02:00
4b26e277f8 README.md: Update documentation for libeosio to use libantelope instead. 2023-04-06 15:22:01 +02:00
914205541a Update from libeosio v0.1.7 to libantelope v0.2.0 2023-04-06 15:11:20 +02:00
d5da7d1491 README.md: Update info about supported Linux distros/versions. 2023-04-05 21:14:57 +02:00
61ce4c751d Merge branch 'rpm-pkg' into develop 2023-04-05 19:38:21 +02:00
6589011be5 gui/src/GenerateWindow.cpp: Make the key fields abit longer. 2023-04-05 19:37:40 +02:00
3ae2c00faa gui/src/GenerateWindow.cpp: set fixed font (monospace) for the key fQLineEdit fields. 2023-04-05 19:36:36 +02:00
3d5b163e9f Merge branch 'k1' into develop 2023-04-05 19:20:45 +02:00
9ed6e6ab80 gui: implement support for K1 keys. 2023-04-05 19:20:16 +02:00
90f5aa17a8 build.sh: set default TARGET value to "all" 2023-04-05 19:17:45 +02:00
85955baf42 .github/workflows/package.yml: add RPM package. 2023-04-05 19:16:48 +02:00
8076eb6342 build.sh: support rpm for --pkg-type 2023-04-05 16:19:45 +02:00
2cc93efadf cmake/CPackConfig.cmake: Adding RPM stuff. 2023-04-05 16:19:16 +02:00
8bb1649974 .github/workflows/package.yml: set qt versions from ci.yml 2023-04-05 15:33:35 +02:00
aacfdbe4a9 cli/CMakeLists.txt: Minor whitespace fix. 2023-04-05 15:18:22 +02:00
9ad3d47d95 CMakeLists.txt: Compile position independent code. 2023-04-05 15:18:00 +02:00
71cb07e6e7 CMakeLists.txt: Set strip flag for GNU linkers on release config. 2023-04-05 15:16:12 +02:00
5fd76814c1 CMakeLists.txt: use COMPILE_LANG_AND_ID generator expression instead of just CXX_COMPILER_ID 2023-04-05 15:14:24 +02:00
cf104e1616 .github/workflows/ci.yml: fix qt package on ubuntu-22.04 2023-04-04 19:30:08 +02:00
8bc93c1bec .github/workflows: run on ubuntu-22.04 2023-04-04 19:19:20 +02:00
8d413941ed .github/workflows: remove ubuntu-18.04 as its is not supported anymore as github runner. 2023-04-04 19:19:20 +02:00
04b1d60f9b .github/workflows: Update jurplel/install-qt-action to v3 2023-04-04 19:15:54 +02:00
e18886e074 cli: implement support for K1 keys (default, can be switched with --legacy flag) 2023-04-04 19:06:00 +02:00
cbe6902d03 common/cmake/libeosio.cmake: Use libeosio v0.1.7 2023-04-04 19:06:00 +02:00
d579879d71 common/include/eoskeygen/key_search.hpp: make prefix into a variable (we need it for k1 keys). 2023-04-04 14:58:36 +02:00
b39a2a09ae LICENSE: Update year. 2023-03-29 11:33:23 +02:00
e0a7d8fb21 gui/src/MainWindow.cpp: Make sure to call libeosio::ec_init() and ec_shutdown() 2023-03-29 11:31:42 +02:00
0781b7db80 cli/src/main.cpp: Make sure to call libeosio::ec_init() and ec_shutdown() 2023-03-29 11:31:21 +02:00
13a99e15d9 fix libeosio header includes. 2023-03-29 11:30:49 +02:00
b3378eda16 common/cmake/libeosio.cmake: Update to v0.1.6 2023-03-29 11:30:24 +02:00
864a55e485 gui/src/MainWindow.hpp: fix indentation 2023-03-29 11:28:03 +02:00
d3fd36ef0e .github/workflows/package.yml: update QT versions 2022-11-11 13:20:13 +01:00
1d6fc76eca Version 1.0.8 2022-11-11 13:02:22 +01:00
23a43ff6b3 cli/cmake/CPackComponentConfig.cmake.in: Add libssl1.1 or libssl3 as dependancies to debian package. 2022-11-11 12:38:05 +01:00
40831b6941 common/cmake/libeosio.cmake: minor indent fix. 2022-11-11 12:36:06 +01:00
1ca85a37b8 cli/src/main.cpp: use new C++11 syntax to loop over vectors. 2022-09-22 12:42:15 +02:00
8e2378cfe8 common/cmake/libeosio.cmake: update to v0.1.4 2022-09-21 10:51:04 +02:00
6273b048bb CMakeLists.txt: remove -Werror flag for GNU compilers. 2022-09-21 10:21:19 +02:00
f5d733a4f1 .github/workflows/ci.yml: disable fail-fast. 2022-09-21 10:20:48 +02:00
e41def2149 .github/workflows/ci.yml: run apt-get update 2022-09-21 10:17:12 +02:00
a92cb0c1d9 .github/workflows/ci.yml: Update QT on ubuntu-18.04 2022-09-21 09:55:38 +02:00
f40c680ad1 .github/workflows/ci.yml: Update QT on ubuntu-20.04 2022-09-21 09:50:52 +02:00
6a7454875c cli/src/main.cpp: use CLI11 to parse cli args. 2022-09-20 18:54:51 +02:00
81007003d7 cli/CMakeLists.txt: Link with CLI11 and install it's license file. 2022-09-20 17:54:29 +02:00
4a3e7d8fa4 common/src/key_search.hpp: Adding getThreadCount() 2022-09-20 17:47:06 +02:00
1d923d3dd8 Adding lib/CLI11 2022-09-20 15:18:49 +02:00
0e4a574f7a cli/src/main.cpp: fix indent in usage string. 2022-09-20 15:18:49 +02:00
a73689e275
Merge pull request #35 from eosswedenorg/fio
Adding FIO support
2021-05-07 13:59:51 +02:00
7fb1774359 gui/src/MainWindow: Add menu item to switch between FIO/EOS key prefixes. 2021-05-07 13:50:27 +02:00
6bd84b1d8d gui/src/GenerateWindow.cpp: Check Settings::shouldGenerateFioKeys() if we should use "FIO" or "EOS" prefix. 2021-05-07 13:50:27 +02:00
8c9047d716 gui/src/SearchWindow.cpp: Check Settings::shouldGenerateFioKeys() to know if we should use "FIO" or "EOS" prefix. 2021-05-07 13:50:27 +02:00
f7b84c7752 GUI: Adding Settings Component. 2021-05-07 13:50:27 +02:00
486d2c5030 cli/src/main.cpp: implement "--fio" option to generate FIO keys. 2021-05-07 13:50:27 +02:00
52e255850a cli/src/cli_key_search_result: Add prefix parameter to constructor. 2021-05-07 13:50:27 +02:00
554cfd5884 common/cmake/libeosio.cmake: set v0.1.3 needed for prefix parameter to wif_print_key() 2021-05-07 13:50:27 +02:00
95849b1e32 build.sh: adding --libeosio flag 2021-05-06 18:05:39 +02:00
010edeb2f5 cli/src/main.cpp: Improve usage text format. 2021-05-06 15:32:27 +02:00
e4dbcbdc0a Version 1.0.7 2021-02-24 14:23:40 +01:00
09e287733c .github/workflows/package.yml: Build package for Ubuntu 20.04 2021-02-24 14:17:30 +01:00
145769970f .github/workflows/ci.yml: Adding support for Ubuntu 20.04 2021-02-24 14:07:16 +01:00
5bd72cec19 common/cmake/libeosio.cmake: use v0.1.2 2021-02-24 14:05:42 +01:00
32967fdaac cli/src/benchmark.cpp: Minor cleanup, stop using the keyword "using" :) 2021-01-04 16:16:34 +01:00
56a5c226bd Updated year in headers. 2021-01-04 15:16:27 +01:00
51883f42ca cli/src/main.cpp: move usage() function to the top. 2021-01-04 13:05:08 +01:00
73ccd4be02 common/cmake/libeosio.cmake: use v0.1.1 2020-05-22 16:23:55 +02:00
cb181bea21 Version 1.0.6 2020-05-15 14:48:55 +02:00
227ce91c98
Merge pull request #34 from pnx/gui-help-text
GUI: Helptext for dictionary widgets.
2020-05-15 14:46:29 +02:00
e0a388dac1 gui/src/SearchWindow.cpp: show tooltip for dictionary widgets. 2020-05-15 14:04:58 +02:00
88bd1217ba gui/gui_text.h.in: define tooltip text for dictionary widgets. 2020-05-15 14:04:58 +02:00
f6554a924a gui/gui_about.h.in: rename to gui_text.h.in 2020-05-15 14:04:58 +02:00
0a2ad12700 .github/workflows/ci.yml: trigger on pull requests also. 2020-05-15 14:04:35 +02:00
cf6c1a4854 remove common/include/eoskeygen/config.h (old autogenerated file) 2020-05-15 13:54:07 +02:00
1cb6ddabd6 gui/src/SearchWindow.cpp: implement "Cancel" button. stopping the search operation. 2020-04-28 10:23:13 +02:00
7c2545cdc2 common/include/eoskeygen/key_search.hpp: adding abort() 2020-04-28 10:23:13 +02:00
2a528e0eb0 common/include/eoskeygen/key_search.hpp: add max and count variables to the class.
This is done so that m_max can be set to zero from another method. stopping a find() operation. (for threaded operations)
2020-04-28 10:23:13 +02:00
3cc6a2530e gui/src/SearchWindow.cpp: Pass a pointer to m_ksearch in call to QtConocurrent::run()
It's not passed by reference otherwise. so it will copy the whole object.
2020-04-28 09:48:04 +02:00
a3be286579 .github/workflows/package.yml: fix job name for ubuntu. 2020-04-27 14:29:15 +02:00
4c67cbf905 Version 1.0.5 2020-04-27 14:26:00 +02:00
464a0c1801 README.md: simplify windows example. 2020-04-27 13:12:47 +02:00
e26bc8097f README.md: Adding documentation for Qt. 2020-04-27 13:11:46 +02:00
a6c0cbcc4e README.md: Adding notice about MacOS support. 2020-04-27 13:00:09 +02:00
38263a421c README.md: Adding a note about Ubuntu 18.04 support. 2020-04-27 12:33:24 +02:00
282028793b CMake: bundle eosio-extras on windows. 2020-04-27 12:23:08 +02:00
e20023cf31 adding cmake/extras.cmake 2020-04-27 12:23:08 +02:00
b7c3fc0506 gui/cmake/CPackComponentConfig.cmake.in: explicitly depend on qt >= 5.9.5 and libssl >= 1.1 2020-04-27 12:23:08 +02:00
2ec874607f Github Actions: pin qt5-default to 5.9.5 on ubuntu. 2020-04-27 12:23:08 +02:00
dce6f58607 Github Actions: skip building for Ubuntu 16.04
First, 16.04 only supports libssl 1.0 (officially) that links fine but will not find the library at runtime.
Second, 16.04 is old (LTS is still valid tho).

If requested, we could consider supporting it but no point going through the hassle if it has no users.
2020-04-27 12:23:08 +02:00
6f1359444a .github/workflows/package.yml: fixing windows build (must have --config Release everywhere) 2020-04-27 12:23:08 +02:00
beeba58cee Github Actions: use Qt 5.11.0 on windows.
qt < 5.11 has a bug in qCountLeadingZeroBits function (QtCore/qalgorithms.h).
This function is marked constexpr but returns a non-const value.

MSVC compilers will pick this up as an C3615 error.
See https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-2/compiler-error-c3615
2020-04-27 12:23:08 +02:00
e19982acee .github/workflows/package.yml: set qt arch correctly on windows. 2020-04-27 12:23:08 +02:00
0b101728b6 .github/workflows/package.yml: we can set arch "directly" on windows. 2020-04-27 12:23:08 +02:00
8a9d594d37 CMake: Install gui/LICENSE.qt5 2020-04-25 13:09:28 +02:00
df2b40d1c6 CMake: only pack components that are configured. 2020-04-25 10:52:49 +02:00
8b8ba4c2c6 .github/workflows/package.yml: build both cli and gui on ubuntu. 2020-04-24 18:56:10 +02:00
63c7212fad install.sh: don't assume we have generated Makefiles with cmake. use cmake --install 2020-04-24 18:55:53 +02:00
54f0fc206f build.sh: need to pass --config flag to cmake build (for multiconfig generators like Visual Studio/xcode) 2020-04-24 18:55:53 +02:00
0cb00ae734 build.sh: adding --cli and --no-gui flags to compliment --no-cli and --gui 2020-04-24 18:55:53 +02:00
9e048c7175 .github/workflows/package.yml: build both gui and cli on windows. 2020-04-24 18:55:53 +02:00
8bc9a87cc9 Adding Sw/eden homepage to all my author lines. 2020-04-24 17:57:54 +02:00
e3d5176cae CMake: install gui/README.md 2020-04-24 17:57:54 +02:00
7cb70bd9a4 Adding a basic gui/README.md 2020-04-24 17:57:54 +02:00
c173c002f5 CMake: configure and install cli/docs/README.md.in 2020-04-24 17:57:54 +02:00
f1f5e50e9a Adding cli/docs/README.md.in 2020-04-24 17:57:54 +02:00
e0d4fbbdb7 cli/docs/eosio-keygen.1.in: Spelling fix. 2020-04-24 16:53:38 +02:00
37647685ea CMake: install license file for both cli and gui 2020-04-24 16:35:10 +02:00
c5e9222abe gui/cmake/CPackComponentConfig.cmake.in: Set debian package name 2020-04-24 15:55:13 +02:00
178e71fbc7 cli/cmake/CPackComponentConfig.cmake.in: Set debian package name 2020-04-24 15:54:49 +02:00
e1bda4b846 cli/cmake/CPackComponentConfig.cmake.in: Set description. 2020-04-24 14:43:02 +02:00
2084a66dbf CMakeLists.txt: set CMAKE_BUILD_TYPE to Debug per default. 2020-04-24 13:38:20 +02:00
cad11e5912 gui: move source files to "src" subdirectory 2020-04-24 13:37:52 +02:00
2d150a2e8b .github/workflows/package.yml: pass CMAKE_BUILD_TYPE=Release to cmake on windows. 2020-04-24 12:02:40 +02:00
2d1c0d0785 CMake: rename BUILD_COMPONENT_* options to COMPONENT_* 2020-04-24 12:01:24 +02:00
56c1886880 gui/cmake/QtUtils.cmake: the value _install_args should not be in quotes. 2020-04-23 16:57:48 +02:00
a390d4226f CMakeLists.txt: Set CMAKE_INSTALL_BINDIR to "bin" on windows
With Qt we have alot more files then just the two .exe's
2020-04-23 16:36:09 +02:00
4436f769e6 gui/CMakeLists.txt: use the new Qt stuff. 2020-04-23 16:36:09 +02:00
bfd254f484 CMake: Adding alot of code to handle .ddl's on windows using windeployqt 2020-04-23 16:36:09 +02:00
00b9177f3a gui/CMakeLists.txt: add "WIN32" flag to add_executable
This makes cmake configure the compiler to create a gui app (e.g. not opening a console window that spawns a gui window as a child process)
2020-04-23 10:00:23 +02:00
8d925536ba build.sh: add nsis to --pkg-type 2020-04-22 18:01:40 +02:00
a350dd5846 CMakeLists.txt: Fixing compile flags for MSVC
Use set_compile_options() with cmake generator expression to define flags for
all configurations and compilers in a compact way.
2020-04-22 18:00:53 +02:00
404c203488 README.md: Change libeoskeygen to libeosio 2020-04-22 12:17:54 +02:00
4a83b06ef2 CMake: new CPack structure with config defined in sub directories. 2020-04-21 14:23:59 +02:00
884f8a6125 cli: move source files. 2020-04-21 10:06:10 +02:00
54e493de1f .github/workflows/ci.yml: update build matrix to cover all configurations. 2020-04-20 18:23:52 +02:00
7a8867bb3c build.sh: Adding --no-cli,--gui flags 2020-04-20 17:15:38 +02:00
6181af6212 README.md: Document --no-cli,--gui build flags. 2020-04-20 17:11:43 +02:00
22222c1d7c gui/SearchWindow: Respect EOSIOKEYGEN_HAVE_THREADS define. 2020-04-20 17:11:07 +02:00
c1b2bfce0d README.md: adding --disabled-threads documentation again. 2020-04-20 16:57:10 +02:00
4741eb684f common/.gitignore: ignore correct header file. 2020-04-20 16:54:35 +02:00
a85c9b5090 change remaining .h files to .hpp 2020-04-19 15:44:47 +02:00
9dacf00c7f common/cmake/libeosio.cmake: use v0.1.0 2020-04-19 15:35:50 +02:00
e5cb4a72f6 libeosio .h files are renamed to .hpp 2020-04-19 11:17:15 +02:00
9e9e96b954 README.md: Replace the old libeoskeygen info with libeosio. 2020-04-19 11:04:45 +02:00
94686cc4f6 gui/SearchWindow.cpp: change config.h to config.hpp 2020-04-16 14:43:36 +02:00
fc49dd243d Merge remote-tracking branch 'pnx/gui' into develop 2020-04-16 14:39:58 +02:00
460e8149fd gui/GenerateWindow.cpp: Fix horizontal centering of widget's using QGridLayout::setColumnStretch() 2020-04-16 14:05:41 +02:00
d3e8cc2814 gui/GenerateWindow.cpp: Align labels to the right. 2020-04-16 14:05:41 +02:00
c98ed34e6e GUI: Implement about dialog in MainWindow. 2020-04-16 14:05:41 +02:00
099d6b3008 gui/CMakeLists.txt: Autogenerate gui_config.h from gui_config.h.in 2020-04-16 14:05:41 +02:00
2f16accbba Adding gui/gui_about.h.in 2020-04-16 14:05:25 +02:00
54d46004c1 cli: change .h to .hpp 2020-04-16 12:59:03 +02:00
0503aa0f04 CMakeLists.txt: Add PROJECT_LICENSE_FILE variable. 2020-04-15 19:31:49 +02:00
4a3e5a5f62 GUI: rename all header files from .h to .hpp 2020-04-15 16:24:39 +02:00
f6dc9cd0b1 gui/main.cpp: use MainWindow class. 2020-04-15 16:21:07 +02:00
8f45d3707a GUI: Adding MainWindow class 2020-04-15 16:21:07 +02:00
3bd9e9856b GUI: Adding GenerateWindow class 2020-04-15 16:19:38 +02:00
e9dadc07ac common/src/core/dictionary.cpp: get rid of iostream header 2020-04-15 11:12:06 +02:00
769e56af2f gui/SearchWindow: adding "Dictionary file" widget. 2020-04-14 22:03:09 +02:00
50a2805c3f gui/MultiSelect: Add user_add_item parameter to constructor
adds a button and signal to the MultiSelect, allowing client code to implement adding items from user input.
2020-04-14 21:56:04 +02:00
925ef7e8ad gui/MultiSelect: add variable for default state for addItem() and addItems() 2020-04-14 21:49:40 +02:00
c14a453f01 gui/SearchWindow.cpp: disable m_leet_cb during search. 2020-04-14 16:38:17 +02:00
3ca4631bbe common/include/eoskeygen/core/dictionary.h: adding getWords() method. 2020-04-14 16:34:56 +02:00
1f8fbfc8ca gui/SearchWindow: implement dictionary language 2020-04-14 16:33:07 +02:00
3b1ada9cb7 gui/SearchWindow.cpp: in onResult() should advance index by word length and not position. 2020-04-14 16:19:39 +02:00
35706c9ba3 config.h.in: add CONFIG_DICT_PATH and CONFIG_DICT_FULL_PATH 2020-04-14 14:40:56 +02:00
45005c9950 adding gui/helpers module 2020-04-14 14:38:17 +02:00
6a53999c14 Adding gui/MultiSelect module 2020-04-14 14:38:17 +02:00
bfc40bd3e7 gui/SearchWindow.cpp: Force scrollbar to the bottom when adding text to m_output. 2020-04-11 16:29:42 +02:00
c206ec764f .github/workflows/ci.yml: some minor cleanup. 2020-04-10 17:50:08 +02:00
48eb716165 .github/workflows/ci.yml: add abit more human friendly names than matrix.build-opts. and have the actual cmake flags as matrix includes. 2020-04-10 17:50:08 +02:00
bc614da0e8 common/cmake/libeosio.cmake: also set stamp directory to DOWNLOAD_CACHE_DIR 2020-04-10 17:06:09 +02:00
eed3c1cfef common/cmake/libeosio.cmake: download source to DOWNLOAD_CACHE_DIR 2020-04-10 16:58:47 +02:00
bbd2959a0d CMakeLists.txt: adding DOWNLOAD_CACHE_DIR variable. 2020-04-10 16:58:42 +02:00
0d44bbc8f6 .github/workflows/ci.yml: Build GUI 2020-04-10 11:53:29 +02:00
40ddff41db gui/CMakeLists.txt: Drop the requirement for QT 5.11 2020-04-10 11:52:58 +02:00
3c21e27f45 gui/SearchWindow: Use QFutureWatcher instead of QThread.
By removing the call to QThread::create() that requires version >= 5.11 we can have a lower version as requirement.

This is useful because a lot of systems don't ship with 5.11 as default.
2020-04-10 11:52:58 +02:00
8cb3fad9b1 gui/CMakeLists.txt: Adding install target 2020-04-10 11:52:58 +02:00
a2ec5eaaec gui/CMakeLists.txt: Force Qt 5.11 or later. 2020-04-10 11:52:58 +02:00
69017c7a21 CMake: Adding BUILD_COMPONENT_GUI and BUILD_COMPONENT_CLI (so user's can build either one or both). 2020-04-10 11:52:58 +02:00
0205e25afb Adding initial GUI code. 2020-04-08 10:11:52 +02:00
4cc6f39da3 CMakeLists.txt: some restructure/cleanup. 2020-04-08 10:07:24 +02:00
e80d8c5e34 rename "CMakeModules" directory to "cmake" 2020-04-08 09:55:14 +02:00
52474387ca common/include/eoskeygen/key_search.h: include libeosio/types.h 2020-04-08 09:48:58 +02:00
fb85be4f1e common/include/eoskeygen/core/string.h: don't include strlist.h 2020-04-08 09:43:51 +02:00
70dee5611b CMakeLists.txt: Add c++ flags for the different types of builds. 2020-04-07 22:43:19 +02:00
d9976c7f80 CMakeLists.txt: set default value for CMAKE_BUILD_TYPE 2020-04-07 22:42:31 +02:00
ba0efa2dd7 move src dir to cli and add it's own cmake file. 2020-04-07 22:37:05 +02:00
526b87670b remove LICENSE.bitcoin (this code exist in libeosio) 2020-04-07 17:21:42 +02:00
9a5f0cff1c common/cmake/libeosio.cmake: Use commit 137d5cbe31666a748954dd233e54c5703480ebbf 2020-04-07 16:05:18 +02:00
dd9dd484e3 Use the "common" subfolder instead of libeoskeygen repository. 2020-04-03 17:26:42 +02:00
654a53698f Importing libeoskeygen as "common" module in this repo (the amount of git repos is too damn high!) 2020-04-03 17:25:09 +02:00
f181bddc4f src/main.cpp: make changes for newer version of libeoskeygen 2020-04-03 16:36:04 +02:00
75 changed files with 13355 additions and 768 deletions

View file

@ -6,34 +6,66 @@ on:
- '*'
- '*/*'
- '!master'
pull_request:
branches: [ develop ]
jobs:
compile:
strategy:
fail-fast: false
matrix:
os: [ ubuntu-16.04, ubuntu-18.04, macos-latest, windows-latest ]
build-opts: [ "-DFORCE_ANSI=ON", "-DFORCE_ANSI=OFF" ]
os: [ ubuntu-20.04, ubuntu-22.04, macos-latest, windows-latest ]
build: [ cli, cli-mt, cli-ansi, cli-ansi-mt, gui, gui-mt ]
include:
- build: cli
cmake-opts: -DCOMPONENT_CLI=ON -DCOMPONENT_GUI=OFF -DFORCE_ANSI=OFF -DUSE_THREADS=OFF
- build: cli-mt
cmake-opts: -DCOMPONENT_CLI=ON -DCOMPONENT_GUI=OFF -DFORCE_ANSI=OFF -DUSE_THREADS=ON
- build: cli-ansi
cmake-opts: -DCOMPONENT_CLI=ON -DCOMPONENT_GUI=OFF -DFORCE_ANSI=ON -DUSE_THREADS=OFF
- build: cli-ansi-mt
cmake-opts: -DCOMPONENT_CLI=ON -DCOMPONENT_GUI=OFF -DFORCE_ANSI=ON -DUSE_THREADS=ON
- build: gui
cmake-opts: -DCOMPONENT_CLI=OFF -DCOMPONENT_GUI=ON -DUSE_THREADS=OFF
- build: gui-mt
cmake-opts: -DCOMPONENT_CLI=OFF -DCOMPONENT_GUI=ON -DUSE_THREADS=ON
name: ${{matrix.os}} (${{matrix.build-opts}})
name: ${{matrix.os}} (${{matrix.build}})
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v1
- uses: actions/checkout@v3
- name: Dependancies
- name: OpenSSL OSX
if: runner.os == 'macOS'
shell: bash
run: brew install openssl
- name: Qt - Ubuntu
if: startsWith(matrix.build, 'gui') && runner.os == 'Linux'
shell: bash
run: |
if [ "$RUNNER_OS" == "macOS" ]; then
brew install openssl
sudo apt-get update
if [ "${{matrix.os}}" == "ubuntu-22.04" ]; then
sudo apt-get install qtbase5-dev=5.15.3+dfsg-2ubuntu0.2
else :
sudo apt-get install qt5-default=5.12.8+dfsg-0ubuntu2.1
fi
- name: Qt - Windows/Mac
if: startsWith(matrix.build, 'gui') && runner.os != 'Linux'
uses: jurplel/install-qt-action@v3
with:
version: '5.15.2'
- name: Configure
shell: bash
run: |
OPTS="${{matrix.cmake-opts}}"
if [ "$RUNNER_OS" == "macOS" ]; then
SSL_OPTS="-D OPENSSL_ROOT_DIR=/usr/local/opt/openssl@1.1"
OPTS="-D OPENSSL_ROOT_DIR=/usr/local/opt/openssl@1.1 ${OPTS}"
fi
cmake ${SSL_OPTS} ${{matrix.build-opts}} -B build
cmake ${OPTS} -B build
- name: Build
shell: bash
@ -42,5 +74,5 @@ jobs:
- name: Upload artifact
uses: actions/upload-artifact@v1
with:
name: ${{matrix.os}}_${{matrix.build-opts}}-build
name: ${{matrix.os}}_${{matrix.build}}-build
path: build

View file

@ -9,19 +9,36 @@ jobs:
ubuntu:
strategy:
matrix:
os: [ ubuntu-16.04, ubuntu-18.04 ]
name: ${{matrix.os}}
os: [ ubuntu-20.04, ubuntu-22.04 ]
component: [ cli, gui ]
include:
- os: ubuntu-20.04
qt: qt5-default=5.12.8+dfsg-0ubuntu2.1
- os: ubuntu-22.04
qt: qtbase5-dev=5.15.3+dfsg-2ubuntu0.2
- component: cli
build-opts: --cli --no-gui -t Release --pkg-type deb
- component: gui
build-opts: --no-cli --gui -t Release --pkg-type deb
name: DEB ${{matrix.os}} (${{matrix.component}})
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v1
- uses: actions/checkout@v3
- name: Qt
if: startsWith(matrix.component, 'gui')
shell: bash
run: |
sudo apt-get update
sudo apt-get install ${{matrix.qt}}
- name: Package
id: package
run: |
./build.sh -t Release --pkg-type deb
./build.sh ${{matrix.build-opts}}
FILE=$(ls build/*.deb | head -1)
echo "::set-output name=filename::$FILE"
echo "::set-output name=name::$(basename $FILE)"
echo "filename=$FILE" >> "$GITHUB_OUTPUT"
echo "name=$(basename $FILE)" >> "$GITHUB_OUTPUT"
- name: Upload
uses: actions/upload-release-asset@v1
@ -33,35 +50,105 @@ jobs:
asset_path: ${{ steps.package.outputs.filename }}
asset_content_type: application/x-deb
# Windows installer
windows:
# RPM package for redhat based systems.
rpm:
strategy:
matrix:
arch: [ x86, x64 ]
name: Windows (${{matrix.arch}})
runs-on: windows-latest
container:
- name: "fedora:36"
deps:
gcc-12.2.1-4.fc36.x86_64
gcc-c++-12.2.1-4.fc36.x86_64
cmake-3.26.3-1.fc36.x86_64
openssl1.1-devel-1.1.1q-1.fc36.x86_64
qt: qt5-qtbase-devel-5.15.3-1.fc36.x86_64
- name: "fedora:37"
deps:
gcc-12.3.1-1.fc37.x86_64
gcc-c++-12.3.1-1.fc37.x86_64
cmake-3.27.1-1.fc37.x86_64
openssl-devel-3.0.9-1.fc37.x86_64
qt: qt5-qtbase-devel-5.15.9-3.fc37.x86_64
- name: "fedora:38"
deps:
gcc-13.2.1-1.fc38.x86_64
gcc-c++-13.2.1-1.fc38.x86_64
cmake-3.26.2-1.fc38.x86_64
openssl-devel-1:3.0.9-2.fc38.x86_64
qt: qt5-qtbase-devel-5.15.10-5.fc38.x86_64
component: [ cli, gui ]
include:
- component: cli
build-opts: --cli --no-gui -t Release --pkg-type rpm
- component: gui
build-opts: --no-cli --gui -t Release --pkg-type rpm
name: RPM ${{matrix.container.name}} (${{matrix.component}})
runs-on: ubuntu-latest
container: ${{ matrix.container.name }}
steps:
- uses: actions/checkout@v1
- uses: actions/checkout@v3
- name: Configure
- name: Dependancies
run: |
if ("${{matrix.arch}}" -eq "x86") {
$PLATFORM="Win32"
} else {
$PLATFORM="${{matrix.arch}}"
}
cmake -A $PLATFORM -D CPACK_GENERATOR=NSIS -S . -B build
sudo dnf install -y util-linux rpmdevtools git ${{ matrix.container.deps }}
- name: Build
run: cmake --build build --config Release
- name: Qt
if: startsWith(matrix.component, 'gui')
shell: bash
run: |
sudo dnf install -y ${{ matrix.container.qt }}
- name: Package
id: package
run: |
cmake --build build --target package
./build.sh ${{matrix.build-opts}}
FILE=$(ls build/*.rpm | head -1)
echo "filename=$FILE" >> "$GITHUB_OUTPUT"
echo "name=$(basename $FILE)" >> "$GITHUB_OUTPUT"
- name: Upload
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_name: ${{ steps.package.outputs.name }}
asset_path: ${{ steps.package.outputs.filename }}
asset_content_type: application/octet-stream
# Windows installer
windows:
strategy:
matrix:
arch: [ Win32, x64 ]
include:
- arch: Win32
qt-arch: win32_msvc2015
- arch: x64
qt-arch: win64_msvc2015_64
name: Windows (${{matrix.arch}})
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: Qt
uses: jurplel/install-qt-action@v3
with:
arch: ${{ matrix.qt-arch }}
version: '5.11.0'
- name: Configure
run: cmake -A ${{matrix.arch}} -DCOMPONENT_GUI=ON -DCOMPONENT_CLI=ON -D CMAKE_BUILD_TYPE=Release -D CPACK_GENERATOR=NSIS -S . -B build
- name: Package
id: package
run: |
cmake --build build --config Release --target package
$FILE=(ls build/*.exe)
echo "::set-output name=filename::$FILE"
echo "::set-output name=name::$(([io.fileinfo]"$FILE").basename).exe"
echo "filename=$FILE" >> "$GITHUB_OUTPUT"
echo "name=$(([io.fileinfo]"$FILE").basename)" >> "$GITHUB_OUTPUT"
- name: Upload
uses: actions/upload-release-asset@v1

1
.gitignore vendored
View file

@ -1,2 +1,3 @@
build/
.vscode/
.cache/

View file

@ -1,108 +1,141 @@
cmake_minimum_required(VERSION 3.15)
# Project name and version
project(eosio-keygen
VERSION 1.0.4
DESCRIPTION "Keygenerator for EOSIO"
HOMEPAGE_URL "https://github.com/eosswedenorg/eosio-keygen" )
# --------------------------------
# Project Info
# --------------------------------
project(antelope-keygen
VERSION 1.1.0
DESCRIPTION "Keygenerator for Antelope based blockchain"
HOMEPAGE_URL "https://github.com/eosswedenorg/antelope-keygen" )
set( PROJECT_MAINTAINER "Henrik Hautakoski <henrik@eossweden.org>")
set( PROJECT_LICENSE_FILE ${CMAKE_CURRENT_LIST_DIR}/LICENSE )
# Options
option(FORCE_ANSI "Force ANSI console colors even on windows" OFF)
# --------------------------------
# Options
# --------------------------------
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
option(COMPONENT_CLI "Build CLI Component" ON)
option(COMPONENT_GUI "Build GUI Component (Qt5)" OFF)
include(libeoskeygen)
if (NOT COMPONENT_CLI AND NOT COMPONENT_GUI)
message(FATAL_ERROR "Atleast one of BUILD_COMPONENT_GUI,BUILD_COMPONENT_CLI must be set to ON")
endif()
# Use installpath from GNUInstallDirs as default.
# --------------------------------
# CMake settings
# --------------------------------
# Append modules dir
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
# Default to debug build if none is set.
if (NOT CMAKE_BUILD_TYPE)
set( CMAKE_BUILD_TYPE Debug )
endif()
# Install path
include(GNUInstallDirs)
set( CMAKE_INSTALL_SHAREDIR ${CMAKE_INSTALL_DATADIR}/${CMAKE_PROJECT_NAME} )
if (WIN32)
# "Flat" install on windows.
set( CMAKE_INSTALL_BINDIR "." )
set( CMAKE_INSTALL_BINDIR "bin" )
set( CMAKE_INSTALL_DATADIR "." )
set( CMAKE_INSTALL_SHAREDIR "." )
set( CMAKE_INSTALL_MANDIR "." )
endif (WIN32)
# Configure the compiler options
# Path to a directory outside of CMAKE_BUILD_DIR
# Should be used to cache large downloaded data that won't be deleted on clean builds.
set( DOWNLOAD_CACHE_DIR ${CMAKE_CURRENT_LIST_DIR}/.cache )
set( components )
if (COMPONENT_CLI)
list(APPEND components cli )
endif()
if (COMPONENT_GUI)
list(APPEND components gui )
endif()
# --------------------------------
# Compiler settings
# --------------------------------
set( CMAKE_CXX_STANDARD 11 )
set( CMAKE_CXX_STANDARD_REQUIRED ON )
set( CMAKE_CXX_EXTENSIONS OFF )
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wall -Wconversion -Wno-sign-conversion -Wextra" )
elseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
add_definitions( "-D_CRT_SECURE_NO_WARNINGS=1" )
endif()
# c++ flags
add_compile_options(
"$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wall;-Wconversion;-Wno-sign-conversion;-Wextra>"
"$<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/W3;-D_CRT_SECURE_NO_WARNINGS=1>"
# --------------------------------
# Program
# --------------------------------
# Debug
"$<$<CONFIG:Debug>:$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-O0;-g>>"
"$<$<CONFIG:Debug>:$<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/Od;/Zi>>"
set (PROGRAM_EXE ${CMAKE_PROJECT_NAME})
# Release
"$<$<CONFIG:Release>:$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-O3>>"
"$<$<CONFIG:Release>:$<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/O2>>"
set (PROGRAM_SOURCE
src/isatty.cpp
src/cli_key_search_result.cpp
src/console.cpp
src/benchmark.cpp
src/main.cpp
# MinSizeRel
"$<$<CONFIG:MinSizeRel>:$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Os>>"
"$<$<CONFIG:MinSizeRel>:$<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/O1>>"
)
if (WIN32 AND NOT FORCE_ANSI)
set (PROGRAM_SOURCE ${PROGRAM_SOURCE} src/console_win32.cpp)
else()
# *nix should have ansi support.
set (PROGRAM_SOURCE ${PROGRAM_SOURCE} src/console_ansi.cpp)
endif()
add_link_options(
# Release
"$<$<CONFIG:Release>:$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-s>>"
)
include(CheckPIESupported)
check_pie_supported()
#cmake_policy(SET CMP0083 NEW)
set( CMAKE_POSITION_INDEPENDENT_CODE TRUE )
# Project config file
configure_file(src/config.h.in "${PROJECT_BINARY_DIR}/config.h" @ONLY)
configure_file(config.hpp.in "${PROJECT_BINARY_DIR}/config.hpp" @ONLY)
include_directories(${PROJECT_BINARY_DIR})
add_executable( ${PROGRAM_EXE} ${PROGRAM_SOURCE} )
target_link_libraries( ${PROGRAM_EXE} PUBLIC eoskeygen )
# --------------------------------
# Install
# --------------------------------
install(TARGETS ${PROGRAM_EXE} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
# Readme and license
install(FILES README.md LICENSE LICENSE.bitcoin
DESTINATION ${CMAKE_INSTALL_SHAREDIR})
# Documentation
if (UNIX)
configure_file( docs/eosio-keygen.1.in ${PROJECT_BINARY_DIR}/man1/eosio-keygen.1 )
install(DIRECTORY ${PROJECT_BINARY_DIR}/man1
DESTINATION ${CMAKE_INSTALL_MANDIR})
endif (UNIX)
# Bundle antelope-extras on windows.
if (WIN32)
include(extras)
list(APPEND components extras )
endif()
# --------------------------------
# Package
# --------------------------------
include(CPackConfig)
set( CPACK_COMPONENTS_ALL ${components} )
if (CPACK_GENERATOR MATCHES "^[Nn][Ss][Ii][Ss]$")
set( NSIS_LICENSE_FILE ${PROJECT_BINARY_DIR}/NSIS_LICENSE )
file(WRITE ${NSIS_LICENSE_FILE} "")
foreach(file IN ITEMS LICENSE LICENSE.bitcoin)
file(READ ${CMAKE_CURRENT_LIST_DIR}/${file} content)
file(APPEND ${NSIS_LICENSE_FILE} "--- ${file}\n\n${content}\n")
endforeach()
set( CPACK_RESOURCE_FILE_LICENSE ${NSIS_LICENSE_FILE} )
set( CPACK_RESOURCE_FILE_LICENSE ${PROJECT_LICENSE_FILE} )
endif()
set( CPACK_DEBIAN_PACKAGE_PRIORITY "optional" )
set( CPACK_DEBIAN_PACKAGE_SECTION "misc" )
set( CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON )
set (CPACK_PROPERTIES_FILE ${PROJECT_BINARY_DIR}/CPackComponentsInclude.cmake)
configure_file(cmake/CPackProperties.cmake.in ${CPACK_PROPERTIES_FILE} @ONLY)
include( cpack_custom )
# --------------------------------
# Components
# --------------------------------
add_subdirectory( common )
foreach(comp ${components})
if ( EXISTS ${CMAKE_CURRENT_LIST_DIR}/${comp} )
add_subdirectory( ${comp} )
endif()
endforeach()
# --------------------------------
# CPack
# --------------------------------
include (CPack)

View file

@ -1,52 +0,0 @@
# --------------------------------
# Variables
# --------------------------------
set( LIBEOSKEYGEN_GIT_URL "https://github.com/eosswedenorg/libeoskeygen.git" )
set( LIBEOSKEYGEN_WANTED_VERSION 0.1.1 )
# --------------------------------
# Macros
# --------------------------------
macro(fromGit tag)
message ("Using libeoskeygen from: ${LIBEOSKEYGEN_GIT_URL}@${tag}")
include(FetchContent)
FetchContent_Declare(libeoskeygen
GIT_REPOSITORY ${LIBEOSKEYGEN_GIT_URL}
GIT_TAG ${tag}
)
FetchContent_GetProperties(libeoskeygen)
if (NOT libeoskeygen_POPULATED)
FetchContent_Populate(libeoskeygen)
add_subdirectory(${libeoskeygen_SOURCE_DIR} ${libeoskeygen_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()
endmacro()
macro(buildLocal src)
message ("Using local libeoskeygen at: ${src}")
add_subdirectory(${src} ${src}/build EXCLUDE_FROM_ALL)
endmacro()
# If we have a local libeoskeygen
if (LIBEOSKEYGEN_SOURCE_DIR)
buildLocal( ${LIBEOSKEYGEN_SOURCE_DIR} )
else()
# Check if version is in fact a version.
if (LIBEOSKEYGEN_WANTED_VERSION MATCHES "^[0-9]+(.[0-9]+)?(.[0-9]+)(-[a-zA-Z0-9]+)?$")
# Try finding the package on the system.
find_package(libeoskeygen ${LIBEOSKEYGEN_WANTED_VERSION} QUIET)
if (libeoskeygen_FOUND)
message ("Using libeoskeygen in: ${libeoskeygen_DIR}")
# Not found, download from git.
else()
fromGit( v${LIBEOSKEYGEN_WANTED_VERSION} )
endif()
# Assume version contains a git branch.
else()
fromGit( ${LIBEOSKEYGEN_WANTED_VERSION} )
endif()
endif()

View file

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2019-2020 EOS Sw/eden
Copyright (c) 2019-2023 EOS Sw/eden
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View file

@ -1,22 +0,0 @@
The MIT License (MIT)
Copyright (c) 2009-2019 The Bitcoin Core developers
Copyright (c) 2009-2019 Bitcoin Developers
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

128
README.md
View file

@ -1,18 +1,25 @@
![](https://github.com/eosswedenorg/eosio-keygen/workflows/CI/badge.svg)
[![GitHub release](https://img.shields.io/github/v/release/eosswedenorg/eosio-keygen?include_prereleases)](https://github.com/eosswedenorg/eosio-keygen/releases/latest)
[![CI Test](https://github.com/eosswedenorg/antelope-keygen/workflows/CI/badge.svg)](https://github.com/eosswedenorg/antelope-keygen/actions)
[![GitHub release](https://img.shields.io/github/v/release/eosswedenorg/antelope-keygen?include_prereleases)](https://github.com/eosswedenorg/antelope-keygen/releases/latest)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
# EOSIO Keygen
# Antelope Keygen
This program generates public and private keypair for [EOS](https://eos.io/)
This program generates public and private keypair for [Antelope IO](https://antelope.io)
## Compile
You will need `libeoskeygen` and `cmake 3.15` or later to compile this project.
You will need `libantelope` and `cmake 3.15` or later to compile this project.
`Qt 5.9.0` or later is required for the graphical program.
### Linux/MacOS
**NOTE:** Only Ubuntu 20.04 and 22.04 and Fedoora 36 is officially supported.
The project should compile fine on most versions/distros but it is only tested
and distributed for those distros/versions by [Sw/eden](http://www.eossweden.org).
#### Dependencies
#### Linux
@ -25,31 +32,6 @@ First you need to have a compiler. this can be installed with apt.
$ apt-get install gcc g++
```
You then need `libeoskeygen`.
This can be installed from [EOS Sweden's APT Repository](https://eosswedenorg.github.io/apt) like this:
```sh
$ sudo apt-get install software-properties-common
$ curl https://apt.eossweden.org/key 2> /dev/null | sudo apt-key add -
$ sudo apt-add-repository -y 'deb [arch=amd64] https://apt.eossweden.org/main `lsb_release -cs` stable'
$ sudo apt-get install libeoskeygen-dev
```
or manually via `.deb` file from [github](https://github.com/eosswedenorg/libeoskeygen/releases)
```sh
$ wget <url>
$ sudo apt install ./libeoskeygen-dev-<version>.deb
```
**Other**:
Consult the manual for you package manager.
`libeoskeygen` will be downloaded and compiled if it's not installed automatically (however this is slower).
Consult [libeoskeygen's github](https://github.com/eosswedenorg/libeoskeygen) if you want to compile and install it manually.
**CMake**
If your package manager don't provide a sufficiently new version of cmake, you can install it with these commands:
@ -70,8 +52,23 @@ $ wget -O cmake.sh https://github.com/Kitware/CMake/releases/download/v3.15.5/cm
Other methods is documanted at https://cmake.org/download
**Qt (only for gui program)**
You will need to install `qt >= 5.9.0`
On **ubuntu** you can do this via `apt`
```
$ apt-get install qt5-default
```
For other distributions, download the official [qt-installer](https://www.qt.io/download-qt-installer).
It is recommended to install the latest stable version.
#### MacOS
**NOTE:** Support for MacOS is still experimental and may or may not work as expected.
You must have a compiler installed. This project is known to build with `Xcode 11.0` but other versions should work.
You need to have cmake installed also, this can be done with this `brew` command:
@ -81,7 +78,15 @@ $ brew install cmake
If you need a newer version of cmake, you can download the official `.dmg` file: [cmake-3.15.7-Darwin-x86_64.dmg](https://github.com/Kitware/CMake/releases/download/v3.15.7/cmake-3.15.7-Darwin-x86_64.dmg). or see https://cmake.org/download for other versions.
`libeoskeygen` needs to be compiled and installed from source. [Go here](https://github.com/eosswedenorg/libeoskeygen)
`libantelope` needs to be compiled and installed from source. [Go here](https://github.com/eosswedenorg/libantelope)
**Qt (only for gui program)**
This can be installed with brew.
```sh
$ brew install qt
```
#### Build
@ -105,7 +110,9 @@ Download and install `cmake` version `3.15` or newer from [cmake.org](https://cm
You will also need a compiler. [Build Tools for Visual Studio 2019](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools&rel=16) (Selecting C++ during installation) is recommended.
**Qt (only for gui program)**
Download the official [qt-installer](https://www.qt.io/download-qt-installer) and follow the steps. It is recommended to install the latest stable version.
#### Build.
@ -117,10 +124,16 @@ you need to set `OPENSSL_ROOT_DIR` to the directory where you unpacked
For example:
```
C:\repo> mkdir build
C:\repo> cd build
C:\repo\build> cmake -D OPENSSL_ROOT_DIR="C:/path/to/openssl-1.1/x86" ..
C:\repo\build> cmake --build . --config Release
C:\repo> cmake -D OPENSSL_ROOT_DIR="C:/path/to/openssl-1.1/x86" -B build
C:\repo> cmake --build build --config Release
```
**Qt**
If you are compiling the gui program. you will need to point `cmake` to the location `qt` where installed. this can be done by the `CMAKE_PREFIX_PATH` variable:
```
C:\repo> cmake -D CMAKE_PREFIX_PATH="C:/path/to/qt/msvc2017_64"
```
## Compile options
@ -128,12 +141,40 @@ C:\repo\build> cmake --build . --config Release
These compile options are available:
| Cmake | build.sh | Description |
|--------------------------- | ----------------- | ------------------------------------------|
| -DCMAKE_BUILD_TYPE=`value` | -t `value` | Type of build |
|--------------------------- | ----------------- | ----------------------------------------- |
| -DCOMPONENT_CLI=`OFF` | --no-cli | Do not build cli program |
| -DCOMPONENT_GUI=`ON` | --gui | Build gui program (Qt5) |
| -DUSE_THREADS=`OFF` | --disable-threads | Disable thread support |
| -DCMAKE_BUILD_TYPE=`value` | -t `value` | Type of build |
| -DFORCE_ANSI=`ON` | --force-ansi | Force ANSI console colors even on windows |
For more details about options run `./build.sh -l` or `mkdir build && cmake build -LA`
### libantelope
To speed up the build process, you can install `libantelope`
#### Ubuntu
You can use [Sw/eden's APT Repository](https://eosswedenorg.github.io/apt) like this:
```sh
$ sudo apt-get install software-properties-common
$ curl https://apt.eossweden.org/key 2> /dev/null | sudo apt-key add -
$ sudo apt-add-repository -y 'deb [arch=amd64] https://apt.eossweden.org/main `lsb_release -cs` stable'
$ sudo apt-get install libantelope-dev
```
or manually via `.deb` file from [github](https://github.com/eosswedenorg/libantelope/releases)
```sh
$ wget <url>
$ sudo apt install ./libantelope-dev-<version>.deb
```
#### Other
Consult [libantelope's github](https://github.com/eosswedenorg/libantelope)
## Install
After the project has been compiled. run `sudo ./install.sh` or the following code if you dont want to use that:
@ -154,13 +195,12 @@ Run `sudo ./uninstall.sh` or remove the files listed in `build/install_manifest.
## Security notice
Keys are generated by `OpenSSL`'s `EC_KEY_generate_key` function. The program will
never expose your keys to anything but the computers memory and output of the
program. You are free to inspect the source code and compile yourself to verify.
Keys are generated using [libantelope](https://github.com/eosswedenorg/libantelope)
while the library does not claim to guarantee cryptographically secure keys. it
relies on widly used open source cryptographic libraries (OpenSSL, libsecp256k1).
However, use this at your own risk. we cannot guarantee that the keys are
cryptographically secure as this depends on OpenSSL's implementation (alto it is
widely used and should be safe)
Use at your own risk. The author and [Sw/eden](https://eossweden.org/) does not take responsability
for any damage caused by keys generated by the program.
Please read the `LICENSE` file.
@ -175,4 +215,4 @@ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
## Author
Henrik Hautakoski - [henrik@eossweden.org](mailto:henrik@eossweden.org)
Henrik Hautakoski - [Sw/eden](https://eossweden.org/) - [henrik@eossweden.org](mailto:henrik@eossweden.org)

View file

@ -1,18 +1,20 @@
#!/bin/bash
function usage() {
echo "Usage: ${0##*/} [ -h|--help ] [ -t|--type Debug|Release|RelWithDebInfo|MinSizeRel ] [--pkg-type deb|zip|tgz] [ --disable-threads ] [ --force-ansi ]"
echo "Usage: ${0##*/} [ -h|--help ] [ --cli|--no-cli ] [ --gui|--no-gui] [ -t|--type Debug|Release|RelWithDebInfo|MinSizeRel ] [ --libeosio=<path> ] [ --pkg-type nsis|deb|zip|tgz ] [ --disable-threads ] [ --force-ansi ]"
exit 1
}
options=$(getopt -n "${0##*/}" -o "lht:" -l "help,type:,pkg-type:,disable-threads,force-ansi" -- "$@")
options=$(getopt -n "${0##*/}" -o "lht:" -l "help,cli,no-cli,gui,no-gui,type:,libeosio:,pkg-type:,disable-threads,force-ansi" -- "$@")
[ $? -eq 0 ] || usage
eval set -- "$options"
TARGET="all"
ONLY_CONFIG=0
ARGS=""
BUILD_ARGS="--clean-first"
while true; do
case $1 in
@ -23,16 +25,29 @@ while true; do
usage
}
ARGS="${ARGS} -DCMAKE_BUILD_TYPE=${1}"
BUILD_ARGS="${BUILD_ARGS} --config ${1}"
;;
--pkg-type)
shift
[[ ! "$1" =~ ^(deb|zip|tgz)$ ]] && {
[[ ! "$1" =~ ^(nsis|deb|rpm|zip|tgz)$ ]] && {
echo "Incorrect package type '$1' provided"
usage
}
TARGET="package"
ARGS="${ARGS} -DCPACK_GENERATOR=${1^^}"
;;
--libeosio)
shift
ARGS="${ARGS} -DLIBEOSIO_SOURCE_DIR=${1}"
;;
--cli)
ARGS="${ARGS} -DCOMPONENT_CLI=ON" ;;
--no-cli)
ARGS="${ARGS} -DCOMPONENT_CLI=OFF" ;;
--gui)
ARGS="${ARGS} -DCOMPONENT_GUI=ON" ;;
--no-gui)
ARGS="${ARGS} -DCOMPONENT_GUI=OFF" ;;
--disable-threads)
ARGS="${ARGS} -DUSE_THREADS=OFF" ;;
--force-ansi)
@ -48,7 +63,10 @@ while true; do
shift
done
# Remove cache first
rm build/CMakeCache.txt 2> /dev/null
cmake -B build $ARGS .
if [ ${ONLY_CONFIG} -eq 0 ]; then
cmake --build build --clean-first --target ${TARGET}
cmake --build build ${BUILD_ARGS} --target ${TARGET}
fi

84
cli/CMakeLists.txt Normal file
View file

@ -0,0 +1,84 @@
cmake_minimum_required(VERSION 3.15)
# --------------------------------
# Project Info
# --------------------------------
project(antelope-keygen
VERSION ${CMAKE_PROJECT_VERSION}
LANGUAGES CXX)
# Options
option(FORCE_ANSI "Force ANSI console colors even on windows" OFF)
# --------------------------------
# Program
# --------------------------------
set (PROGRAM_EXE ${PROJECT_NAME})
set (PROGRAM_SOURCE
src/isatty.cpp
src/cli_key_search_result.cpp
src/console.cpp
src/benchmark.cpp
src/main.cpp
)
if (WIN32 AND NOT FORCE_ANSI)
set (PROGRAM_SOURCE ${PROGRAM_SOURCE} src/console_win32.cpp)
else()
# *nix should have ansi support.
set (PROGRAM_SOURCE ${PROGRAM_SOURCE} src/console_ansi.cpp)
endif()
add_executable( ${PROGRAM_EXE} ${PROGRAM_SOURCE} )
# Include CLI11
include ( ${CMAKE_SOURCE_DIR}/lib/CLI11/CMakeLists.txt )
target_include_directories( ${PROGRAM_EXE} PRIVATE ${LIBCLI11_INCLUDE} )
target_link_libraries( ${PROGRAM_EXE} PUBLIC common )
# --------------------------------
# Install
# --------------------------------
install(TARGETS ${PROGRAM_EXE}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
COMPONENT cli)
install(FILES ${PROJECT_LICENSE_FILE}
DESTINATION ${CMAKE_INSTALL_SHAREDIR}
COMPONENT cli
RENAME LICENSE.cli)
install (FILES ${LIBCLI11_LICENSE}
DESTINATION ${CMAKE_INSTALL_SHAREDIR}
COMPONENT cli
RENAME LICENSE.libcli11)
# Documentation
configure_file( docs/README.md.in ${PROJECT_BINARY_DIR}/README.cli.md @ONLY )
install(FILES ${PROJECT_BINARY_DIR}/README.cli.md
DESTINATION ${CMAKE_INSTALL_SHAREDIR}
COMPONENT cli)
if (UNIX)
configure_file( docs/antelope-keygen.1.in ${PROJECT_BINARY_DIR}/man1/antelope-keygen.1 )
configure_file( docs/antelope-keygen-search.1.in ${PROJECT_BINARY_DIR}/man1/antelope-keygen-search.1 )
configure_file( docs/antelope-keygen-benchmark.1.in ${PROJECT_BINARY_DIR}/man1/antelope-keygen-benchmark.1 )
install(DIRECTORY ${PROJECT_BINARY_DIR}/man1
DESTINATION ${CMAKE_INSTALL_MANDIR}
COMPONENT cli)
endif (UNIX)
# --------------------------------
# Package
# --------------------------------
configure_file(cmake/CPackComponentConfig.cmake.in
${PROJECT_BINARY_DIR}/CPackProperties.cmake)

View file

@ -0,0 +1,16 @@
# --------------------------------
# CPack Component Config
# --------------------------------
set( CPACK_PACKAGE_CLI_NAME "${PROJECT_NAME}" )
set( CPACK_PACKAGE_CLI_CONTACT "${PROJECT_MAINTAINER}" )
set( CPACK_COMPONENT_CLI_DESCRIPTION "Command line application" )
# Debian specific
set( CPACK_DEBIAN_CLI_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}-${CPACK_DEBIAN_PACKAGE_RELEASE}-${CPACK_SYSTEM_NAME}-${CPACK_SYSTEM_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}.deb")
set( CPACK_DEBIAN_CLI_PACKAGE_NAME "${PROJECT_NAME}" )
set( CPACK_DEBIAN_CLI_PACKAGE_PRIORITY "optional" )
set( CPACK_DEBIAN_CLI_PACKAGE_SECTION "misc" )
set( CPACK_DEBIAN_CLI_PACKAGE_DEPENDS "libssl1.1 (>= 1.1.0) | libssl3 (>= 3.0.0), libstdc++6 (>= 6)")

106
cli/docs/README.md.in Normal file
View file

@ -0,0 +1,106 @@
# @PROJECT_NAME@ (cli)
Generate public and private keypair for [Antelope IO](https://antelope.io)
Source code is available at [github.com](https://github.com/eosswedenorg/antelope-keygen)
## Synopsis
```shell
@PROJECT_NAME@ [-h|--help]
@PROJECT_NAME@ [-v]
@PROJECT_NAME@ search [-m] [--l33t] [--threads <num>] [--dict <file1> ...] [--lang <value> ...] word_list [count]
@PROJECT_NAME@ benchmark [num_keys]
```
## Description
Output one Antelope key pair if no arguments are given.
Options and subcommands are as follows:
### General flags
| syntax | Description |
| --------------- | ---------------- |
| -h, --help | Shows help text. |
| -v | Shows version |
### search command
`@PROJECT_NAME@ search [-m] [--l33t] [--threads <num>] [--dict <file1> ...] [--lang <value> ...] word_list [count]`
performs a search, finding `count` public keys containing one or more words from `word_list` (separated with ',').
Instead of a list it is possible to specify a file with words (separated with newline '\n') using `file:/path/to/file`
#### Search specific options
#### -m
Monochrome, disables all color output.
#### --leet
Takes each word in `word_list` and find all l33tspeak combinations of that word and uses the new list for the search.
#### --threads num
Use `num` of parallel threads for searching. Default is what the operating system recommends.
#### --dict file
Use words found in `file` (separated by newline) to highlight words in the keys
found (note that the words in this file are not used for search. only for highlight output).
There can be more then one `--dict` flag. In that case contents of all files are merged into one dictionary.
#### --lang value
Same as `--dict` but will use `value` to find a file in `@CMAKE_INSTALL_FULL_DATADIR@/@CMAKE_PROJECT_NAME@/dict`.
There can be more then one `--lang` flag. In that case contents of all files are merged into one dictionary.
#### count
Number of keys to search for (default is 10)
### benchmark command
`@PROJECT_NAME@ benchmark [num_keys]`
performs a benchmark test, generating `num_keys` keys and measuring the time.
#### Benchmark specific options:
#### num_keys
Number of keys to search for (default is 10)
## Security notice
Keys are generated using [libantelope](https://github.com/eosswedenorg/libantelope)
while the library does not claim to guarantee cryptographically secure keys. it
relies on widly used open source cryptographic libraries (OpenSSL, libsecp256k1).
Use at your own risk. The author and [Sw/eden](https://eossweden.org/) does not take responsability
for any damage caused by keys generated by the program.
Please read the `LICENSE.cli` file.
```
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
```
## Author
Henrik Hautakoski - [Sw/eden](https://eossweden.org/) - [henrik@eossweden.org](mailto:henrik@eossweden.org)

View file

@ -0,0 +1,67 @@
.TH @PROJECT_NAME@-benchmark 1 "April, 2023" "@PROJECT_NAME@-benchmark @PROJECT_VERSION@"
.SH NAME
@PROJECT_NAME@ benchmark - Benchmark the performance of the @PROJECT_NAME@ key generator.
.SH SYNOPSIS
.SY @PROJECT_NAME@
benchmark
.OP \-h|--help
.YS
.SY @PROJECT_NAME@
benchmark
.OP num_keys
.YS
.SH DESCRIPTION
performs a benchmark test, generating \fInum_keys\fR (default 1000) keys and measuring the time.
.SH SECURITY NOTICE
.PP
Keys are generated using
.UR https://github.com/eosswedenorg/libantelope
libantelope
.UE .
while the library does not claim to guarantee cryptographically secure keys. it
relies on widly used open source cryptographic libraries (OpenSSL, libsecp256k1).
.PP
Use at your own risk. The author and
.UR https://eossweden.org
Sw/eden
.UE
does not take responsability for any damage caused by keys generated by the program.
.P
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
.br
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
.br
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
.br
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
.br
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
.br
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
.SH BUGS
Report bugs to
.UR https://github.com/eosswedenorg/eosio-keygen/issues
Github
.UE . Thank you.
.SH AUTHOR
.MT henrik@eossweden.org
Henrik Hautakoski
.ME
.UR https://eossweden.org
EOS Sw/eden
.UE

View file

@ -0,0 +1,112 @@
.TH @PROJECT_NAME@-search 1 "April, 2023" "@PROJECT_NAME@-search @PROJECT_VERSION@"
.SH NAME
@PROJECT_NAME@ search - Search after
.UR https://antelope.io
Antelope IO
.UE
vanity keys.
.SH SYNOPSIS
.SY @PROJECT_NAME@
search
.OP \-h|--help
.YS
.SY @PROJECT_NAME@
search
.OP -m
.OP \--l33t
.OP \--threads <num>
.OP \--dict <file1> ...
.OP \--lang <value> ...
.B word_list
.OP count
.YS
.SH DESCRIPTION
.PP
performs a search, finding \fIcount\fR public keys containing one or more words from
\fIword_list\fR (separated with ',').
.PP
Instead of a list it is possible to specify a file with words (separated with newline \fB'\\n'\fR) using
\fIfile:<filename\fR
.TP
\fB\-h\fR, \fB\-\-help\fR
Show help text.
.TP
\fB\-m\fR
Monochrome, disables all color output.
.TP
.B --l33t
Takes each word in <\fIword_list\fR> and find all l33tspeak combinations of that word and uses the new list for the search.
.TP
\fB\-\-threads\fR \fInum\fR
Use <\fInum\fR> of parallel threads for searching. Default is what the operating system recommends.
.TP
\fB\-\-dict\fR \fIfile\fR
Use words found in \fIfile\fR (separated by newline) to highlight words in the keys found.
.br
There can be more then one \fB\-\-dict\fR flag.
In that case contents of all files are merged into one dictionary.
.br
\fBnote:\fR the words in this file are not used for search. only for highlight output.
.TP
\fB\-\-lang\fR \fIvalue\fR
Same as \fB\-\-dict\fR but will use \fIvalue\fR to find a file in
\fB@CMAKE_INSTALL_FULL_DATADIR@/@CMAKE_PROJECT_NAME@/dict\fR.
.br
There can be more then one \fB\-\-lang\fR flag. In that case contents of all files are merged into one dictionary.
.TP
\fBcount\fR
Number of keys to search for (default is 10)
.SH SECURITY NOTICE
.PP
Keys are generated using
.UR https://github.com/eosswedenorg/libantelope
libantelope
.UE .
while the library does not claim to guarantee cryptographically secure keys. it
relies on widly used open source cryptographic libraries (OpenSSL, libsecp256k1).
.PP
Use at your own risk. The author and
.UR https://eossweden.org
Sw/eden
.UE
does not take responsability for any damage caused by keys generated by the program.
.P
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
.br
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
.br
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
.br
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
.br
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
.br
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
.SH BUGS
Report bugs to
.UR https://github.com/eosswedenorg/eosio-keygen/issues
Github
.UE . Thank you.
.SH AUTHOR
.MT henrik@eossweden.org
Henrik Hautakoski
.ME
.UR https://eossweden.org
EOS Sw/eden
.UE

View file

@ -0,0 +1,106 @@
.TH @PROJECT_NAME@ 1 "April, 2023" "@PROJECT_NAME@ @PROJECT_VERSION@"
.SH NAME
@PROJECT_NAME@ - Generate public and private keypair for
.UR https://antelope.io
Antelope IO
.UE .
.SH SYNOPSIS
.SY @PROJECT_NAME@
.OP \-h|--help
.YS
.SY @PROJECT_NAME@
.OP \-v
.YS
.SY @PROJECT_NAME@
.OP \--format <value>
.YS
.SH SUBCOMMANDS
.PP
\fB@PROJECT_NAME@ search\fR
.RS 4
Search after
.UR https://antelope.io
Antelope IO
.UE
vanity keys.
.br
see \fB@PROJECT_NAME@-search\fR(1)
.RE
.PP
\fB@PROJECT_NAME@ benchmark\fR
.RS 4
Benchmark the performance of the @PROJECT_NAME@ key generator.
.br
see \fB@PROJECT_NAME@-benchmark\fR(1)
.RE
.SH DESCRIPTION
.PP
Output one Antelope key pair if no arguments are given
.PP
Options and subcommands are as follows:
.TP
\fB\-h\fR, \fB\-\-help\fR
Shows this help text.
.TP
\fB\-v\fR
Shows version.
.TP
\fB\-\-format\fR \fR\fI\,value\/\fR
What keyformat to use, valid values are: \fIK1\fR, \fIlegacy\fR, \fIfio\fR
.SH SECURITY NOTICE
.PP
Keys are generated using
.UR https://github.com/eosswedenorg/libantelope
libantelope
.UE .
while the library does not claim to guarantee cryptographically secure keys. it
relies on widly used open source cryptographic libraries (OpenSSL, libsecp256k1).
.PP
Use at your own risk. The author and
.UR https://eossweden.org
Sw/eden
.UE
does not take responsability for any damage caused by keys generated by the program.
.P
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
.br
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
.br
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
.br
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
.br
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
.br
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
.SH BUGS
Report bugs to
.UR https://github.com/eosswedenorg/eosio-keygen/issues
Github
.UE . Thank you.
.SH AUTHOR
.MT henrik@eossweden.org
Henrik Hautakoski
.ME
.UR https://eossweden.org
EOS Sw/eden
.UE

View file

@ -1,7 +1,7 @@
/**
* MIT License
*
* Copyright (c) 2019-2020 EOS Sw/eden
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@ -22,33 +22,29 @@
* SOFTWARE.
*/
#include <chrono>
#include <eoskeygen/crypto/ec.h>
#include "benchmark.h"
#include <libantelope/ec.hpp>
#include "benchmark.hpp"
using std::chrono::steady_clock;
using std::chrono::duration;
using std::chrono::time_point;
namespace antelopekeygen {
namespace eoskeygen {
std::chrono::duration<float> _run_benchmark(size_t num_keys) {
auto start = std::chrono::steady_clock::now();
for(size_t i = 0; i < num_keys; i++) {
struct libantelope::ec_keypair k;
libantelope::ec_generate_key(&k);
}
return std::chrono::steady_clock::now() - start;
}
void benchmark(size_t num_keys, struct benchmark_result* res) {
time_point<steady_clock> start;
if (num_keys < 1) {
res->sec = res->kps = 0;
return;
}
start = steady_clock::now();
for(size_t i = 0; i < num_keys; i++) {
struct ec_keypair k;
ec_generate_key(&k);
}
res->sec = duration<float>(steady_clock::now() - start).count();
res->sec = _run_benchmark(num_keys).count();
res->kps = static_cast<float>(num_keys) / res->sec;
}
} // namespace eoskeygen
} // namespace antelopekeygen

View file

@ -1,7 +1,7 @@
/**
* MIT License
*
* Copyright (c) 2019-2020 EOS Sw/eden
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@ -26,7 +26,7 @@
#include <ctime>
namespace eoskeygen {
namespace antelopekeygen {
struct benchmark_result {
float sec; // elapsed seconds.
@ -35,6 +35,6 @@ struct benchmark_result {
void benchmark(size_t num_keys, struct benchmark_result* res);
} // namespace eoskeygen
} // namespace antelopekeygen
#endif /* EOSIOKEYGEN_BENCHMARK_H */

View file

@ -1,7 +1,7 @@
/**
* MIT License
*
* Copyright (c) 2019-2020 EOS Sw/eden
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@ -21,13 +21,14 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <string>
#include <iostream>
#include <eoskeygen/core/dictionary.h>
#include <eoskeygen/crypto/WIF.h>
#include "console.h"
#include "cli_key_search_result.h"
#include <libantelope/WIF.hpp>
#include <eoskeygen/core/dictionary.hpp>
#include "console.hpp"
#include "cli_key_search_result.hpp"
namespace eoskeygen {
namespace antelopekeygen {
static size_t highlight(console::Color color, const std::string& str, size_t pos, size_t len) {
@ -37,21 +38,23 @@ static size_t highlight(console::Color color, const std::string& str, size_t pos
return len;
}
CliKeySearchResult::CliKeySearchResult(const Dictionary& dict) :
m_dict (dict)
CliKeySearchResult::CliKeySearchResult(const Dictionary& dict, const libantelope::wif_codec_t& codec) :
m_dict (dict),
m_codec (codec)
{
}
void CliKeySearchResult::onResult(const struct ec_keypair* key, const struct KeySearch::result& result) {
void CliKeySearchResult::onResult(const struct libantelope::ec_keypair* key, const struct KeySearch::result& result) {
std::string pub = wif_pub_encode(key->pub);
std::string pub = libantelope::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: EOS";
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);
@ -68,7 +71,7 @@ void CliKeySearchResult::onResult(const struct ec_keypair* key, const struct Key
}
std::cout << std::endl
<< "Private: " << wif_priv_encode(key->secret) << std::endl;
<< "Private: " << libantelope::wif_priv_encode(key->secret, m_codec.pvt) << std::endl;
}
} // namespace eoskeygen
} // namespace antelopekeygen

View file

@ -1,7 +1,7 @@
/**
* MIT License
*
* Copyright (c) 2019-2020 EOS Sw/eden
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@ -24,27 +24,31 @@
#ifndef EOSIOKEYGEN_KEY_SEARCH_HELPERS_H
#define EOSIOKEYGEN_KEY_SEARCH_HELPERS_H
#include <eoskeygen/core/string.h>
#include <eoskeygen/crypto/types.h>
#include <eoskeygen/key_search.h>
#include <eoskeygen/key_search_result.h>
#include <string>
#include <libantelope/ec.hpp>
#include <libantelope/WIF.hpp>
#include <eoskeygen/core/string.hpp>
#include <eoskeygen/key_search.hpp>
#include <eoskeygen/key_search_result.hpp>
namespace eoskeygen {
namespace antelopekeygen {
class Dictionary;
class CliKeySearchResult : public IKeySearchResult
{
public:
CliKeySearchResult(const Dictionary& dict);
CliKeySearchResult(const Dictionary& dict, const libantelope::wif_codec_t& codec);
virtual void onResult(const struct ec_keypair* key, const struct KeySearch::result& result);
virtual void onResult(const struct libantelope::ec_keypair* key, const struct KeySearch::result& result);
protected :
const Dictionary& m_dict;
libantelope::wif_codec_t m_codec;
};
} // namespace eoskeygen
} // namespace antelopekeygen
#endif /* EOSIOKEYGEN_KEY_SEARCH_HELPERS_H */

View file

@ -1,7 +1,7 @@
/**
* MIT License
*
* Copyright (c) 2019-2020 EOS Sw/eden
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@ -22,10 +22,10 @@
* SOFTWARE.
*/
#include <iostream>
#include "isatty.h"
#include "console.h"
#include "isatty.hpp"
#include "console.hpp"
namespace eoskeygen { namespace console {
namespace antelopekeygen { namespace console {
bool disable_color = false;
@ -45,4 +45,4 @@ bool isColorsSupported(const std::ostream& os) {
return disable_color == false && isatty(fd);
}
} } // namespace eoskeygen::console
} } // namespace antelopekeygen::console

View file

@ -1,7 +1,7 @@
/**
* MIT License
*
* Copyright (c) 2019-2020 EOS Sw/eden
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@ -26,7 +26,7 @@
#include <ostream>
namespace eoskeygen {
namespace antelopekeygen {
namespace console {
@ -86,6 +86,6 @@ namespace console {
} // namespace console
} // namespace eoskeygen
} // namespace antelopekeygen
#endif /* EOSIOKEYGEN_CONSOLE_H */

View file

@ -1,7 +1,7 @@
/**
* MIT License
*
* Copyright (c) 2019-2020 EOS Sw/eden
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@ -22,9 +22,9 @@
* SOFTWARE.
*/
#include <iostream>
#include "console.h"
#include "console.hpp"
namespace eoskeygen {
namespace antelopekeygen {
namespace console {
@ -80,4 +80,4 @@ std::ostream& operator<<(std::ostream& os, const fg& obj) {
} // namespace console
} // namespace eoskeygen
} // namespace antelopekeygen

View file

@ -1,7 +1,7 @@
/**
* MIT License
*
* Copyright (c) 2019-2020 EOS Sw/eden
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@ -23,9 +23,9 @@
*/
#include <windows.h>
#include <iostream>
#include "console.h"
#include "console.hpp"
namespace eoskeygen {
namespace antelopekeygen {
// WinAPI colors
#define FG_BLACK 0
@ -105,4 +105,4 @@ std::ostream& operator<<(std::ostream& os, const fg& obj) {
} // namespace console
} // namespace eoskeygen
} // namespace antelopekeygen

45
cli/src/isatty.cpp Normal file
View file

@ -0,0 +1,45 @@
/**
* MIT License
*
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#if _WIN32
#include <io.h>
#else
#include <unistd.h>
#define _isatty isatty
#define _fileno fileno
#endif
#include "isatty.hpp"
namespace antelopekeygen {
bool isatty(int fd) {
return ::_isatty(fd);
}
bool isatty(FILE* fd) {
// fileno() segfaults if fd is null.
return fd ? isatty(_fileno(fd)) : false;
}
} // namespace antelopekeygen

View file

@ -1,7 +1,7 @@
/**
* MIT License
*
* Copyright (c) 2019-2020 EOS Sw/eden
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@ -26,12 +26,12 @@
#include <stdio.h>
namespace eoskeygen {
namespace antelopekeygen {
bool isatty(int fd);
bool isatty(FILE* fd);
} // namespace eoskeygen
} // namespace antelopekeygen
#endif /* EOSIOKEYGEN_CORE_ISATTY_H */

247
cli/src/main.cpp Normal file
View file

@ -0,0 +1,247 @@
/**
* MIT License
*
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <iostream>
#include <cstring>
#include <CLI11/CLI11.hpp>
#include <libantelope/base58.hpp>
#include <libantelope/ec.hpp>
#include <libantelope/WIF.hpp>
#include <eoskeygen/config.hpp>
#include <eoskeygen/core/file.hpp>
#include <eoskeygen/core/string.hpp>
#include <eoskeygen/core/dictionary.hpp>
#include <eoskeygen/core/leet.hpp>
#include <eoskeygen/key_search.hpp>
#include "cli_key_search_result.hpp"
#include "console.hpp"
#include "benchmark.hpp"
#include "config.hpp"
// Command line options.
bool option_l33t = false;
libantelope::wif_codec_t key_codec;
#ifdef EOSIOKEYGEN_HAVE_THREADS
size_t option_num_threads;
#endif /* EOSIOKEYGEN_HAVE_THREADS */
class CustomFormatter : public CLI::Formatter {
public:
std::string make_usage(const CLI::App *app, std::string name) const
{
std::stringstream out;
out << std::endl << CLI::Formatter::make_usage(app, name)
<< std::endl
<< "Outputs one EOSIO key pair if no subcommand is given"
<< std::endl;
return out.str();
}
};
int cmd_search(const antelopekeygen::strlist_t& words, const antelopekeygen::Dictionary& dict, int count) {
antelopekeygen::KeySearch ks;
antelopekeygen::CliKeySearchResult rs(dict, key_codec);
ks.setPrefix(key_codec.pub);
ks.setCallback(&rs);
for(auto it = words.begin(); it != words.end(); it++) {
size_t p = libantelope::is_base58(*it);
if (p != std::string::npos) {
std::cerr << "The word '"
<< *it << "' contains an invalid non-base58 character '"
<< (*it)[p] << "'" << std::endl;
return 1;
}
}
if (option_l33t) {
for(std::size_t i = 0; i < words.size(); i++) {
ks.addList(antelopekeygen::l33twords(words[i]));
}
} else {
ks.addList(words);
}
#ifdef EOSIOKEYGEN_HAVE_THREADS
ks.setThreadCount(option_num_threads);
#endif /* EOSIOKEYGEN_HAVE_THREADS */
std::cout << "Searching for " << count
<< " keys containing: " << antelopekeygen::strlist::join(ks.getList(), ",")
#ifdef EOSIOKEYGEN_HAVE_THREADS
<< ", Using: " << ks.getThreadCount() << " threads"
#endif /* EOSIOKEYGEN_HAVE_THREADS */
<< std::endl;
ks.find(count);
return 0;
}
void cmd_benchmark(size_t num_keys) {
struct antelopekeygen::benchmark_result res;
std::cout << "Benchmark: Generating "
<< num_keys << " keys" << std::endl;
antelopekeygen::benchmark(num_keys, &res);
std::cout << "Result: Took " << res.sec << " seconds, "
<< res.kps << " keys per second." << std::endl;
}
int main(int argc, char **argv) {
CLI::App cmd("Keygenerator for Antelope based blockchains", PROGRAM_NAME);
std::vector<std::string> dict_list;
std::vector<std::string> lang_list;
std::string search_words;
std::string key_format;
int search_count;
size_t bench_count;
int rc = 0;
libantelope::ec_init();
CLI::Option* version = cmd.add_flag("-v,--version", "Show version");
cmd.add_option("--format", key_format, "valid values: K1, fio, legacy")->default_val("K1");
// Search
CLI::App* search_cmd = cmd.add_subcommand("search",
"performs a search, finding <count> public keys containing "
"one or more words from <word_list> (separated with \",\")");
CLI::Option* monocrome = search_cmd->add_flag("-m", "Monochrome, disables all color output.");
search_cmd->add_flag("--l33t", option_l33t, "Takes each word in <word_list> and find all l33tspeak"
" combinations of that word and uses the new list for the search.");
#ifdef EOSIOKEYGEN_HAVE_THREADS
search_cmd->add_option("--threads", option_num_threads,
"Use <num> of parallel threads for searching.\n"
"Default is what the operating system recomends.")
->default_val(antelopekeygen::KeySearch::max_threads());
#endif /* EOSIOKEYGEN_HAVE_THREADS */
search_cmd->add_option("--dict", dict_list, "");
search_cmd->add_option("--lang", lang_list, "");
search_cmd->add_option("word_list", search_words,
"one or more words (separated with \",\")\n\n"
"Instead of a list it is possible to specify a file with words\n"
"(separated with newline '\\n') using file:<filename>")->required();
search_cmd->add_option("count", search_count, "Number of keys to search for before the program terminates.")->default_val(10);
// Benchmark
CLI::App* bench_cmd = cmd.add_subcommand("benchmark", "performs a benchmark test, "
"generating <num> keys and measuring the time.");
bench_cmd->add_option("count", bench_count, "")->default_val(1000);
// Parse command line.
cmd.formatter(std::make_shared<CustomFormatter>());
CLI11_PARSE(cmd, argc, argv);
if (*version) {
std::cout << PROGRAM_NAME << ": v" << PROGRAM_VERSION << std::endl;
goto end;
}
if (key_format == "fio") {
key_codec = libantelope::wif_create_legacy_codec("FIO");
} else if (key_format == "legacy") {
key_codec = libantelope::WIF_CODEC_LEG;
} else if (key_format == "K1") {
key_codec = libantelope::WIF_CODEC_K1;
} else {
std::cerr << "invalid key format: " << key_format << std::endl;
goto end;
}
if (search_cmd->parsed()) {
antelopekeygen::strlist_t words;
antelopekeygen::Dictionary dict;
if (*monocrome) {
antelopekeygen::console::disable_color = true;
}
for (auto item : dict_list) {
antelopekeygen::Dictionary d;
if (d.loadFromFile(item)) {
dict.add(d);
} else {
std::cerr << "Could not load dictionary from file: " << item << std::endl;
}
}
for (auto item : lang_list) {
antelopekeygen::Dictionary d;
std::string filename(CONFIG_SHARE_FULL_PATH "/dicts/" + item);
if (d.loadFromFile(filename)) {
dict.add(d);
} else {
std::cerr << "Could not load dictionary from language file: " << filename << std::endl;
}
}
if (search_words.rfind("file:", 0) == 0) {
std::string filename = search_words.substr(5);
if (!antelopekeygen::readLines(filename, words)) {
std::cerr << "Could not read file: " << filename << std::endl;
goto end;
}
if (words.size() < 1) {
std::cerr << filename << " did not contain any words" << std::endl;
goto end;
}
} else {
words = antelopekeygen::strlist::splitw(search_words);
}
rc = cmd_search(words, dict, search_count);
goto end;
} else if (bench_cmd->parsed()) {
cmd_benchmark(bench_count);
}
// No subcommand given, just generate and print a keypair.
else {
struct libantelope::ec_keypair pair;
libantelope::ec_generate_key(&pair);
libantelope::wif_print_key(&pair, key_codec);
goto end;
}
end: libantelope::ec_shutdown();
return rc;
}

View file

@ -93,12 +93,23 @@ set( CPACK_DEBIAN_PACKAGE_RELEASE "1" CACHE STRING "Debian package release versi
# So we have to do it here.
set( CPACK_DEBIAN_PACKAGE_HOMEPAGE "${PROJECT_HOMEPAGE_URL}" )
# Set "correct" filename that also include system version and architecture.
set( CPACK_DEBIAN_FILE_NAME
"${PROJECT_NAME}-${PROJECT_VERSION}-${CPACK_DEBIAN_PACKAGE_RELEASE}-${CPACK_SYSTEM_NAME}-${CPACK_SYSTEM_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}.deb"
)
# Always build components for deb packages
set( CPACK_DEB_COMPONENT_INSTALL ON )
# RPM
# Always build components for rpm packages
set( CPACK_RPM_COMPONENT_INSTALL ON )
# Same as with DEB package.
set( CPACK_RPM_PACKAGE_HOMEPAGE "${PROJECT_HOMEPAGE_URL}" )
set( CPACK_RPM_PACKAGE_RELEASE_DIST ON )
set( CPACK_RPM_PACKAGE_RELEASE "1" CACHE STRING "RPM package release version" )
set( CPACK_RPM_PACKAGE_LICENSE "MIT" )
set( CPACK_RPM_FILE_NAME "RPM-DEFAULT" )
# --------------------------------
# Generator default
# --------------------------------
@ -112,10 +123,3 @@ if (NOT CPACK_GENERATOR)
set( CPACK_GENERATOR "ZIP" )
endif()
endif()
# --------------------------------
# Include original CPack module.
# --------------------------------
include( CPack )

View file

@ -0,0 +1,7 @@
# Include component specific config
foreach( component @CPACK_COMPONENTS_ALL@ )
if (EXISTS "@CMAKE_CURRENT_BINARY_DIR@/${component}/CPackProperties.cmake")
include("@CMAKE_CURRENT_BINARY_DIR@/${component}/CPackProperties.cmake")
endif()
endforeach()

43
cmake/extras.cmake Normal file
View file

@ -0,0 +1,43 @@
set( EXTRAS_DIRECTORY ${DOWNLOAD_CACHE_DIR}/eosio-keygen-extras-0.1.0 )
set( FILENAME ${DOWNLOAD_CACHE_DIR}/eosio-keygen-extras-0.1.0.zip )
# --------------------------------
# Download/Unpack
# --------------------------------
if (NOT EXISTS ${FILENAME})
set( URL "https://github.com/eosswedenorg/eosio-keygen-extras/releases/download/v0.1.0/eosio-keygen-extras-0.1.0.zip" )
set( CHECKSUM "7be3188a52a39876e37986e6a7d78e0d6c89e68e8391cf48821c800563aaa036" )
message( STATUS "Downloading ${URL}" )
file(DOWNLOAD ${URL} ${FILENAME}
TIMEOUT 60
EXPECTED_HASH SHA256=${CHECKSUM}
TLS_VERIFY ON)
endif()
if (NOT EXISTS ${EXTRAS_DIRECTORY})
message( STATUS "Unpacking ${FILENAME}" )
execute_process(COMMAND ${CMAKE_COMMAND} -E tar -xf ${FILENAME}
WORKING_DIRECTORY ${DOWNLOAD_CACHE_DIR})
endif()
# --------------------------------
# Install
# --------------------------------
install(DIRECTORY ${EXTRAS_DIRECTORY}/dict
DESTINATION ${CMAKE_INSTALL_SHAREDIR}
COMPONENT extras )
# --------------------------------
# CPack
# --------------------------------
set( CPACK_COMPONENT_EXTRAS_DESCRIPTION "Dictionary files" )

1
common/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
include/eoskeygen/config.h*

49
common/CMakeLists.txt Normal file
View file

@ -0,0 +1,49 @@
# ------------------------------------------------------------
# Common CMake file
#
# Compiles the code that should be shared between the cli
# and gui programs into a static library.
# ------------------------------------------------------------
# Options
option(USE_THREADS "Compile with support for threads (if available)." ON)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
# --------------------------------
# Library
# --------------------------------
set( COMMON_NAME common )
set( COMMON_SOURCE
src/core/file.cpp
src/core/dictionary.cpp
src/core/string.cpp
src/core/strlist.cpp
src/core/leet.cpp
src/key_search.cpp
)
# Threads support
if (USE_THREADS)
find_package(Threads)
if (Threads_FOUND)
set( ANTELOPEKEYGEN_HAVE_THREADS TRUE )
set( COMMON_SOURCE ${COMMON_SOURCE} src/key_search_mt.cpp )
endif (Threads_FOUND)
endif (USE_THREADS)
# Project config file
configure_file(config.hpp.in "${CMAKE_CURRENT_LIST_DIR}/include/eoskeygen/config.hpp" @ONLY)
add_library( ${COMMON_NAME} STATIC ${COMMON_SOURCE} )
target_include_directories( ${COMMON_NAME} PUBLIC include )
# Link with libantelope and threads library.
include( libantelope )
target_link_libraries( ${COMMON_NAME}
PUBLIC
libantelope
${CMAKE_THREAD_LIBS_INIT}
)

View file

@ -0,0 +1,53 @@
# --------------------------------
# Variables
# --------------------------------
set( LIBANTELOPE_GIT_URL "https://github.com/eosswedenorg/libantelope.git" )
set( LIBANTELOPE_WANTED_VERSION v0.2.2 )
# --------------------------------
# Macros
# --------------------------------
macro(fromGit tag)
message ("Using libantelope from: ${LIBANTELOPE_GIT_URL}@${tag}")
include(FetchContent)
FetchContent_Declare(libantelope
GIT_REPOSITORY ${LIBANTELOPE_GIT_URL}
GIT_TAG ${tag}
SOURCE_DIR ${DOWNLOAD_CACHE_DIR}/libeosio/src
STAMP_DIR ${DOWNLOAD_CACHE_DIR}/libeosio/stamp
)
FetchContent_GetProperties(libantelope)
if (NOT libantelope_POPULATED)
FetchContent_Populate(libantelope)
add_subdirectory(${libantelope_SOURCE_DIR} ${libantelope_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()
endmacro()
macro(buildLocal src)
message ("Using local libantelope at: ${src}")
add_subdirectory(${src} ${src}/build EXCLUDE_FROM_ALL)
endmacro()
# If we have a local libantelope
if (LIBANTELOPE_SOURCE_DIR)
buildLocal( ${LIBANTELOPE_SOURCE_DIR} )
else()
# Check if version is in fact a version.
if (LIBANTELOPE_WANTED_VERSION MATCHES "^[0-9]+(.[0-9]+)?(.[0-9]+)(-[a-zA-Z0-9]+)?$")
# Try finding the package on the system.
find_package(libantelope ${LIBANTELOPE_WANTED_VERSION} QUIET)
if (libantelope_FOUND)
message ("Using libeosio in: ${libantelope_DIR}")
# Not found, download from git.
else()
fromGit( v${LIBANTELOPE_WANTED_VERSION} )
endif()
# Assume version contains a git branch.
else()
fromGit( ${LIBANTELOPE_WANTED_VERSION} )
endif()
endif()

30
common/config.hpp.in Normal file
View file

@ -0,0 +1,30 @@
/**
* MIT License
*
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef ANTELOPEKEYGEN_COMMON_CONFIG_H
#define ANTELOPEKEYGEN_COMMON_CONFIG_H
// Defined if we have thread support.
#cmakedefine ANTELOPEKEYGEN_HAVE_THREADS
#endif /* ANTELOPEKEYGEN_COMMON_CONFIG_H */

View file

@ -0,0 +1,75 @@
/**
* MIT License
*
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef ANTELOPEKEYGEN_COMMON_CORE_DICTIONARY_H
#define ANTELOPEKEYGEN_COMMON_CORE_DICTIONARY_H
#include <string>
#include <map>
#include <set>
namespace antelopekeygen {
class Dictionary
{
public :
// Map that contains position and length for substrings.
//
// key = position in the search string.
// value = length of the word from this position.
typedef std::map< size_t, size_t > search_result_t;
public :
// Load words from file.
bool loadFromFile(const std::string& filename);
// Add a word to the dictionary.
void add(const std::string& word);
// Add words from another dictionary.
void add(const Dictionary& dictionary);
// Clear all words from the dictionary.
void clear();
// Returns the list of words in the dictionary.
const std::set<std::string>& getWords() const;
// Returns true if word exists in the dictionary.
bool contains(const std::string& word) const;
// Searches the subject for words defined in the dictionary.
// Returns a search_result_t with the words found in subject.
// See search_result_t for more details.
search_result_t search(const std::string& subject) const;
protected :
// Words in the dictionary.
std::set<std::string> m_words;
};
} // namespace antelopekeygen
#endif /* ANTELOPEKEYGEN_COMMON_CORE_DICTIONARY_H */

View file

@ -0,0 +1,35 @@
/**
* MIT License
*
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef ANTELOPEKEYGEN_COMMON_CORE_FILE_H
#define ANTELOPEKEYGEN_COMMON_CORE_FILE_H
#include <eoskeygen/core/strlist.hpp>
namespace antelopekeygen {
bool readLines(const std::string& filename, strlist_t& lines);
} // namespace
#endif /* ANTELOPEKEYGEN_COMMON_CORE_FILE_H */

View file

@ -0,0 +1,36 @@
/**
* MIT License
*
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef ANTELOPEKEYGEN_COMMON_CORE_LEET_H
#define ANTELOPEKEYGEN_COMMON_CORE_LEET_H
#include <string>
#include <eoskeygen/core/strlist.hpp>
namespace antelopekeygen {
strlist_t l33twords(std::string str);
} // namespace antelopekeygen
#endif /* ANTELOPEKEYGEN_COMMON_CORE_LEET_H */

View file

@ -0,0 +1,40 @@
/**
* MIT License
*
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef ANTELOPEKEYGEN_COMMON_CORE_STRING_H
#define ANTELOPEKEYGEN_COMMON_CORE_STRING_H
#include <vector>
#include <string>
namespace antelopekeygen {
std::string& strtolower(std::string& str);
std::string& rtrim(std::string& str);
std::string& ltrim(std::string& str);
std::string& trim(std::string& str);
} // namespace antelopekeygen
#endif /* ANTELOPEKEYGEN_COMMON_CORE_STRING_H */

View file

@ -0,0 +1,50 @@
/**
* MIT License
*
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef ANTELOPEKEYGEN_COMMON_CORE_STRLIST_H
#define ANTELOPEKEYGEN_COMMON_CORE_STRLIST_H
#include <vector>
#include <string>
namespace antelopekeygen {
typedef std::vector<std::string> strlist_t;
typedef std::string& (*strlist_stripfunc_t)(std::string& str);
namespace strlist {
strlist_t splitw(const std::string& str, const std::string& delim = ",");
strlist_t split(const std::string& str, const std::string& delim);
std::string join(const strlist_t& list, const std::string& delim);
strlist_t& strip(strlist_t& list, strlist_stripfunc_t fn);
} // namespace strlist
} // namespace antelopekeygen
#endif /* ANTELOPEKEYGEN_COMMON_CORE_STRLIST_H */

View file

@ -0,0 +1,125 @@
/**
* MIT License
*
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef ANTELOPEKEYGEN_COMMON_KEY_SEARCH_H
#define ANTELOPEKEYGEN_COMMON_KEY_SEARCH_H
#include <stdint.h>
#include <string>
#include <libantelope/ec.hpp>
#include <eoskeygen/config.hpp>
#include <eoskeygen/core/dictionary.hpp>
#include <eoskeygen/core/strlist.hpp>
namespace antelopekeygen {
class IKeySearchResult;
class KeySearch
{
public :
struct result {
size_t pos; // position where the word was found.
size_t len; // the length of the word.
};
public :
KeySearch();
void setPrefix(const std::string& prefix);
// Add a word to search for.
void addWord(const std::string& str);
// Add a list of words to search for.
void addList(const strlist_t& list);
// get the list of words to search for.
const strlist_t& getList();
// Clears the search list.
void clear();
// Set callback for search result.
void setCallback(IKeySearchResult* callback);
#ifdef ANTELOPEKEYGEN_HAVE_THREADS
// Returns the maximum number of threads
// reported by the operating system.
static size_t max_threads();
// Set the number of threads to use while searching.
void setThreadCount(size_t num);
size_t getThreadCount() const;
#endif /* ANTELOPEKEYGEN_HAVE_THREADS */
// Aborts find() operation if started.
// This is useful for multithreaded code (like GUI application)
// If find() is started as a seperate thread. This method could be called
// from the gui thread if the user presses "cancel" button.
void abort();
// Perform a search.
void find(size_t num_results);
protected :
// Check if any word in <word_list> appears in <key>'s public key.
// returns true if a word was found (stored in <result>), false otherwise.
bool _contains_word(const struct libantelope::ec_keypair* key, struct result& result);
#ifdef ANTELOPEKEYGEN_HAVE_THREADS
void _thr_proc();
void _search_mt();
#endif /* ANTELOPEKEYGEN_HAVE_THREADS */
void _search_linear();
protected :
// Public key prefix.
std::string m_prefix;
// List of words to search for.
strlist_t m_words;
// Max keys to search for.
std::size_t m_max;
// Current number of keys found.
std::size_t m_count;
#ifdef ANTELOPEKEYGEN_HAVE_THREADS
// Number of threads to use.
size_t m_threads;
#endif /* ANTELOPEKEYGEN_HAVE_THREADS */
IKeySearchResult* m_callback;
};
} // namespace antelopekeygen
#endif /* ANTELOPEKEYGEN_COMMON_KEY_SEARCH_H */

View file

@ -0,0 +1,40 @@
/**
* MIT License
*
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef ANTELOPEKEYGEN_COMMON_KEY_SEARCH_RESULT_H
#define ANTELOPEKEYGEN_COMMON_KEY_SEARCH_RESULT_H
#include <eoskeygen/key_search.hpp>
namespace antelopekeygen {
class IKeySearchResult
{
public :
virtual void onResult(const struct libantelope::ec_keypair* key, const struct KeySearch::result& result) = 0;
};
} // namespace antelopekeygen
#endif /* ANTELOPEKEYGEN_COMMON_KEY_SEARCH_RESULT_H */

View file

@ -0,0 +1,129 @@
/**
* MIT License
*
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <vector>
#include <cstdio>
#include <iterator>
#include <algorithm>
#include <eoskeygen/core/string.hpp>
#include <eoskeygen/core/dictionary.hpp>
#include <eoskeygen/core/file.hpp>
namespace antelopekeygen {
struct StringContains {
StringContains(const std::string& str, std::vector<size_t>& pos) : m_str(str), m_pos(pos) {}
bool operator()(const std::string& w) {
for(size_t p = m_str.find(w); p != std::string::npos; p = m_str.find(w, p+1)) {
m_pos.push_back(p);
}
return !m_pos.empty();
}
std::string m_str;
std::vector<size_t>& m_pos;
};
bool Dictionary::loadFromFile(const std::string& filename)
{
strlist_t lines;
// Clear before adding.
clear();
if (readLines(filename, lines)) {
// Read each line and add to the dictionary.
for(auto it = lines.begin(); it != lines.end(); it++) {
add(*it);
}
return true;
}
return false;
}
void Dictionary::add(const std::string& word)
{
// Do not insert a empty string.
if (word.length()) {
m_words.insert(word);
}
}
void Dictionary::add(const Dictionary& dictionary)
{
std::set_union(
m_words.begin(), m_words.end(),
dictionary.m_words.begin(), dictionary.m_words.end(),
std::inserter(m_words, m_words.begin())
);
}
const std::set<std::string>& Dictionary::getWords() const
{
return m_words;
}
void Dictionary::clear()
{
m_words.clear();
}
bool Dictionary::contains(const std::string& word) const
{
return m_words.find(word) != m_words.cend();
}
Dictionary::search_result_t Dictionary::search(const std::string& subject) const
{
search_result_t res;
std::vector<size_t> pos;
StringContains pred(subject, pos);
// Find all words.
for(auto it = std::find_if(m_words.begin(), m_words.end(), pred);
it != m_words.end();
it = std::find_if(++it, m_words.end(), pred)) {
// Go through all found positions.
for (auto it2 = pos.begin(); it2 != pos.end(); it2++) {
// Insert
auto rit = res.find(*it2);
if (rit == res.end()) {
res.emplace(*it2, it->length());
}
// Update length if it's longer then the previous we found.
else if (rit->second < it->length()) {
rit->second = it->length();
}
}
// Clear positions
pos.clear();
}
return res;
}
} // namespace antelopekeygen

49
common/src/core/file.cpp Normal file
View file

@ -0,0 +1,49 @@
/**
* MIT License
*
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <cstdio>
#include <eoskeygen/core/string.hpp>
#include <eoskeygen/core/file.hpp>
namespace antelopekeygen {
bool readLines(const std::string& filename, strlist_t& lines) {
FILE *fd;
char buf[1024];
fd = fopen(filename.c_str(), "r");
if (!fd) {
return false;
}
while(fgets(buf, sizeof(buf), fd) != NULL) {
std::string line(buf);
lines.push_back(trim(line));
}
fclose(fd);
return true;
}
} // namespace antelopekeygen

82
common/src/core/leet.cpp Normal file
View file

@ -0,0 +1,82 @@
/**
* MIT License
*
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <algorithm>
#include <eoskeygen/core/leet.hpp>
namespace antelopekeygen {
static bool is_l33t(char ch, char& r) {
// '1', '2', '3', '4', '5', '6', '7', '8', '9'
static char alphabet[9] = { 'l', 'z', 'e', 'a', 's', 'G', 't', 'B', 'g' };
for(std::size_t i = 0; i < sizeof(alphabet) / sizeof(char); i++) {
if (ch == alphabet[i]) {
r = static_cast<char>('1' + i);
return true;
}
}
return false;
}
static void _l33t(strlist_t& list, const std::string& a, std::size_t pos) {
// Find the next character to be replaced.
for(std::size_t i = pos; i < a.length(); i++) {
char ch;
if (is_l33t(a[i], ch)) {
// create a new string and replace the character.
std::string b = a;
b[i] = ch;
// Store the new string as the result.
list.push_back(b);
// Perform the same algorithm for both strings
// at the next position.
_l33t(list, a, i + 1);
_l33t(list, b, i + 1);
break;
}
}
}
strlist_t l33twords(std::string str) {
strlist_t list;
// "l" is abit special and are not included in base58 so we set it to 1.
// All other characters in "l33t" are valid.
std::transform(str.begin(), str.end(), str.begin(), [](char c){ return c == 'l' ? '1' : c; });
// Store the original string as the first in list.
list.push_back(str);
_l33t(list, str, 0);
return list;
}
} // namespace antelopekeygen

View file

@ -0,0 +1,52 @@
/**
* MIT License
*
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <cstddef>
#include <cctype>
#include <algorithm>
#include <eoskeygen/core/string.hpp>
namespace antelopekeygen {
std::string& strtolower(std::string& str) {
std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c){ return std::tolower(c); });
return str;
}
std::string& ltrim(std::string& str) {
auto it = std::find_if(str.begin(), str.end(), [](char ch){ return !std::isspace(ch); });
str.erase(str.begin(), it);
return str;
}
std::string& rtrim(std::string& str) {
auto it = std::find_if(str.rbegin(), str.rend(), [](char ch){ return !std::isspace(ch); });
str.erase(it.base(), str.end());
return str;
}
std::string& trim(std::string& str) {
return ltrim(rtrim(str));
}
} // namespace antelopekeygen

View file

@ -0,0 +1,75 @@
/**
* MIT License
*
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <algorithm>
#include <eoskeygen/core/string.hpp>
#include <eoskeygen/core/strlist.hpp>
namespace antelopekeygen {
strlist_t strlist::splitw(const std::string& str, const std::string& delim) {
strlist_t words = strlist::split(str, delim);
std::for_each(words.begin(), words.end(), trim);
return words;
}
strlist_t strlist::split(const std::string& str, const std::string& delim) {
strlist_t r;
size_t s = 0, e = 0, dlen = delim.length();
while((e = str.find(delim, s)) != std::string::npos) {
r.push_back(str.substr(s, e - s));
s = e + dlen;
}
r.push_back(str.substr(s));
return r;
}
std::string strlist::join(const strlist_t& list, const std::string& delim) {
std::string out;
for(const std::string& item : list) {
if (item.length() < 1) {
continue;
}
out += item + delim;
}
if (out.length() > 0) {
out.erase(out.end() - delim.length());
}
return out;
}
strlist_t& strlist::strip(strlist_t& list, strlist_stripfunc_t fn) {
std::transform(list.begin(), list.end(), list.begin(), fn);
return list;
}
} // namespace antelopekeygen

131
common/src/key_search.cpp Normal file
View file

@ -0,0 +1,131 @@
/**
* MIT License
*
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <libantelope/ec.hpp>
#include <libantelope/WIF.hpp>
#include <eoskeygen/config.hpp>
#include <eoskeygen/core/string.hpp>
#include <eoskeygen/key_search_result.hpp>
#include <eoskeygen/key_search.hpp>
namespace antelopekeygen {
KeySearch::KeySearch() :
m_prefix ("EOS"),
m_max (0),
m_count (0),
#ifdef EOSIOKEYGEN_HAVE_THREADS
m_threads (0),
#endif
m_callback (NULL)
{
}
void KeySearch::setPrefix(const std::string& prefix)
{
m_prefix = prefix;
}
void KeySearch::addWord(const std::string& str)
{
std::string tmp = str;
strtolower(tmp);
m_words.push_back(tmp);
}
void KeySearch::addList(const strlist_t& list)
{
for(const std::string& item : list) {
addWord(item);
}
}
const strlist_t& KeySearch::getList()
{
return m_words;
}
void KeySearch::clear()
{
m_words.clear();
}
void KeySearch::setCallback(IKeySearchResult* callback)
{
m_callback = callback;
}
void KeySearch::_search_linear()
{
struct libantelope::ec_keypair pair;
while (m_count < m_max) {
struct result res;
libantelope::ec_generate_key(&pair);
if (_contains_word(&pair, res)) {
m_callback->onResult(&pair, res);
m_count++;
}
}
}
void KeySearch::abort()
{
// exit find() operation by setting m_max to zero.
m_max = 0;
}
void KeySearch::find(size_t num_results)
{
m_count = 0;
m_max = num_results;
#ifdef EOSIOKEYGEN_HAVE_THREADS
// Only do multithread if number of threads makes sense.
if (m_threads >= 2) {
_search_mt();
return;
}
#endif /* HAVE_THREADS */
_search_linear();
}
bool KeySearch::_contains_word(const struct libantelope::ec_keypair* key, struct result& result) {
size_t prefix_len = m_prefix.length();
std::string pubstr = libantelope::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 + prefix_len;
result.len = w.length();
return true;
}
}
return false;
}
} // namespace antelopekeygen

View file

@ -0,0 +1,101 @@
/**
* MIT License
*
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <cstddef>
#include <thread>
#include <mutex>
#include <vector>
#include <libantelope/ec.hpp>
#include <eoskeygen/key_search_result.hpp>
#include <eoskeygen/key_search.hpp>
namespace antelopekeygen {
// Mutex guard for m_count.
std::mutex g_count_mtx;
// Thread process.
void KeySearch::_thr_proc()
{
struct libantelope::ec_keypair pair;
while (m_count < m_max) {
struct result res;
libantelope::ec_generate_key(&pair);
if (_contains_word(&pair, res)) {
// Guard output with mutex, so we don't get
// interrupted mid write and can write to m_count and res safely.
const std::lock_guard<std::mutex> lock(g_count_mtx);
// It is possible m_count was updated by another thread
// after we checked it in the while loop.
// So while we have the lock, we need to check it again.
if (m_count >= m_max) {
return;
}
// Update count and call result function.
m_count++;
m_callback->onResult(&pair, res);
}
}
}
void KeySearch::setThreadCount(size_t num)
{
m_threads = num;
}
size_t KeySearch::max_threads()
{
return std::thread::hardware_concurrency();
}
size_t KeySearch::getThreadCount() const
{
return m_threads;
}
void KeySearch::_search_mt()
{
std::vector<std::thread> t;
t.resize(m_threads - 1);
// Launch them.
for(std::size_t i = 0; i < t.size(); i++) {
t[i] = std::thread(&KeySearch::_thr_proc, this);
}
// Use main thread for 1 search
_thr_proc();
// Wait for all threads to compelete.
for(std::size_t i = 0; i < t.size(); i++) {
t[i].join();
}
}
} // namespace antelopekeygen

View file

@ -1,7 +1,7 @@
/**
* MIT License
*
* Copyright (c) 2019-2020 EOS Sw/eden
* Copyright (c) 2019-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@ -31,4 +31,7 @@
#define CONFIG_SHARE_PATH "@CMAKE_INSTALL_DATADIR@/@CMAKE_PROJECT_NAME@"
#define CONFIG_SHARE_FULL_PATH "@CMAKE_INSTALL_FULL_DATADIR@/@CMAKE_PROJECT_NAME@"
#define CONFIG_DICT_PATH "@CMAKE_INSTALL_DATADIR@/@CMAKE_PROJECT_NAME@/dict"
#define CONFIG_DICT_FULL_PATH "@CMAKE_INSTALL_FULL_DATADIR@/@CMAKE_PROJECT_NAME@/dict"
#endif /* EOSIOKEYGEN_CONFIG_H */

View file

@ -1,153 +0,0 @@
.TH @PROJECT_NAME@ 1 "January, 2020" "@PROJECT_NAME@ @PROJECT_VERSION@"
.SH NAME
@PROJECT_NAME@ - Generate public and private keypair for
.UR https://eos.io/
EOS
.UE .
.SH SYNOPSIS
.SY @PROJECT_NAME@
.OP \-h|--help
.YS
.SY @PROJECT_NAME@
.OP \-v
.YS
.SY @PROJECT_NAME@
search
.OP -m
.OP \--l33t
.OP \--threads=<num>
.OP \--dict=<file1> ...
.OP \--lang=<value> ...
.B word_list
.OP count
.YS
.SY @PROJECT_NAME@
benchmark
.OP num_keys
.YS
.SH DESCRIPTION
.P
Output one EOSIO key pair if no arguments are given
.P
Options and subcommands are as follows:
.TP 15
.B -h, --help
Shows this help text.
.TP 15
.B -v
Shows version.
.TP 15
.B search
performs a search, finding
.I <count>
public keys containing one or more words from
.I <word_list>
(separated with ',').
Instead of a list it is possible to specify a file with words (separated with newline '\\n') using
.I file:<filename>
.RS 16
Search specific options:
.RS 2
.TP 20
.B -m
Monochrome, disables all color output.
.TP 20
.B --l33t
Takes each word in
.I <word_list>
and find all l33tspeak combinations of that word and uses the new list for the search.
.TP 20
.B --threads=<num>
Use
.I <num>
of parallel threads for searching. Default is what the operating system recomends.
.TP 20
.B --dict=<file>
Use words found in
.I <file>
(separated by newline) to highlight words in the keys found (note that the words in this
file are not used for search. only for highlight output). There can be more then one
.B --dict
flag. In that case contents of all files are merged into one dictionary.
.TP 20
.B --lang=<value>
Same as
.B --dict
but will use
.I <value>
to find a file in
.B @CMAKE_INSTALL_FULL_DATADIR@/@CMAKE_PROJECT_NAME@/dict.
There can be more then one
.B --lang
flag. In that case contents of all files are merged into one dictionary.
.TP 20
.B count
Number of keys to search for (default is 10)
.RE 1
.TP 15
.B benchmark
performs a benchmark test, generating
.I <num_keys>
keys and measuring the time.
.PP
.RS 16
Benchmark specific options:
.RS 2
.TP 15
.B num_keys
Number of keys to search for (default is 10)
.RE 1
.SH SECURITY NOTICE
Keys are generated by OpenSSL\'s
.B EC_KEY_generate_key
function. The program will
never expose your keys to anything but the computers memory and output of the\
program. You are free to inspect the source code and compile yourself to verify.
.P
However, use this at your own risk. we cannot guarantee that the keys are\
cryptographically secure as this depends on OpenSSL's implementation (alto it is\
widely used and should be safe)
.P
Please read the
.I LICENSE
file.
.P
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
.br
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
.br
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
.br
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
.br
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
.br
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
.SH BUGS
Report bugs to
.UR https://github.com/eosswedenorg/eosio-keygen/issues
Github
.UE . Thank you.
.SH AUTHOR
.MT henrik@eossweden.org
Henrik Hautakoski
.ME
.UR https://eossweden.org
EOS Sw/eden
.UE

85
gui/CMakeLists.txt Normal file
View file

@ -0,0 +1,85 @@
cmake_minimum_required(VERSION 3.15)
project(antelope-keygen-gui
VERSION ${CMAKE_PROJECT_VERSION}
DESCRIPTION "Keygenerator for Antelope blockchain (gui)"
LANGUAGES CXX)
# Append modules dir
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
include(QtUtils)
# Qt5 needs MOC,RCC and UIC
set( CMAKE_AUTOMOC ON )
set( CMAKE_AUTORCC ON )
set( CMAKE_AUTOUIC ON )
# Autogenerate about config file
file( READ ${PROJECT_LICENSE_FILE} GUI_ABOUT_LICENSE )
string(REGEX REPLACE "^([^\n]+)" "<h2>\\1</h2>" GUI_ABOUT_LICENSE ${GUI_ABOUT_LICENSE})
string(REGEX REPLACE "\n\n([^\n]+)" "<p>\\1</p>" GUI_ABOUT_LICENSE ${GUI_ABOUT_LICENSE})
string(REGEX REPLACE "\n" "" GUI_ABOUT_LICENSE ${GUI_ABOUT_LICENSE})
string(REGEX REPLACE "\<(.+)\>" "- <a href=\"mailto:\\1\">\\1</a>" GUI_ABOUT_AUTHOR ${PROJECT_MAINTAINER})
configure_file(gui_text.h.in "${CMAKE_CURRENT_BINARY_DIR}/gui_text.h" @ONLY ESCAPE_QUOTES)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
# --------------------------------
# Program
# --------------------------------
set( PROGRAM_EXE ${PROJECT_NAME} )
set( PROGRAM_SRC
src/main.cpp
src/MainWindow.cpp
src/GenerateWindow.cpp
src/SearchWindow.cpp
src/MultiSelect.cpp
src/Settings.cpp
src/helpers.cpp
)
add_executable( ${PROGRAM_EXE} WIN32 ${PROGRAM_SRC} )
# Libraries
target_link_libraries( ${PROGRAM_EXE} common )
# QT
qt5_app(TARGET ${PROGRAM_EXE}
SKIP_TRANSLATIONS
MODULES Core Gui Widgets Concurrent
INSTALL_COMPONENT gui
)
# --------------------------------
# Install
# --------------------------------
install(TARGETS ${PROGRAM_EXE}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
COMPONENT gui)
install(FILES ${PROJECT_LICENSE_FILE}
DESTINATION ${CMAKE_INSTALL_SHAREDIR}
COMPONENT gui
RENAME LICENSE.gui)
install(FILES README.md
DESTINATION ${CMAKE_INSTALL_SHAREDIR}
COMPONENT gui
RENAME README.gui.md)
install(FILES LICENSE.qt5
DESTINATION ${CMAKE_INSTALL_SHAREDIR}
COMPONENT gui)
# --------------------------------
# Package
# --------------------------------
configure_file(cmake/CPackComponentConfig.cmake.in
${PROJECT_BINARY_DIR}/CPackProperties.cmake)

165
gui/LICENSE.qt5 Normal file
View file

@ -0,0 +1,165 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.

32
gui/README.md Normal file
View file

@ -0,0 +1,32 @@
# antelope-keygen (gui)
This is the graphical version of the [antelope-keygen](https://github.com/eosswedenorg/antelope-keygen) project.
This program generates public and private keypair for [Antelope IO](https://antelope.io)
Among the basic functionality the program can also search for keys containing specific words also know as _vanity keys_.
## Security notice
Keys are generated using [libantelope](https://github.com/eosswedenorg/libantelope)
while the library does not claim to guarantee cryptographically secure keys. it
relies on widly used open source cryptographic libraries (OpenSSL, libsecp256k1).
Use at your own risk. The author and [Sw/eden](https://eossweden.org/) does not take responsability
for any damage caused by keys generated by the program.
Please read the `LICENSE` file.
```
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
```
## Author
Henrik Hautakoski - [Sw/eden](https://eossweden.org/) - [henrik@eossweden.org](mailto:henrik@eossweden.org)

View file

@ -0,0 +1,17 @@
# --------------------------------
# CPack Component Config
# --------------------------------
set( CPACK_PACKAGE_GUI_NAME "${PROJECT_NAME}" )
set( CPACK_PACKAGE_GUI_CONTACT "${PROJECT_MAINTAINER}" )
# Additional description
set( CPACK_COMPONENT_GUI_DESCRIPTION "Graphical interface (Qt framework)" )
# Debian specific
set( CPACK_DEBIAN_GUI_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}-${CPACK_DEBIAN_PACKAGE_RELEASE}-${CPACK_SYSTEM_NAME}-${CPACK_SYSTEM_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}.deb")
set( CPACK_DEBIAN_GUI_PACKAGE_NAME "${PROJECT_NAME}" )
set( CPACK_DEBIAN_GUI_PACKAGE_PRIORITY "optional" )
set( CPACK_DEBIAN_GUI_PACKAGE_SECTION "misc" )
set( CPACK_DEBIAN_GUI_PACKAGE_DEPENDS "libqt5core5a (>= 5.9.5), libqt5concurrent5 (>= 5.9.5), libqt5gui5 (>= 5.9.5), libqt5widgets5 (>= 5.9.5), libssl1.1")

110
gui/cmake/QtUtils.cmake Normal file
View file

@ -0,0 +1,110 @@
set(_QT_INSTALL_CONFIG_TEMPLATE ${CMAKE_CURRENT_LIST_DIR}/cmake_install_qt.cmake.in)
set(_QT_INSTALL_CONFIG ${CMAKE_CURRENT_BINARY_DIR}/cmake_install_qt.cmake)
# ------------------------------------------------------------------------------
# Code Taken and modified from:
# https://github.com/equalsraf/neovim-qt/blob/master/cmake/WinDeployQt.cmake
#
# Wrapper to call windeployqt on Windows
# ------------------------------------------------------------------------------
function(qt5_win_deploy)
cmake_parse_arguments(_deploy
"COMPILER_RUNTIME;FORCE;SKIP_TRANSLATIONS"
"TARGET;INSTALL_COMPONENT"
"MODULES;EXCLUDE_MODULES"
${ARGN}
)
if(NOT _deploy_TARGET)
message(FATAL_ERROR "A TARGET must be specified")
endif()
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
list(APPEND _ARGS --debug)
elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
list(APPEND _ARGS --release-with-debug-info)
elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
list(APPEND _ARGS --release)
endif()
if(_deploy_COMPILER_RUNTIME)
list(APPEND _ARGS --compiler-runtime)
endif()
if(_deploy_FORCE)
list(APPEND _ARGS --force)
endif()
if(_deploy_SKIP_TRANSLATIONS)
list(APPEND _ARGS --no-translations)
endif()
foreach(mod ${_deploy_MODULES})
string(TOLOWER ${mod} mod)
string(REPLACE "qt5::" "" mod ${mod})
list(APPEND _ARGS "--${mod}")
endforeach()
foreach(mod ${_deploy_EXCLUDE_MODULES})
string(TOLOWER ${mod} mod)
string(REPLACE "qt5::" "" mod ${mod})
list(APPEND _ARGS "--no-${mod}")
endforeach()
find_program(_deploy_PROGRAM windeployqt PATHS $ENV{QTDIR}/bin)
if(_deploy_PROGRAM)
message(STATUS "Found ${_deploy_PROGRAM}")
else()
message(FATAL_ERROR "Unable to find windeployqt")
endif()
if(COMPILER_RUNTIME AND NOT $ENV{VVVV})
message(STATUS "not set, the VC++ redistributable installer will NOT be bundled")
endif()
set( _QT_INSTALL_CONFIG_DEPFILE "${CMAKE_CURRENT_BINARY_DIR}/qt_deps_\${CMAKE_INSTALL_CONFIG_NAME}.cmake" )
set( _QT_DEPFILE ${CMAKE_CURRENT_BINARY_DIR}/qt_deps_${CMAKE_BUILD_TYPE}.cmake )
add_custom_target(${_deploy_TARGET}_windeployqt ALL
COMMAND ${CMAKE_COMMAND} -E echo "$<TARGET_FILE_DIR:${_deploy_TARGET}>" > ${_QT_DEPFILE}
COMMAND ${_deploy_PROGRAM} --list relative ${_ARGS} $<TARGET_FILE:${_deploy_TARGET}> >> ${_QT_DEPFILE}
DEPENDS ${_deploy_TARGET}
COMMENT "Preparing Qt runtime dependencies")
configure_file(${_QT_INSTALL_CONFIG_TEMPLATE} ${_QT_INSTALL_CONFIG} @ONLY)
if (_deploy_INSTALL_COMPONENT)
set(_install_args COMPONENT ${_deploy_INSTALL_COMPONENT})
endif()
install(SCRIPT ${_QT_INSTALL_CONFIG} ${_install_args})
endfunction()
# ------------------------------------------------------------------------------
# Macro for compile, link and deploy qt apps.
# ------------------------------------------------------------------------------
macro(qt5_app)
cmake_parse_arguments(_args
"COMPILER_RUNTIME;FORCE;SKIP_TRANSLATIONS"
"TARGET;INSTALL_COMPONENT"
"MODULES"
${ARGN}
)
if(NOT _args_TARGET)
message(FATAL_ERROR "A TARGET must be specified")
endif()
if(NOT _args_MODULES)
message(FATAL_ERROR "Must define atleast one QT component")
endif()
find_package( Qt5 COMPONENTS ${_args_MODULES} REQUIRED)
# Link targets
list( TRANSFORM _args_MODULES PREPEND "Qt5::" OUTPUT_VARIABLE _qtargets)
target_link_libraries( ${_args_TARGET} ${_qtargets} )
if (WIN32)
# Windows needs alot of extra stuff to copy all dll's.
qt5_win_deploy(${ARGN})
endif()
endmacro()

View file

@ -0,0 +1,23 @@
# Custom script that installs Qt runtime files.
if (EXISTS @_QT_INSTALL_CONFIG_DEPFILE@)
file(STRINGS @_QT_INSTALL_CONFIG_DEPFILE@ _lines)
# First line is the output path.
list(GET _lines 0 BASE_PATH)
# Rest of the lines are the files relative to the path.
list(SUBLIST _lines 1 -1 FILES)
foreach(file ${FILES})
get_filename_component(rel_path ${file} DIRECTORY BASE_DIR ${BASE_PATH})
set(install_path ${CMAKE_INSTALL_PREFIX}/@CMAKE_INSTALL_BINDIR@)
if (rel_path)
set(install_path "${install_path}/${rel_path}")
endif()
file(INSTALL ${BASE_PATH}/${file} DESTINATION ${install_path})
endforeach()
endif()

54
gui/gui_text.h.in Normal file
View file

@ -0,0 +1,54 @@
/**
* MIT License
*
* Copyright (c) 2020-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef EOSIOKEYGEN_GUI_TEXT_H
#define EOSIOKEYGEN_GUI_TEXT_H
#include <config.hpp>
#define EOSIOKEYGEN_GUI_TEXT_ABOUT_TITLE "@PROJECT_NAME@ - About"
#define EOSIOKEYGEN_GUI_TEXT_ABOUT_BODY \
"<h1>@PROJECT_NAME@ - v@PROJECT_VERSION@</h1>" \
"<p>@PROJECT_DESCRIPTION@</p>" \
"<p><a href=\"@PROJECT_HOMEPAGE_URL@\">@PROJECT_HOMEPAGE_URL@</a></p>" \
"@GUI_ABOUT_LICENSE@" \
"<h2>Author</h2>" \
"<p>@GUI_ABOUT_AUTHOR@</p>"
#define EOSIOKEYGEN_GUI_TEXT_DICT_LANG_TOOLTIP \
"<p>Highlight words from given language dictionary in the found keys (note that the words " \
"<strong>are not</strong> used for search. only for highlight output).</p>" \
"<p>There can be more then one language. In that case contents " \
"of all languges are merged into one dictionary.</p>" \
"<p>The langauges are stored in files at <i>" CONFIG_SHARE_FULL_PATH "/dict</i></p>"
#define EOSIOKEYGEN_GUI_TEXT_DICT_FILE_TOOLTIP \
"<p>Use words found in file (separated by newline) to highlight " \
"words in the keys found (note that the words in this " \
"file are not used for search. only for highlight output).</p>" \
"<p>There can be more then one file. In that case contents " \
"of all files are merged into one dictionary.</p>"
#endif /* EOSIOKEYGEN_GUI_TEXT_H */

128
gui/src/GenerateWindow.cpp Normal file
View file

@ -0,0 +1,128 @@
/**
* MIT License
*
* Copyright (c) 2020-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <QIcon>
#include <QLabel>
#include <QGridLayout>
#include <QClipboard>
#include <QGuiApplication>
#include <QFont>
#include <QFontDatabase>
#include <libantelope/ec.hpp>
#include <libantelope/WIF.hpp>
#include "Settings.hpp"
#include "GenerateWindow.hpp"
void _initKeyWidget(QLineEdit& w, const QFont& font) {
w.setFixedWidth(460);
w.setFont(font);
w.setReadOnly(true);
}
void _initKeyCopyButton(QPushButton& btn, const QIcon& icon) {
btn.setFixedWidth(32);
btn.setIcon(icon);
}
GenerateWindow::GenerateWindow(QWidget *parent) :
QWidget (parent),
m_btn_gen ("Generate"),
m_btn_copy_both ("Copy keys")
{
QFont mono = QFontDatabase::systemFont(QFontDatabase::FixedFont);
QIcon copy_icon = QIcon::fromTheme("edit-copy");
QGridLayout* layout;
_initKeyWidget(m_pub, mono);
_initKeyWidget(m_priv, mono);
_initKeyCopyButton(m_btn_copy_pub, copy_icon);
_initKeyCopyButton(m_btn_copy_priv, copy_icon);
// Layout
layout = new QGridLayout();
layout->setAlignment(Qt::AlignCenter);
// Stretch first and last column to make the widgets horizontally centered.
layout->setColumnStretch(0, 1);
layout->setColumnStretch(4, 1);
// Public key row
layout->addWidget(new QLabel("Public:"), 0, 1, Qt::AlignRight);
layout->addWidget(&m_pub, 0, 2);
layout->addWidget(&m_btn_copy_pub, 0, 3);
// Private key row
layout->addWidget(new QLabel("Private:"), 1, 1, Qt::AlignRight);
layout->addWidget(&m_priv, 1, 2);
layout->addWidget(&m_btn_copy_priv, 1, 3);
// Bottom row
m_btn_copy_both.setFixedWidth(80);
layout->addWidget(&m_btn_gen, 2, 2);
layout->addWidget(&m_btn_copy_both, 2, 3);
setLayout(layout);
// Connections
connect(&m_btn_gen, SIGNAL(released()), this, SLOT(generate_key()));
connect(&m_btn_copy_both, SIGNAL(released()), this, SLOT(copy_both_keys()));
connect(&m_btn_copy_pub, SIGNAL(released()), this, SLOT(copy_pub_key()));
connect(&m_btn_copy_priv, SIGNAL(released()), this, SLOT(copy_priv_key()));
}
void GenerateWindow::generate_key()
{
std::string pubstr, pvtstr;
struct libantelope::ec_keypair pair;
const libantelope::wif_codec_t& codec = Settings::getKeyCodec();
libantelope::ec_generate_key(&pair);
pubstr = libantelope::wif_pub_encode(pair.pub, codec.pub);
pvtstr = libantelope::wif_priv_encode(pair.secret, codec.pvt);
m_pub.setText(QString::fromStdString(pubstr));
m_priv.setText(QString::fromStdString(pvtstr));
}
void GenerateWindow::copy_both_keys()
{
QClipboard *clipboard = QGuiApplication::clipboard();
clipboard->setText(m_pub.text() + "\n" + m_priv.text());
}
void GenerateWindow::copy_pub_key()
{
QClipboard *clipboard = QGuiApplication::clipboard();
clipboard->setText(m_pub.text());
}
void GenerateWindow::copy_priv_key()
{
QClipboard *clipboard = QGuiApplication::clipboard();
clipboard->setText(m_priv.text());
}

View file

@ -0,0 +1,62 @@
/**
* MIT License
*
* Copyright (c) 2020-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef GENERATE_WINDOW_H
#define GENERATE_WINDOW_H
#include <QLineEdit>
#include <QPushButton>
#include <QWidget>
class GenerateWindow : public QWidget
{
Q_OBJECT
public:
GenerateWindow(QWidget *parent = 0);
public slots:
// Genereate a new key.
void generate_key();
// Copy both keys to clipboard
void copy_both_keys();
// copy public key to clipboard
void copy_pub_key();
// copy private key to clipboard
void copy_priv_key();
protected:
QLineEdit m_pub;
QLineEdit m_priv;
QPushButton m_btn_gen;
QPushButton m_btn_copy_both;
QPushButton m_btn_copy_priv;
QPushButton m_btn_copy_pub;
};
#endif /* GENERATE_WINDOW_H */

125
gui/src/MainWindow.cpp Normal file
View file

@ -0,0 +1,125 @@
/**
* MIT License
*
* Copyright (c) 2020-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <QMessageBox>
#include <QMenuBar>
#include <QGridLayout>
#include <QStackedWidget>
#include <libantelope/WIF.hpp>
#include "gui_text.h"
#include "Settings.hpp"
#include "GenerateWindow.hpp"
#include "SearchWindow.hpp"
#include "MainWindow.hpp"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow (parent),
m_format_fio_action (nullptr),
m_format_legacy_action (nullptr),
m_format_k1_action (nullptr)
{
libantelope::ec_init();
// Create sub windows and stacked widget.
m_stacked = new QStackedWidget();
m_stacked->addWidget(new GenerateWindow());
m_stacked->addWidget(new SearchWindow());
setCentralWidget(m_stacked);
// Add to menu bar.
menuBar()->addAction("Generate", this, SLOT(switchToGenerate()));
menuBar()->addAction("Search", this, SLOT(switchToSearch()));
// Settings
QActionGroup* formatGroup = new QActionGroup(this);
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()));
}
MainWindow::~MainWindow()
{
libantelope::ec_shutdown();
}
void MainWindow::switchToGenerate()
{
m_stacked->setCurrentIndex(0);
}
void MainWindow::switchToSearch()
{
m_stacked->setCurrentIndex(1);
}
void MainWindow::showAbout()
{
QMessageBox::about(this,
EOSIOKEYGEN_GUI_TEXT_ABOUT_TITLE,
EOSIOKEYGEN_GUI_TEXT_ABOUT_BODY);
}
void MainWindow::formatFioCheckboxChanged()
{
if (m_format_fio_action->isChecked()) {
Settings::setKeyCodec(libantelope::wif_create_legacy_codec("FIO"));
}
}
void MainWindow::formatLegacyCheckboxChanged()
{
if (m_format_legacy_action->isChecked()) {
Settings::setKeyCodec(libantelope::WIF_CODEC_LEG);
}
}
void MainWindow::formatK1CheckboxChanged()
{
if (m_format_k1_action->isChecked()) {
Settings::setKeyCodec(libantelope::WIF_CODEC_K1);
}
}

63
gui/src/MainWindow.hpp Normal file
View file

@ -0,0 +1,63 @@
/**
* MIT License
*
* Copyright (c) 2020-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef MAIN_WINDOW_H
#define MAIN_WINDOW_H
#include <QAction>
#include <QPointer>
#include <QMainWindow>
class QStackedWidget;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
virtual ~MainWindow();
private slots :
// Switch to generate window.
void switchToGenerate();
// Switch to search window.
void switchToSearch();
void showAbout();
void formatFioCheckboxChanged();
void formatLegacyCheckboxChanged();
void formatK1CheckboxChanged();
private :
QStackedWidget* m_stacked;
QPointer<QAction> m_format_fio_action;
QPointer<QAction> m_format_legacy_action;
QPointer<QAction> m_format_k1_action;
};
#endif /* MAIN_WINDOW_H */

150
gui/src/MultiSelect.cpp Normal file
View file

@ -0,0 +1,150 @@
/**
* MIT License
*
* Copyright (c) 2020-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <QDialog>
#include <QLayout>
#include <QMouseEvent>
#include <QListWidget>
#include <QListWidgetItem>
#include "MultiSelect.hpp"
MultiSelect::MultiSelect(const QString& text, bool user_can_add, QWidget *parent) :
QPushButton (text + ": none", parent)
{
QPushButton* btn;
QVBoxLayout* layout;
m_prefix = text;
// Dialog
m_dialog = new QDialog(this);
// Dialog Widgets
m_list = new QListWidget();
btn = new QPushButton("Select");
// Dialog layout
layout = new QVBoxLayout(m_dialog);
layout->addWidget(m_list);
layout->addWidget(btn);
// Connections
QObject::connect(btn, SIGNAL(clicked()), m_dialog, SLOT(accept()));
QObject::connect(m_dialog, SIGNAL(accepted()), this, SLOT(selectionConfirmed()));
QObject::connect(m_list, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(listItemClicked(QListWidgetItem*)));
// Configured to let users add items. provide button and signal.
if (user_can_add) {
btn = new QPushButton("Add");
layout->addWidget(btn);
QObject::connect(btn, SIGNAL(clicked()), this, SLOT(addBtnClicked()));
}
}
void MultiSelect::addItem(const QString& text, bool checked)
{
QListWidgetItem* item = new QListWidgetItem(text, m_list);
item->setFlags(Qt::ItemIsEnabled);
item->setCheckState(checked ? Qt::Checked : Qt::Unchecked);
}
void MultiSelect::addItems(const QStringList& list, bool checked)
{
QStringList::const_iterator it;
for(it = list.cbegin(); it != list.cend(); it++) {
addItem(*it, checked);
}
}
void MultiSelect::clearItems()
{
m_list->clear();
}
QStringList MultiSelect::getSelectedItems() const
{
QListWidgetItem* item;
QStringList ret;
// Cannot use m_list->selectedItems() as that function only fetches
// _selected_ and not _checked_ items (there is a difference).
for(int i = 0; i < m_list->count(); i++) {
item = m_list->item(i);
// Include in list if checked.
if (item->checkState() == Qt::Checked) {
ret << item->text();
}
}
return ret;
}
void MultiSelect::selectionConfirmed()
{
QStringList selected = getSelectedItems();
// Update the text for this widget to
// reflect the selected objects.
QString txt = m_prefix + ": ";
// Have more than one item. show number of items.
if (selected.count() > 1) {
txt += QString::number(selected.count()) + " selected";
}
// Just one, we can show the text.
else if (selected.count() == 1) {
txt += selected.at(0);
}
else {
txt += "none";
}
setText(txt);
// Emit the selectionChanged signal with the updated list
emit selectionChanged(selected);
}
void MultiSelect::listItemClicked(QListWidgetItem *item)
{
// toggle state when user clicks.
bool checked = item->checkState() == Qt::Checked;
item->setCheckState(checked ? Qt::Unchecked : Qt::Checked);
}
void MultiSelect::addBtnClicked()
{
// Just emit addNewItem event.
emit addNewItem();
}
void MultiSelect::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
// Show select dialog.
m_dialog->show();
} else {
// pass on other buttons to base class
QPushButton::mousePressEvent(event);
}
}

96
gui/src/MultiSelect.hpp Normal file
View file

@ -0,0 +1,96 @@
/**
* MIT License
*
* Copyright (c) 2020-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef MULTI_SELECT_H
#define MULTI_SELECT_H
#include <QString>
#include <QStringList>
#include <QPushButton>
class QMouseEvent;
class QPushButton;
class QListWidget;
class QListWidgetItem;
class QDialog;
class MultiSelectDialog;
//
// MultiSelect implements multi selection of items using
// a push button and a dialog with a list of checkbox items.
//
class MultiSelect : public QPushButton
{
Q_OBJECT
public:
MultiSelect(const QString& text, bool user_add_item = false, QWidget *parent = 0);
// Items.
void addItem(const QString& text, bool checked = false);
void addItems(const QStringList& list, bool checked = false);
void clearItems();
// Get a list of currently selected items.
QStringList getSelectedItems() const;
signals:
// This signal is emitted whenever the user has made a new selection.
void selectionChanged(QStringList selected);
// This signal is emitted whenever the user clicks the "Add" button.
// NOTE: Will only be emitted if `user_add_item` has been set to `true` in the constructor.
void addNewItem();
private slots :
// Called when the dialog is accepted.
void selectionConfirmed();
// Called when a list item is clicked on.
void listItemClicked(QListWidgetItem *item);
// Called when the add button is clicked on.
void addBtnClicked();
protected :
// Event handlers
void mousePressEvent(QMouseEvent *e) override;
private :
// Prefix to show on the button before value.
QString m_prefix;
// List of items
QListWidget* m_list;
// Dialog to show if this widget are clicked on.
QDialog* m_dialog;
};
#endif /* MULTI_SELECT_H */

289
gui/src/SearchWindow.cpp Normal file
View file

@ -0,0 +1,289 @@
/**
* MIT License
*
* Copyright (c) 2020-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <QDebug>
#include <QFileDialog>
#include <QMessageBox>
#include <QScrollBar>
#include <QGridLayout>
#include <QFuture>
#include <QtConcurrent>
#include <libantelope/WIF.hpp>
#include <eoskeygen/core/leet.hpp>
#include <eoskeygen/core/string.hpp>
#include "Settings.hpp"
#include "gui_text.h"
#include "config.hpp"
#include "helpers.hpp"
#include "SearchWindow.hpp"
SearchWindow::SearchWindow(QWidget *parent, Qt::WindowFlags flags) :
QWidget (parent, flags),
m_status ("status"),
m_leet_cb ("L33t"),
m_dict_lang ("Dictionary Language"),
m_dict_file ("Dictionary File", true),
m_btn_exec ("Search"),
m_btn_clear ("Clear")
{
setMinimumSize(600, 400);
// Monospaced font
QFont f_mono("monospace");
// Output
m_output.setFont(f_mono);
m_output.setReadOnly(true);
// Layout
// ------------------------
setLayout(&m_layout);
m_layout.setColumnStretch(0, 10);
m_layout.setColumnStretch(1, 10);
// First row.
m_dict_lang.addItems(get_files(CONFIG_DICT_FULL_PATH));
m_dict_lang.setToolTip(EOSIOKEYGEN_GUI_TEXT_DICT_LANG_TOOLTIP);
m_dict_file.setToolTip(EOSIOKEYGEN_GUI_TEXT_DICT_FILE_TOOLTIP);
m_layout.addWidget(&m_dict_lang, 0, 0);
m_layout.addWidget(&m_dict_file, 0, 1);
m_layout.addWidget(&m_leet_cb, 0, 2);
#ifdef EOSIOKEYGEN_HAVE_THREADS
m_num_threads.setValue((int) antelopekeygen::KeySearch::max_threads());
m_num_threads.setRange(1, (int) antelopekeygen::KeySearch::max_threads());
m_num_threads.setSuffix(" Threads");
m_layout.addWidget(&m_num_threads, 0, 3);
#endif /* EOSIOKEYGEN_HAVE_THREADS */
m_num_results.setValue(10);
m_num_results.setRange(1, 99);
m_num_results.setSuffix(" Results");
m_layout.addWidget(&m_num_results, 0, 4);
// Second row.
m_layout.addWidget(&m_status, 1, 0, 1, 3);
m_layout.addWidget(&m_txt_search, 1, 0, 1, 3);
m_layout.addWidget(&m_btn_exec, 1, 3);
m_layout.addWidget(&m_btn_clear, 1, 4);
// Third row.
m_layout.addWidget(&m_output, 2, 0, 1, 0);
// Search
// ------------------------
m_ksearch.setCallback(this);
initSignals();
// Focus search field.
m_txt_search.setFocus();
}
void SearchWindow::initSignals()
{
// Buttons
connect(&m_btn_exec, SIGNAL(released()), this, SLOT(search()));
connect(&m_btn_clear, SIGNAL(released()), &m_output, SLOT(clear()));
// Worker Thread
connect(&m_worker, SIGNAL(started()), this, SLOT(searchStarted()));
connect(&m_worker, SIGNAL(finished()), this, SLOT(searchFinished()));
connect(this, SIGNAL(addOutput(QString)), this, SLOT(output(QString)));
connect(&m_dict_file, SIGNAL(addNewItem()), this, SLOT(langFileAdd()));
}
void SearchWindow::loadDictionaries()
{
QStringList list;
antelopekeygen::Dictionary tmpDict;
std::string base_path(CONFIG_DICT_FULL_PATH);
// Clear dictionary first.
m_dict.clear();
// Go through all selected languages.
list = m_dict_lang.getSelectedItems();
for(QStringList::const_iterator it = list.cbegin(); it != list.cend(); it++) {
// Load and add them to dictionary.
tmpDict.loadFromFile(base_path + "/" + it->toStdString());
m_dict.add(tmpDict);
}
// Go through all selected files.
list = m_dict_file.getSelectedItems();
for(QStringList::const_iterator it = list.cbegin(); it != list.cend(); it++) {
// Load and add them to dictionary.
tmpDict.loadFromFile(it->toStdString());
m_dict.add(tmpDict);
}
}
void SearchWindow::onResult(const struct libantelope::ec_keypair* key, const struct antelopekeygen::KeySearch::result& result)
{
int pos = (int) result.pos;
int len = (int) result.len;
libantelope::wif_codec_t codec = Settings::getKeyCodec();
QString pub = QString::fromStdString(libantelope::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);
antelopekeygen::Dictionary::search_result_t dict_res = m_dict.search(pub.toStdString());
QString out = "Public: " + pub.left(pub_prefix_len);
for(int i = pub_prefix_len; i < pub.length(); ) {
if (i == pos) {
out += "<font color=red>" + pub.mid(pos, len) + "</font>";
i += len;
continue;
}
// Look in the dictionary.
auto dp = dict_res.find(i);
if (dp != dict_res.end()) {
int p = (int) dp->first;
int l = (int) dp->second;
out += "<font color=blue>" + pub.mid(p, l) + "</font>";
i += l;
continue;
}
out += pub[i++];
}
out += "<br/>Private: " + QString::fromStdString(libantelope::wif_priv_encode(key->secret, codec.pvt));
// As this function could be called from a non-gui thread. we use signals.
emit addOutput("<p>" + out + "</p>");
}
// --------------------
// Slots
// --------------------
void SearchWindow::search()
{
if (m_worker.isRunning()) {
m_ksearch.abort();
return;
}
const std::string& input = m_txt_search.text().toLocal8Bit().constData();
antelopekeygen::strlist_t list;
if (m_leet_cb.isChecked()) {
list = antelopekeygen::l33twords(input);
} else {
list = antelopekeygen::strlist::splitw(input);
}
// Validate that we atleast got something to search for.
if (list.size() < 1 || (list.size() == 1 && list[0] == "")) {
QMessageBox::warning( this,
"Empty search field.",
"You must specify atleast one search string" );
return;
}
loadDictionaries();
m_ksearch.clear();
m_ksearch.addList(list);
#ifdef EOSIOKEYGEN_HAVE_THREADS
m_ksearch.setThreadCount(m_num_threads.value());
#endif /* EOSIOKEYGEN_HAVE_THREADS */
QFuture<void> future = QtConcurrent::run(&m_ksearch, &antelopekeygen::KeySearch::find, m_num_results.value());
m_worker.setFuture(future);
m_status.setText("Searching for: " + QString::fromStdString(antelopekeygen::strlist::join(list, ", ")));
}
void SearchWindow::output(const std::string& html)
{
output(QString::fromStdString(html));
}
void SearchWindow::output(const QString& html)
{
if (m_output.toPlainText().size()) {
m_output.setHtml(m_output.toHtml() + html);
} else {
m_output.setHtml(html);
}
// Force scrollbar to the bottom.
m_output.verticalScrollBar()->setValue(m_output.verticalScrollBar()->maximum());
}
void SearchWindow::langFileAdd()
{
QStringList files = QFileDialog::getOpenFileNames(this,
"Select one or more language files");
m_dict_file.addItems(files, true);
}
void SearchWindow::searchStarted()
{
// Set prefix for search
m_ksearch.setPrefix(Settings::getKeyCodec().pub);
m_btn_exec.setText("Cancel");
m_txt_search.setEnabled(false);
m_txt_search.setHidden(true);
m_dict_lang.setEnabled(false);
m_dict_file.setEnabled(false);
m_leet_cb.setEnabled(false);
m_btn_clear.setEnabled(false);
#ifdef EOSIOKEYGEN_HAVE_THREADS
m_num_threads.setEnabled(false);
#endif /* EOSIOKEYGEN_HAVE_THREADS */
m_num_results.setEnabled(false);
}
void SearchWindow::searchFinished()
{
m_btn_exec.setText("Search");
m_txt_search.setEnabled(true);
m_txt_search.setHidden(false);
m_dict_lang.setEnabled(true);
m_dict_file.setEnabled(true);
m_leet_cb.setEnabled(true);
m_btn_clear.setEnabled(true);
#ifdef EOSIOKEYGEN_HAVE_THREADS
m_num_threads.setEnabled(true);
#endif /* EOSIOKEYGEN_HAVE_THREADS */
m_num_results.setEnabled(true);
}

117
gui/src/SearchWindow.hpp Normal file
View file

@ -0,0 +1,117 @@
/**
* MIT License
*
* Copyright (c) 2020-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef SEARCH_WINDOW_H
#define SEARCH_WINDOW_H
#include <QLabel>
#include <QSpinBox>
#include <QPushButton>
#include <QTextEdit>
#include <QLineEdit>
#include <QCheckBox>
#include <QGridLayout>
#include <QFutureWatcher>
#include <QWidget>
#include <eoskeygen/key_search_result.hpp>
#include <eoskeygen/key_search.hpp>
#include "MultiSelect.hpp"
class SearchWindow : public QWidget, public antelopekeygen::IKeySearchResult
{
Q_OBJECT
public:
explicit SearchWindow(QWidget *parent = 0, Qt::WindowFlags flags = Qt::WindowFlags());
void onResult(const struct libantelope::ec_keypair* key, const struct antelopekeygen::KeySearch::result& result);
private :
void initSignals();
void loadDictionaries();
private slots:
// Start a search
void search();
// Output html to screen.
void output(const std::string& html);
void output(const QString& html);
// Called when a search is started.
void searchStarted();
// Called when a search is done.
void searchFinished();
// Called when a new language file should be added
void langFileAdd();
signals:
void addOutput(const QString& line);
private:
// Search worker thread.
QFutureWatcher<void> m_worker;
antelopekeygen::KeySearch m_ksearch;
antelopekeygen::Dictionary m_dict;
// Widgets
// ----------------
// Status text.
QLabel m_status;
// Search input.
QLineEdit m_txt_search;
#ifdef EOSIOKEYGEN_HAVE_THREADS
// Number of Threads.
QSpinBox m_num_threads;
#endif /* EOSIOKEYGEN_HAVE_THREADS */
// Number of Results
QSpinBox m_num_results;
QCheckBox m_leet_cb;
MultiSelect m_dict_lang;
MultiSelect m_dict_file;
// Buttons
QPushButton m_btn_exec;
QPushButton m_btn_clear;
// Text output.
QTextEdit m_output;
// Gui Layout.
QGridLayout m_layout;
};
#endif /* SEARCH_WINDOW_H */

37
gui/src/Settings.cpp Normal file
View file

@ -0,0 +1,37 @@
/**
* MIT License
*
* Copyright (c) 2020-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include "Settings.hpp"
namespace priv {
libantelope::wif_codec_t key_format = libantelope::WIF_CODEC_K1;
} // namespace priv
void Settings::setKeyCodec(const libantelope::wif_codec_t& format) {
priv::key_format = format;
}
const libantelope::wif_codec_t& Settings::getKeyCodec() {
return priv::key_format;
}

36
gui/src/Settings.hpp Normal file
View file

@ -0,0 +1,36 @@
/**
* MIT License
*
* Copyright (c) 2020-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef SETTINGS_H
#define SETTINGS_H
#include <libantelope/WIF.hpp>
namespace Settings
{
void setKeyCodec(const libantelope::wif_codec_t& format);
const libantelope::wif_codec_t& getKeyCodec();
};
#endif /* SEARCH_WINDOW_H */

42
gui/src/helpers.cpp Normal file
View file

@ -0,0 +1,42 @@
/**
* MIT License
*
* Copyright (c) 2020-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include "helpers.hpp"
QStringList get_files(const QDir& directory) {
QFileInfoList list;
QStringList ret;
list = directory.entryInfoList(QDir::Files);
for (int i = 0; i < list.size(); ++i) {
QFileInfo info = list.at(i);
ret << info.fileName();
}
return ret;
}
QStringList get_files(const QString& directory)
{
return get_files(QDir(directory));
}

38
gui/src/helpers.hpp Normal file
View file

@ -0,0 +1,38 @@
/**
* MIT License
*
* Copyright (c) 2020-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef HELPERS_H
#define HELPERS_H
#include <QString>
#include <QStringList>
#include <QDir>
//
// Get a list of files for a given directory.
// NOTE: only filenames are returned. relative to directory.
//
QStringList get_files(const QDir& directory);
QStringList get_files(const QString& directory);
#endif /* HELPERS_H */

36
gui/src/main.cpp Normal file
View file

@ -0,0 +1,36 @@
/**
* MIT License
*
* Copyright (c) 2020-2021 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <QApplication>
#include "MainWindow.hpp"
int main(int argc, char **argv) {
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}

View file

@ -1,5 +1,3 @@
#!/bin/bash
pushd build > /dev/null
make install $@
popd > /dev/null
cmake --install build $@

2
lib/CLI11/CMakeLists.txt Normal file
View file

@ -0,0 +1,2 @@
set (LIBCLI11_INCLUDE ${CMAKE_CURRENT_LIST_DIR}/include)
set (LIBCLI11_LICENSE ${CMAKE_CURRENT_LIST_DIR}/LICENSE)

25
lib/CLI11/LICENSE Normal file
View file

@ -0,0 +1,25 @@
CLI11 2.2 Copyright (c) 2017-2022 University of Cincinnati, developed by Henry
Schreiner under NSF AWARD 1414736. All rights reserved.
Redistribution and use in source and binary forms of CLI11, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors
may be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

File diff suppressed because it is too large Load diff

View file

@ -1,21 +0,0 @@
#if _WIN32
#include <io.h>
#else
#include <unistd.h>
#define _isatty isatty
#define _fileno fileno
#endif
#include "isatty.h"
namespace eoskeygen {
bool isatty(int fd) {
return ::_isatty(fd);
}
bool isatty(FILE* fd) {
// fileno() segfaults if fd is null.
return fd ? isatty(_fileno(fd)) : false;
}
} // namespace eoskeygen

View file

@ -1,292 +0,0 @@
/**
* MIT License
*
* Copyright (c) 2019-2020 EOS Sw/eden
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <iostream>
#include <cstring>
#include <eoskeygen/config.h>
#include <eoskeygen/core/file.h>
#include <eoskeygen/core/string.h>
#include <eoskeygen/core/dictionary.h>
#include <eoskeygen/crypto/base58.h>
#include <eoskeygen/crypto/ec.h>
#include <eoskeygen/crypto/WIF.h>
#include <eoskeygen/key_search.h>
#include "cli_key_search_result.h"
#include "console.h"
#include "benchmark.h"
#include "config.h"
// Command line options.
bool option_l33t = false;
#ifdef LIBEOSKEYGEN_HAVE_THREADS
size_t option_num_threads = eoskeygen::KeySearch::max_threads();
#endif /* LIBEOSKEYGEN_HAVE_THREADS */
int cmd_search(const eoskeygen::strlist_t& words, const eoskeygen::Dictionary& dict, int count) {
eoskeygen::KeySearch ks;
eoskeygen::CliKeySearchResult rs(dict);
ks.setCallback(&rs);
for(auto it = words.begin(); it != words.end(); it++) {
size_t p = eoskeygen::is_base58(*it);
if (p != std::string::npos) {
std::cerr << "The word '"
<< *it << "' contains an invalid non-base58 character '"
<< (*it)[p] << "'" << std::endl;
return 1;
}
}
if (option_l33t) {
for(std::size_t i = 0; i < words.size(); i++) {
ks.addList(eoskeygen::l33twords(words[i]));
}
} else {
ks.addList(words);
}
#ifdef LIBEOSKEYGEN_HAVE_THREADS
ks.setThreadCount(option_num_threads);
#endif /* LIBEOSKEYGEN_HAVE_THREADS */
std::cout << "Searching for " << count
<< " keys containing: " << eoskeygen::strjoin(ks.getList(), ",")
#ifdef LIBEOSKEYGEN_HAVE_THREADS
<< ", Using: " << option_num_threads << " threads"
#endif /* LIBEOSKEYGEN_HAVE_THREADS */
<< std::endl;
ks.find(count);
return 0;
}
void usage(const char *name) {
std::cout << name
<< " [ -h | --help | -v | search [ -m | --l33t"
#ifdef LIBEOSKEYGEN_HAVE_THREADS
<< " | --threads=<num>"
#endif /* LIBEOSKEYGEN_HAVE_THREADS */
<< " | --dict=<file> ... "
<< " | --lang=<value> ... ] <word_list>|file:<filename> [ <count:10> ]"
<< " | benchmark [ <num:1000> ]"
<< " ]"
<< std::endl << std::endl;
std::cout << " - Output one EOSIO key pair if no arguments are given" << std::endl << std::endl;
// Options
std::cout
<< " Options:" << std::endl
<< " -h, --help Shows this help text."
<< std::endl << std::endl
<< " -v Shows version."
<< std::endl << std::endl;
std::cout << " search: " << std::endl
<< " performs a search, finding <count> public keys containing" << std::endl
<< " one or more words from <word_list> (separated with ',')." << std::endl
<< std::endl
<< " Instead of a list it is possible to specify a file with words" << std::endl
<< " (separated with newline '\\n') using file:<filename>"
<< std::endl << std::endl
<< " -m: Monochrome, disables all color output."
<< std::endl << std::endl
<< " --l33t: Takes each word in <word_list> and find all l33tspeak" << std::endl
<< " combinations of that word and uses the new list for the search."
#ifdef LIBEOSKEYGEN_HAVE_THREADS
<< std::endl << std::endl
<< " --threads=<num>: Use <num> of parallel threads for searching." << std::endl
<< " Default is what the operating system recomend."
#endif /* LIBEOSKEYGEN_HAVE_THREADS */
<< std::endl << std::endl
<< " --dict=<file>: Use words found in <file> (separated by newline) to" << std::endl
<< " highlight words in the keys found (note that the words in this" << std::endl
<< " file are not used for search. only for highlight output)." << std::endl
<< " There can be more then one --dict flag. In that case contents" << std::endl
<< " of all files are merged into one dictionary." << std::endl
<< std::endl << std::endl
<< " --lang=<value>: Same as --dict but will use <value>" << std::endl
<< " to find a file in " << CONFIG_SHARE_FULL_PATH << "/dict." << std::endl
<< " There can be more then one --lang flag. In that case contents" << std::endl
<< " of all files are merged into one dictionary." << std::endl
<< std::endl;
std::cout << " Benchmark: " << std::endl
<< " performs a benchmark test, generating <num> keys and measuring the time." << std::endl
<< std::endl;
}
void cmd_benchmark(size_t num_keys) {
struct eoskeygen::benchmark_result res;
std::cout << "Benchmark: Generating "
<< num_keys << " keys" << std::endl;
eoskeygen::benchmark(num_keys, &res);
std::cout << "Result: Took " << res.sec << " seconds, "
<< res.kps << " keys per second." << std::endl;
}
int main(int argc, char **argv) {
// current position in argv
// when parsing command line.
int p = 1;
// No args, just print a key.
if (argc <= 1) {
struct eoskeygen::ec_keypair pair;
eoskeygen::ec_generate_key(&pair);
eoskeygen::wif_print_key(&pair);
return 0;
}
if (!strcmp(argv[p], "-h") || !strcmp(argv[p], "--help")) {
usage(argv[0]);
return 0;
}
if (!strcmp(argv[p], "-v")) {
std::cout << PROGRAM_NAME << " v" << PROGRAM_VERSION << std::endl;
return 0;
}
if (!strcmp(argv[p], "search")) {
int count = 10;
eoskeygen::strlist_t words;
eoskeygen::Dictionary dict;
while(p++ < argc - 1) {
if (!strcmp(argv[p], "-m")) {
eoskeygen::console::disable_color = true;
} else if (!strcmp(argv[p], "--l33t")) {
option_l33t = true;
} else if (!memcmp(argv[p], "--threads=", 10)) {
#ifdef LIBEOSKEYGEN_HAVE_THREADS
option_num_threads = atoi(argv[p] + 10);
if (option_num_threads < 2) {
std::cerr << "NOTICE: Number of threads less than 2 does not make sense."
<< " So eosio-keygen will use 2." << std::endl;
option_num_threads = 2;
}
#else
// Even if we dont have threads. we consume the flag.
// otherwise we might break scripts. Print a nice message instead.
std::cerr << "NOTICE: eosio-keygen is not compiled with"
<< " thread support. this option is ignored." << std::endl;
#endif /* LIBEOSKEYGEN_HAVE_THREADS */
}
// Dictionary.
else if (!memcmp(argv[p], "--dict=", 7)) {
eoskeygen::Dictionary d;
std::string filename(argv[p] + 7);
if (d.loadFromFile(filename)) {
dict.add(d);
} else {
std::cerr << "Could not load dictionary from file: " << filename << std::endl;
}
}
// Language (dictionary, but we find the file in <CONFIG_SHARE_FULL_PATH>/dict/<lang>)
else if (!memcmp(argv[p], "--lang=", 7)) {
eoskeygen::Dictionary d;
std::string lang(argv[p] + 7);
std::string filename(std::string(CONFIG_SHARE_FULL_PATH) + "/dict/" + lang);
if (d.loadFromFile(filename)) {
dict.add(d);
} else {
std::cerr << "Could not load language " << lang << " (" << filename << ")" << std::endl;
}
}
// Error out on any flag we don't support.
else if (argv[p][0] == '-') {
std::cerr << "Unrecognized flag: " << argv[p] << std::endl;
usage(argv[0]);
return 0;
}
// wordlist and count
else if (words.size() < 1) {
std::string arg = std::string(argv[p]);
if (arg.rfind("file:", 0) == 0) {
std::string filename = arg.substr(5);
if (!eoskeygen::readLines(filename, words)) {
std::cerr << "Could not read file: " << filename << std::endl;
return 0;
}
if (words.size() < 1) {
std::cerr << filename << " did not contain any words" << std::endl;
return 0;
}
}
// List
else {
words = eoskeygen::strsplitwords(arg);
}
if (p + 1 < argc) {
count = atoi(argv[++p]);
if (count < 1) {
count = 1;
}
}
}
}
if (words.size() < 1) {
std::cerr << "You must specify a word list." << std::endl;
usage(argv[0]);
return 1;
}
return cmd_search(words, dict, count);
}
// Benchmark
else if (!strcmp(argv[p], "benchmark")) {
int num_keys = 1000;
if (++p < argc) {
num_keys = atoi(argv[p]);
if (num_keys < 1) {
num_keys = 1;
}
}
cmd_benchmark(num_keys);
} else {
std::cerr << "Unrecogniced command: " << argv[1] << std::endl;
usage(argv[0]);
return 1;
}
return 0;
}