From 799a80b3e5cc20737b0357e850156ae92f1e996d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 19 Dec 2019 14:24:29 +0100 Subject: [PATCH] Initial Commit --- .github/workflows/ci.yml | 43 +++++++++++++++ .gitignore | 1 + CMakeLists.txt | 45 ++++++++++++++++ LICENSE | 21 ++++++++ LICENSE.bitcoin | 22 ++++++++ README.md | 110 +++++++++++++++++++++++++++++++++++++++ build.sh | 7 +++ install.sh | 5 ++ src/WIF.cpp | 52 ++++++++++++++++++ src/WIF.h | 34 ++++++++++++ src/base58.cpp | 81 ++++++++++++++++++++++++++++ src/base58.h | 34 ++++++++++++ src/checksum.cpp | 48 +++++++++++++++++ src/checksum.h | 35 +++++++++++++ src/ec.cpp | 71 +++++++++++++++++++++++++ src/ec.h | 40 ++++++++++++++ src/main.cpp | 39 ++++++++++++++ src/types.h | 30 +++++++++++ uninstall.sh | 12 +++++ 19 files changed, 730 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100644 LICENSE.bitcoin create mode 100644 README.md create mode 100755 build.sh create mode 100755 install.sh create mode 100644 src/WIF.cpp create mode 100644 src/WIF.h create mode 100644 src/base58.cpp create mode 100644 src/base58.h create mode 100644 src/checksum.cpp create mode 100644 src/checksum.h create mode 100644 src/ec.cpp create mode 100644 src/ec.h create mode 100644 src/main.cpp create mode 100644 src/types.h create mode 100755 uninstall.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..9d83408 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,43 @@ +name: CI + +on: [ push ] + +jobs: + unix: + name: compile - Ubuntu + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: Configure + run: mkdir build && cd build && cmake .. + - name: Build + run: cmake --build build + + mac: + name: compile - MacOS + runs-on: macos-latest + + steps: + - uses: actions/checkout@v1 + - name: Dependancies + run: brew install openssl + - name: Configure + run: mkdir build && cd build && cmake -D OPENSSL_ROOT_DIR=/usr/local/opt/openssl@1.1 .. + - name: Build + run: cmake --build build + + win: + name: compile - windows + runs-on: windows-latest + steps: + - uses: actions/checkout@v1 + - name: Dependancies + run: | + mkdir build; cd build + Invoke-WebRequest -Uri https://mirror.firedaemon.com/OpenSSL/openssl-1.1.1e-dev.zip -OutFile openssl.zip + Expand-Archive openssl.zip + - name: Configure + run: cd build; cmake -D OPENSSL_ROOT_DIR="$pwd\openssl\openssl-1.1\x64" .. + - name: Build + run: cmake --build build diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..003272d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,45 @@ +cmake_minimum_required(VERSION 3.4) +project(eosio-keygen) + +set( INSTALL_BIN_DIR bin ) +set( INSTALL_SHARE_DIR share/${CMAKE_PROJECT_NAME} ) + +find_package(OpenSSL 1.1 REQUIRED) + +include_directories( ${OPENSSL_INCLUDE_DIR} ) + +add_executable( ${CMAKE_PROJECT_NAME} + src/ec.cpp + src/base58.cpp + src/checksum.cpp + src/WIF.cpp + src/main.cpp +) + +target_link_libraries( ${CMAKE_PROJECT_NAME} PUBLIC ${OPENSSL_LIBRARIES} ) + +if (WIN32) + if (CMAKE_SIZEOF_VOID_P EQUAL 8) + set (OPENSSL_LIBCRYPTO_NAME libcrypto-1_1-x64) + else() + set (OPENSSL_LIBCRYPTO_NAME libcrypto-1_1) + endif() + set( OPENSSL_LIBCRYPTO_DLL ${OPENSSL_ROOT_DIR}/bin/${OPENSSL_LIBCRYPTO_NAME}.dll ) + + # Need to copy libcrypto dll to binary folder. + add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${OPENSSL_LIBCRYPTO_DLL} + ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR} + ) + + # "Flat" install on windows. + set( INSTALL_BIN_DIR "." ) + set( INSTALL_SHARE_DIR "." ) + + # We also need to copy libcrypto dll during install + install(FILES ${OPENSSL_LIBCRYPTO_DLL} DESTINATION ${INSTALL_BIN_DIR}) +endif (WIN32) + +install(TARGETS ${CMAKE_PROJECT_NAME} RUNTIME DESTINATION ${INSTALL_BIN_DIR}) +install(FILES README.md LICENSE LICENSE.bitcoin DESTINATION ${INSTALL_SHARE_DIR}) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..03e9242 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 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. diff --git a/LICENSE.bitcoin b/LICENSE.bitcoin new file mode 100644 index 0000000..9d54ecb --- /dev/null +++ b/LICENSE.bitcoin @@ -0,0 +1,22 @@ +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..dc0e71f --- /dev/null +++ b/README.md @@ -0,0 +1,110 @@ + +# EOSIO Keygen + +This program generates public and private keypair for [EOS](https://eos.io/) + +## Compile + +You will need `openssl` development files (version 1.1 or later) to compile and `cmake` to compile this project. + +### Linux/MacOS + +#### Dependencies + +**Ubuntu:** +```sh +$ apt-get install libssl-dev cmake +``` +**For other linux distributions:** + +Consult the manual for how to get these installed. + +**MacOS:** + +```sh +$ brew install openssl cmake +``` + +#### Build + +After you just need to run `./build.sh` to trigger the whole build. + +If you dont want to use the script. you can build with cmake using the following commands: + +```sh +$ mkdir build && cd build +$ cmake .. && make +``` + +**MacOS:** You may need to point `cmake` to `openssl` by passing the argument +`-D OPENSSL_ROOT_DIR=/usr/local/opt/openssl@1.1` if openssl is not under `/usr/local/opt/openssl@1.1` you need to find the correct path. + +### Windows + +#### Dependencies + +Download and install `cmake` from [cmake.org](https://cmake.org) and download +[openssl](https://mirror.firedaemon.com/OpenSSL/openssl-1.1.1e-dev.zip) + +unpack `openssl-1.1.1e-dev.zip` somewhere on the filesystem. + +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. + +#### Build. + +you need to set `OPENSSL_ROOT_DIR` to the directory where you unpacked +`openssl-1.1.1e-dev.zip` append `x86` if you are on 32-bit system, `x64` for 64-bit. + +**NOTE:** `cmake` uses forward slash `/` for path even for windows. so make sure you use that when setting `OPENSSL_ROOT_DIR` + +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 +``` + +## Install + +After the project has been compiled. run `sudo ./install.sh` or the following code if you dont want to use that: + +```sh +# inside the build directory +$ sudo make install +``` + +**Windows:** + +It is possible to run `cmake --install .` from `build` directory. +Your DOS shell needs administrator privileges. + +## Uninstall + +Run `sudo ./uninstall.sh` or remove the files listed in `build/install_manifest.txt` manually. + +## 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. + +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) + +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 - [henrik@eossweden.org](mailto:henrik@eossweden.org) diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..1e1deaf --- /dev/null +++ b/build.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +mkdir build 2> /dev/null +pushd build > /dev/null +cmake .. $@ +make -B +popd > /dev/null diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..927f1c7 --- /dev/null +++ b/install.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +pushd build > /dev/null +make install $@ +popd > /dev/null diff --git a/src/WIF.cpp b/src/WIF.cpp new file mode 100644 index 0000000..c305df5 --- /dev/null +++ b/src/WIF.cpp @@ -0,0 +1,52 @@ +/** + * MIT License + * + * Copyright (c) 2019 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 +#include "base58.h" +#include "checksum.h" +#include "WIF.h" + +std::string wif_priv_encode(ec_privkey_t priv) { + + checksum_t check; + unsigned char buf[37] = { 0x80 }; + + memcpy(buf + 1, priv.data(), priv.size()); + + // Checksum + check = checksum_sha256d(buf, 33); + memcpy(buf + 33, check.data(), check.size()); + + return base58_encode(buf, buf + sizeof(buf)); +} + +std::string wif_pub_encode(ec_pubkey_t pub) { + + checksum_t check = checksum_ripemd160(pub.data(), pub.size()); + unsigned char buf[37]; + + memcpy(buf, pub.data(), pub.size()); + memcpy(buf + 33, check.data(), check.size()); + + return "EOS" + base58_encode(buf, buf + sizeof(buf)); +} diff --git a/src/WIF.h b/src/WIF.h new file mode 100644 index 0000000..c75e4fa --- /dev/null +++ b/src/WIF.h @@ -0,0 +1,34 @@ +/** + * MIT License + * + * Copyright (c) 2019 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 WIF_H +#define WIF_H + +#include +#include "ec.h" + +std::string wif_priv_encode(ec_privkey_t priv); + +std::string wif_pub_encode(ec_pubkey_t pub); + +#endif /* WIF_H */ diff --git a/src/base58.cpp b/src/base58.cpp new file mode 100644 index 0000000..38304c7 --- /dev/null +++ b/src/base58.cpp @@ -0,0 +1,81 @@ +/** + * 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. + * + * Based on code from https://github.com/bitcoin/bitcoin/blob/f1e2f2a85962c1664e4e55471061af0eaa798d40/src/base58.cpp + */ +#include +#include "base58.h" + +static const char charmap[59] = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; + +std::string base58_encode(const unsigned char* pbegin, const unsigned char* pend) { + + // Skip & count leading zeroes. + int zeroes = 0; + int length = 0; + while (pbegin != pend && *pbegin == 0) { + pbegin++; + zeroes++; + } + // Allocate enough space in big-endian base58 representation. + int size = (pend - pbegin) * 138 / 100 + 1; // log(256) / log(58), rounded up. + std::vector b58(size); + // Process the bytes. + while (pbegin != pend) { + int carry = *pbegin; + int i = 0; + // Apply "b58 = b58 * 256 + ch". + for (std::vector::reverse_iterator it = b58.rbegin(); (carry != 0 || i < length) && (it != b58.rend()); it++, i++) { + carry += 256 * (*it); + *it = carry % 58; + carry /= 58; + } + + assert(carry == 0); + length = i; + pbegin++; + } + // Skip leading zeroes in base58 result. + std::vector::iterator it = b58.begin() + (size - length); + while (it != b58.end() && *it == 0) + it++; + // Translate the result into a string. + std::string str; + str.reserve(zeroes + (b58.end() - it)); + str.assign(zeroes, '1'); + while (it != b58.end()) + str += charmap[*(it++)]; + return str; +} + +std::string base58_encode(const std::string& str) { + + const unsigned char *ptr = (const unsigned char *) str.c_str(); + return base58_encode(ptr, ptr + str.length()); +} + +std::string base58_encode(const std::vector& vch) { + + return base58_encode(vch.data(), vch.data() + vch.size()); +} diff --git a/src/base58.h b/src/base58.h new file mode 100644 index 0000000..77e4b11 --- /dev/null +++ b/src/base58.h @@ -0,0 +1,34 @@ +/** + * MIT License + * + * Copyright (c) 2019 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 BASE58_H +#define BASE58_H + +#include +#include + +std::string base58_encode(const std::string& str); +std::string base58_encode(const std::vector& vch); +std::string base58_encode(const unsigned char* pbegin, const unsigned char* pend); + +#endif /* BASE58_H */ diff --git a/src/checksum.cpp b/src/checksum.cpp new file mode 100644 index 0000000..3cc63bd --- /dev/null +++ b/src/checksum.cpp @@ -0,0 +1,48 @@ +/** + * MIT License + * + * Copyright (c) 2019 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 +#include +#include +#include "checksum.h" + +inline void sha256d(const unsigned char *data, unsigned int len, unsigned char *out) { + SHA256(data, len, out); + SHA256(out, 32, out); +} + +#define checksum_impl(name, func) \ + checksum_t checksum_##name(const unsigned char *data, unsigned int len) { \ + \ + checksum_t crc; \ + unsigned char hash[32]; \ + \ + func(data, len, hash); \ + \ + std::memcpy(crc.data(), hash, crc.size()); \ + return crc; \ + } + + +checksum_impl(sha256d, sha256d) +checksum_impl(ripemd160, RIPEMD160) diff --git a/src/checksum.h b/src/checksum.h new file mode 100644 index 0000000..dd37e7c --- /dev/null +++ b/src/checksum.h @@ -0,0 +1,35 @@ +/** + * MIT License + * + * Copyright (c) 2019 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 CHECKSUM_H +#define CHECKSUM_H + +#include + +typedef std::array checksum_t; + +checksum_t checksum_sha256d(const unsigned char *data, unsigned int len); + +checksum_t checksum_ripemd160(const unsigned char *data, unsigned int len); + +#endif /* CHECKSUM_H */ diff --git a/src/ec.cpp b/src/ec.cpp new file mode 100644 index 0000000..2e1859a --- /dev/null +++ b/src/ec.cpp @@ -0,0 +1,71 @@ +/** + * MIT License + * + * Copyright (c) 2019 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 +#include +#include +#include "ec.h" + +static int ec_generate_pair(unsigned char *priv, unsigned char *pub) { + + int ret = -1; + EC_KEY *k; + BN_CTX *ctx; + + // Create BIGNUM context. + ctx = BN_CTX_new(); + if (ctx == NULL) { + return -1; + } + + // Construct curve. + k = EC_KEY_new_by_curve_name(NID_secp256k1); + if (k == NULL) { + goto fail1; + } + + // Generate new key pair. + if (EC_KEY_generate_key(k) != 1) { + goto fail2; + } + + // Copy private key to binary format. + EC_KEY_priv2oct(k, priv, EC_PRIVKEY_SIZE); + + // Copy public key key + EC_POINT_point2oct(EC_KEY_get0_group(k), + EC_KEY_get0_public_key(k), POINT_CONVERSION_COMPRESSED, + pub, EC_PUBKEY_SIZE, ctx); + + ret = 0; +fail2: + EC_KEY_free(k); +fail1: + BN_CTX_free(ctx); + return ret; +} + +int ec_generate_key(struct ec_keypair *pair) { + + return ec_generate_pair(pair->secret.data(), pair->pub.data()); +} diff --git a/src/ec.h b/src/ec.h new file mode 100644 index 0000000..298d404 --- /dev/null +++ b/src/ec.h @@ -0,0 +1,40 @@ +/** + * MIT License + * + * Copyright (c) 2019 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 EC_H +#define EC_H + +#include +#include "types.h" + +typedef std::array ec_privkey_t; +typedef std::array ec_pubkey_t; + +struct ec_keypair { + ec_privkey_t secret; + ec_pubkey_t pub; +}; + +int ec_generate_key(struct ec_keypair *pair); + +#endif /* EC_H */ diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..11582aa --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,39 @@ +/** + * MIT License + * + * Copyright (c) 2019 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 +#include "base58.h" +#include "WIF.h" +#include "ec.h" + +int main(int argc, char **argv) { + + struct ec_keypair pair; + + ec_generate_key(&pair); + + std::cout << "Private: " << wif_priv_encode(pair.secret) << std::endl; + std::cout << "Public: " << wif_pub_encode(pair.pub) << std::endl; + + return 0; +} diff --git a/src/types.h b/src/types.h new file mode 100644 index 0000000..f470270 --- /dev/null +++ b/src/types.h @@ -0,0 +1,30 @@ +/** + * MIT License + * + * Copyright (c) 2019 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 TYPES_H +#define TYPES_H + +#define EC_PRIVKEY_SIZE 32 +#define EC_PUBKEY_SIZE 33 /* Compressed: 32 bytes + 1 prefix */ + +#endif /* TYPES_H */ diff --git a/uninstall.sh b/uninstall.sh new file mode 100755 index 0000000..60a788d --- /dev/null +++ b/uninstall.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +MANIFEST=build/install_manifest.txt + +if [ ! -f ${MANIFEST} ]; then + echo "Missing manifest: ${MANIFEST}" > /dev/stderr + exit 1 +fi + +for file in $(cat ${MANIFEST}); do + rm -f $file +done