commit 799a80b3e5cc20737b0357e850156ae92f1e996d Author: Henrik Hautakoski Date: Thu Dec 19 14:24:29 2019 +0100 Initial Commit 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