diff --git a/.gitmodules b/.gitmodules index 75bb8b5d..e73952fe 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,19 @@ [submodule "external/monero-project"] path = external/monero-project - url = https://github.com/woodser/monero + url = https://github.com/nsec1/monero.git + branch = fixIncludePaths +[submodule "external/boost"] + path = external/boost + url = https://github.com/boostorg/boost.git +[submodule "external/openssl"] + path = external/openssl + url = https://github.com/openssl/openssl +[submodule "external/libsodium"] + path = external/libsodium + url = https://github.com/jedisct1/libsodium.git +[submodule "external/libexpat"] + path = external/libexpat + url = https://github.com/libexpat/libexpat.git +[submodule "external/unbound"] + path = external/unbound + url = https://github.com/NLnetLabs/unbound.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 2350917b..59cd2c8c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,17 @@ set(BUILD_SAMPLE OFF) set(BUILD_SCRATCHPAD OFF) set(BUILD_TESTS OFF) +option(STATIC "Build using static libraries") +if(STATIC) + if(WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .dll.a .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DZMQ_STATIC") +endif() + + ################### # monero-project ################### @@ -78,7 +89,11 @@ set(LibUSB_LIBRARIES ${usb_LIBRARY}) set(Boost_NO_BOOST_CMAKE 1) set(Boost_USE_MULTITHREADED ON) find_package(Boost 1.58 QUIET REQUIRED COMPONENTS chrono date_time filesystem program_options regex serialization wserialization system thread) -message(STATUS "Using Boost include dir at ${Boost_INCLUDE_DIR}") +if(Boost_FOUND) + message(STATUS "Using Boost include dir at ${Boost_INCLUDE_DIR}") + message(STATUS "Using Boost lib version: ${Boost_LIB_VERSION}") + message(STATUS "Using Boost libs: ${Boost_LIBRARIES}") +endif() ############ # OpenSSL @@ -95,7 +110,10 @@ if (APPLE AND NOT IOS) endif() find_package(OpenSSL REQUIRED) -message(STATUS "Using OpenSSL include dir at ${OPENSSL_INCLUDE_DIR}") +if(OPENSSL_FOUND) + message(STATUS "Using OpenSSL include dir at ${OPENSSL_INCLUDE_DIR}") + message(STATUS "Using OpenSSL libs: ${OPENSSL_LIBRARIES}") +endif() if(STATIC AND NOT IOS) if(UNIX) @@ -112,22 +130,34 @@ endif() ############ find_library(SODIUM_LIBRARY sodium REQUIRED) -message(STATUS "Using libsodium library at ${SODIUM_LIBRARY}") +if(SODIUM_LIBRARY) + message(STATUS "Using libsodium library at ${SODIUM_LIBRARY}") + find_path(SODIUM_INCLUDE_PATH sodium/crypto_verify_32.h) + if (SODIUM_INCLUDE_PATH) + message(STATUS "SODIUM_INCLUDE_PATH: ${SODIUM_INCLUDE_PATH}") + else() + message(FATAL_ERROR "Could not find required sodium/crypto_verify_32.h") + endif() +endif() + ############ # HIDAPI ############ -if(APPLE) - include_directories(SYSTEM /usr/include/malloc) - if(POLICY CMP0042) - cmake_policy(SET CMP0042 NEW) +option(USE_DEVICE_TREZOR "Trezor hardware wallet suport" ON) +if (USE_DEVICE_TREZOR) + if(APPLE) + include_directories(SYSTEM /usr/include/malloc) + if(POLICY CMP0042) + cmake_policy(SET CMP0042 NEW) + endif() endif() -endif() -find_package(HIDAPI REQUIRED) -message(STATUS "Using HIDAPI include dir at ${HIDAPI_INCLUDE_DIR}") -add_definitions(-DHAVE_HIDAPI) + find_package(HIDAPI REQUIRED) + message(STATUS "Using HIDAPI include dir at ${HIDAPI_INCLUDE_DIR}") + add_definitions(-DHAVE_HIDAPI) +endif() ############# # Monero @@ -200,10 +230,6 @@ add_library(cryptonote_core STATIC IMPORTED) set_target_properties(cryptonote_core PROPERTIES IMPORTED_LOCATION ${MONERO_PROJECT_BUILD}/src/cryptonote_core/libcryptonote_core.a) -add_library(cryptonote_protocol STATIC IMPORTED) -set_target_properties(cryptonote_protocol PROPERTIES IMPORTED_LOCATION - ${MONERO_PROJECT_BUILD}/src/cryptonote_protocol/libcryptonote_protocol.a) - add_library(cryptonote_basic STATIC IMPORTED) set_target_properties(cryptonote_basic PROPERTIES IMPORTED_LOCATION ${MONERO_PROJECT_BUILD}/src/cryptonote_basic/libcryptonote_basic.a) @@ -280,7 +306,14 @@ set( ) if (BUILD_LIBRARY) - add_library(monero-cpp SHARED ${LIBRARY_SRC_FILES}) + + if(STATIC) + set(BUILD_SHARED_LIBS OFF) + else() + set(BUILD_SHARED_LIBS ON) + endif() + + add_library(monero-cpp ${LIBRARY_SRC_FILES}) target_include_directories(monero-cpp PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include @@ -294,12 +327,10 @@ if (BUILD_LIBRARY) "${MONERO_PROJECT_SRC}/wallet/api" "${MONERO_PROJECT_SRC}/hardforks" "${MONERO_PROJECT_SRC}/crypto" - "${MONERO_PROJECT_SRC}/crypto/crypto_ops_builder/include/" + ${SODIUM_INCLUDE_PATH} ${Protobuf_INCLUDE_DIR} ${Boost_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} - external/libsodium/include/sodium - external/openssl-sdk/include ${HIDAPI_INCLUDE_DIR} ${UNBOUND_INCLUDE_DIR} ) @@ -312,7 +343,6 @@ if (BUILD_LIBRARY) unbound easylogging cryptonote_core - cryptonote_protocol cryptonote_basic cryptonote_format_utils_basic mnemonics @@ -388,12 +418,10 @@ if (BUILD_SAMPLE) "${MONERO_PROJECT_SRC}/wallet/api" "${MONERO_PROJECT_SRC}/hardforks" "${MONERO_PROJECT_SRC}/crypto" - "${MONERO_PROJECT_SRC}/crypto/crypto_ops_builder/include/" + ${SODIUM_INCLUDE_PATH} ${Protobuf_INCLUDE_DIR} ${Boost_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} - external/libsodium/include/sodium - external/openssl-sdk/include ${HIDAPI_INCLUDE_DIR} ${UNBOUND_INCLUDE_DIR} ) @@ -405,7 +433,6 @@ if (BUILD_SAMPLE) lmdb easylogging cryptonote_core - cryptonote_protocol cryptonote_basic cryptonote_format_utils_basic mnemonics @@ -460,12 +487,10 @@ if (BUILD_SCRATCHPAD) "${MONERO_PROJECT_SRC}/wallet/api" "${MONERO_PROJECT_SRC}/hardforks" "${MONERO_PROJECT_SRC}/crypto" - "${MONERO_PROJECT_SRC}/crypto/crypto_ops_builder/include/" + ${SODIUM_INCLUDE_PATH} ${Protobuf_INCLUDE_DIR} ${Boost_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} - external/libsodium/include/sodium - external/openssl-sdk/include ${HIDAPI_INCLUDE_DIR} ${UNBOUND_INCLUDE_DIR} ) @@ -477,7 +502,6 @@ if (BUILD_SCRATCHPAD) lmdb easylogging cryptonote_core - cryptonote_protocol cryptonote_basic cryptonote_format_utils_basic mnemonics @@ -532,12 +556,10 @@ if (BUILD_TESTS) "${MONERO_PROJECT_SRC}/wallet/api" "${MONERO_PROJECT_SRC}/hardforks" "${MONERO_PROJECT_SRC}/crypto" - "${MONERO_PROJECT_SRC}/crypto/crypto_ops_builder/include/" + ${SODIUM_INCLUDE_PATH} ${Protobuf_INCLUDE_DIR} ${Boost_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} - external/libsodium/include/sodium - external/openssl-sdk/include ${HIDAPI_INCLUDE_DIR} ${UNBOUND_INCLUDE_DIR} ) @@ -549,7 +571,6 @@ if (BUILD_TESTS) lmdb easylogging cryptonote_core - cryptonote_protocol cryptonote_basic cryptonote_format_utils_basic mnemonics diff --git a/README.md b/README.md index 6c9b03a4..87c60665 100644 --- a/README.md +++ b/README.md @@ -162,41 +162,9 @@ For example, [monero-java](https://github.com/woodser/monero-java) compiles this ### Linux 1. Clone the project repository if applicable: `git clone --recurse-submodules https://github.com/woodser/monero-cpp.git` -2. Update dependencies: `sudo apt update && sudo apt install build-essential cmake pkg-config libssl-dev libzmq3-dev libunbound-dev libsodium-dev libunwind8-dev liblzma-dev libreadline6-dev libexpat1-dev libpgm-dev qttools5-dev-tools libhidapi-dev libusb-1.0-0-dev libprotobuf-dev protobuf-compiler libudev-dev libboost-chrono-dev libboost-date-time-dev libboost-filesystem-dev libboost-locale-dev libboost-program-options-dev libboost-regex-dev libboost-serialization-dev libboost-system-dev libboost-thread-dev python3 ccache doxygen graphviz nettle-dev libevent-dev` -3. Follow instructions to install [unbound](https://unbound.docs.nlnetlabs.nl/en/latest/getting-started/installation.html) for Linux to your home directory (e.g. `~/unbound-1.19.0`). - - For example, install expat: - ``` - cd ~ - wget https://github.com/libexpat/libexpat/releases/download/R_2_4_8/expat-2.4.8.tar.bz2 - tar -xf expat-2.4.8.tar.bz2 - sudo rm expat-2.4.8.tar.bz2 - cd expat-2.4.8 - ./configure --enable-static --disable-shared - make - sudo make install - cd ../ - ``` - - For example, install unbound: - ``` - cd ~ - wget https://www.nlnetlabs.nl/downloads/unbound/unbound-1.19.0.tar.gz - tar xzf unbound-1.19.0.tar.gz - sudo apt update - sudo apt install -y build-essential - sudo apt install -y libssl-dev - sudo apt install -y libexpat1-dev - sudo apt-get install -y bison - sudo apt-get install -y flex - cd unbound-1.19.0 - ./configure --with-libexpat=/usr --with-ssl=/usr --enable-static-exe - make - sudo make install - cd ../ - ``` -4. Build monero-project, located as a submodule at ./external/monero-project. Install [dependencies](https://github.com/monero-project/monero#dependencies) as needed for your system, then build with: `make release-static -j8` -5. Link to this library's source files in your application, or build monero-cpp to a shared library in ./build: `./bin/build_libmonero_cpp.sh` +2. Update dependencies: `sudo apt update && sudo apt install build-essential autoconf libtool cmake pkg-config libzmq3-dev libunwind8-dev liblzma-dev libreadline6-dev libpgm-dev qttools5-dev-tools libhidapi-dev libusb-1.0-0-dev libprotobuf-dev protobuf-compiler libudev-dev python3 ccache doxygen graphviz nettle-dev libevent-dev bison flex` +3. Build monero-project, located as a submodule at ./external/monero-project. Install [dependencies](https://github.com/monero-project/monero#dependencies) as needed for your system, then build with: `make release-static -j8` +4. Link to this library's source files in your application, or build monero-cpp to a shared library in ./build: `./bin/build_libmonero_cpp.sh` ### macOS diff --git a/bin/build_libmonero_cpp.sh b/bin/build_libmonero_cpp.sh index 8056d104..08eda41f 100755 --- a/bin/build_libmonero_cpp.sh +++ b/bin/build_libmonero_cpp.sh @@ -1,9 +1,51 @@ #!/bin/sh +export HOST_NCORES=${HOST_NCORES-$(nproc 2>/dev/null || shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1)} +BUILD_DIR="$(pwd)/build" +INSTALL_DIR="$BUILD_DIR/install" +export CMAKE_PREFIX_PATH=$INSTALL_DIR${CMAKE_PREFIX_PATH+:$CMAKE_PREFIX_PATH} +USE_DEVICE_TREZOR=${USE_DEVICE_TREZOR-ON} +echo "HOST_NCORES=$HOST_NCORES in $0" +echo "CMAKE_PREFIX_PATH=$CMAKE_PREFIX_PATH in $0" +echo "USE_DEVICE_TREZOR=$USE_DEVICE_TREZOR in $0" + +[ -d $INSTALL_DIR ] || mkdir -p $INSTALL_DIR + +(cd external/boost && \ +./bootstrap.sh --prefix=$INSTALL_DIR && ./b2 -j$HOST_NCORES \ +--with-chrono \ +--with-date_time \ +--with-filesystem \ +--with-program_options \ +--with-regex \ +--with-serialization \ +--with-system \ +--with-thread \ +--with-locale \ +link=static \ +cxxflags=-fPIC cflags=-fPIC \ +install) && \ + +(cd external/openssl && \ +./Configure no-apps no-afalgeng no-docs no-ui-console no-shared --prefix=$INSTALL_DIR --libdir=lib && \ +make -j$HOST_NCORES && make install) && \ + +(cd external/libsodium && \ +./configure --enable-shared=no --with-pic=yes --prefix=$INSTALL_DIR && \ +make -j$HOST_NCORES && make check && make install) && \ + +(cd external/libexpat/expat && \ +./buildconf.sh && ./configure --prefix=$INSTALL_DIR --enable-static --disable-shared --with-pic=yes && \ +make -j$HOST_NCORES install) && \ + +(cd external/unbound && \ +./configure --with-ssl=$INSTALL_DIR --prefix=$INSTALL_DIR --with-libexpat=$INSTALL_DIR --enable-static-exe --enable-static --disable-shared --with-pic=yes && \ +make -j$HOST_NCORES install) && \ + # build monero-project dependencies cd ./external/monero-project/ || exit 1 git submodule update --init --force || exit 1 -HOST_NCORES=$(nproc 2>/dev/null || shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1) + if [[ "$OSTYPE" == "msys" ]]; then bit=$(getconf LONG_BIT) if [ "$bit" == "64" ]; then @@ -16,13 +58,20 @@ elif [[ "$OSTYPE" == "cygwin" ]]; then exit 1 else # OS is not windows - make release-static -j$HOST_NCORES || exit 1 + MONERO_BUILD_DIR="build/release" + test -d $MONERO_BUILD_DIR || mkdir -p $MONERO_BUILD_DIR + (cd $MONERO_BUILD_DIR && \ + cmake -D STATIC=ON -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release \ + -D OPENSSL_ROOT_DIR=$INSTALL_DIR \ + -D USE_DEVICE_TREZOR=$USE_DEVICE_TREZOR \ + -D BOOST_IGNORE_SYSTEM_PATHS=ON \ + ../.. && make -j$HOST_NCORES wallet) || exit 1 fi cd ../../ # build libmonero-cpp shared library mkdir -p build && cd build && -cmake .. && +cmake -D USE_DEVICE_TREZOR=$USE_DEVICE_TREZOR -D OPENSSL_ROOT_DIR=$INSTALL_DIR $@ .. && cmake --build . && -make . \ No newline at end of file +make -j$HOST_NCORES . diff --git a/external/boost b/external/boost new file mode 160000 index 00000000..ad09f667 --- /dev/null +++ b/external/boost @@ -0,0 +1 @@ +Subproject commit ad09f667e61e18f5c31590941e748ac38e5a81bf diff --git a/external/libexpat b/external/libexpat new file mode 160000 index 00000000..88b3ed55 --- /dev/null +++ b/external/libexpat @@ -0,0 +1 @@ +Subproject commit 88b3ed553d8ad335559254863a33360d55b9f1d6 diff --git a/external/libsodium b/external/libsodium new file mode 160000 index 00000000..9511c982 --- /dev/null +++ b/external/libsodium @@ -0,0 +1 @@ +Subproject commit 9511c982fb1d046470a8b42aa36556cdb7da15de diff --git a/external/libsodium/include/sodium/crypto_verify_16.h b/external/libsodium/include/sodium/crypto_verify_16.h deleted file mode 100644 index 5e9eeabe..00000000 --- a/external/libsodium/include/sodium/crypto_verify_16.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_16_H -#define crypto_verify_16_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_16_BYTES 16U -SODIUM_EXPORT -size_t crypto_verify_16_bytes(void); - -SODIUM_EXPORT -int crypto_verify_16(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/external/libsodium/include/sodium/crypto_verify_32.h b/external/libsodium/include/sodium/crypto_verify_32.h deleted file mode 100644 index 281b5a1b..00000000 --- a/external/libsodium/include/sodium/crypto_verify_32.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_32_H -#define crypto_verify_32_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_32_BYTES 32U -SODIUM_EXPORT -size_t crypto_verify_32_bytes(void); - -SODIUM_EXPORT -int crypto_verify_32(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/external/libsodium/include/sodium/crypto_verify_64.h b/external/libsodium/include/sodium/crypto_verify_64.h deleted file mode 100644 index 0dc7c304..00000000 --- a/external/libsodium/include/sodium/crypto_verify_64.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_64_H -#define crypto_verify_64_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_64_BYTES 64U -SODIUM_EXPORT -size_t crypto_verify_64_bytes(void); - -SODIUM_EXPORT -int crypto_verify_64(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/external/libsodium/include/sodium/export.h b/external/libsodium/include/sodium/export.h deleted file mode 100644 index a0074fc9..00000000 --- a/external/libsodium/include/sodium/export.h +++ /dev/null @@ -1,57 +0,0 @@ - -#ifndef sodium_export_H -#define sodium_export_H - -#include -#include -#include - -#if !defined(__clang__) && !defined(__GNUC__) -# ifdef __attribute__ -# undef __attribute__ -# endif -# define __attribute__(a) -#endif - -#ifdef SODIUM_STATIC -# define SODIUM_EXPORT -# define SODIUM_EXPORT_WEAK -#else -# if defined(_MSC_VER) -# ifdef SODIUM_DLL_EXPORT -# define SODIUM_EXPORT __declspec(dllexport) -# else -# define SODIUM_EXPORT __declspec(dllimport) -# endif -# else -# if defined(__SUNPRO_C) -# ifndef __GNU_C__ -# define SODIUM_EXPORT __attribute__ (visibility(__global)) -# else -# define SODIUM_EXPORT __attribute__ __global -# endif -# elif defined(_MSG_VER) -# define SODIUM_EXPORT extern __declspec(dllexport) -# else -# define SODIUM_EXPORT __attribute__ ((visibility ("default"))) -# endif -# endif -# if defined(__ELF__) && !defined(SODIUM_DISABLE_WEAK_FUNCTIONS) -# define SODIUM_EXPORT_WEAK SODIUM_EXPORT __attribute__((weak)) -# else -# define SODIUM_EXPORT_WEAK SODIUM_EXPORT -# endif -#endif - -#ifndef CRYPTO_ALIGN -# if defined(__INTEL_COMPILER) || defined(_MSC_VER) -# define CRYPTO_ALIGN(x) __declspec(align(x)) -# else -# define CRYPTO_ALIGN(x) __attribute__ ((aligned(x))) -# endif -#endif - -#define SODIUM_MIN(A, B) ((A) < (B) ? (A) : (B)) -#define SODIUM_SIZE_MAX SODIUM_MIN(UINT64_MAX, SIZE_MAX) - -#endif diff --git a/external/libsodium/src/crypto_verify/verify.c b/external/libsodium/src/crypto_verify/verify.c deleted file mode 100644 index ffebf220..00000000 --- a/external/libsodium/src/crypto_verify/verify.c +++ /dev/null @@ -1,98 +0,0 @@ - -#include -#include - -#include "crypto_verify_16.h" -#include "crypto_verify_32.h" -#include "crypto_verify_64.h" - -size_t -crypto_verify_16_bytes(void) -{ - return crypto_verify_16_BYTES; -} - -size_t -crypto_verify_32_bytes(void) -{ - return crypto_verify_32_BYTES; -} - -size_t -crypto_verify_64_bytes(void) -{ - return crypto_verify_64_BYTES; -} - -#if defined(HAVE_EMMINTRIN_H) && defined(__SSE2__) - -# ifdef __GNUC__ -# pragma GCC target("sse2") -# endif -# include - -static inline int -crypto_verify_n(const unsigned char *x_, const unsigned char *y_, - const int n) -{ - const __m128i zero = _mm_setzero_si128(); - volatile __m128i v1, v2, z; - volatile int m; - int i; - - const volatile __m128i *volatile x = - (const volatile __m128i *volatile) (const void *) x_; - const volatile __m128i *volatile y = - (const volatile __m128i *volatile) (const void *) y_; - v1 = _mm_loadu_si128((const __m128i *) &x[0]); - v2 = _mm_loadu_si128((const __m128i *) &y[0]); - z = _mm_xor_si128(v1, v2); - for (i = 1; i < n / 16; i++) { - v1 = _mm_loadu_si128((const __m128i *) &x[i]); - v2 = _mm_loadu_si128((const __m128i *) &y[i]); - z = _mm_or_si128(z, _mm_xor_si128(v1, v2)); - } - m = _mm_movemask_epi8(_mm_cmpeq_epi32(z, zero)); - v1 = zero; v2 = zero; z = zero; - - return (int) (((uint32_t) m + 1U) >> 16) - 1; -} - -#else - -static inline int -crypto_verify_n(const unsigned char *x_, const unsigned char *y_, - const int n) -{ - const volatile unsigned char *volatile x = - (const volatile unsigned char *volatile) x_; - const volatile unsigned char *volatile y = - (const volatile unsigned char *volatile) y_; - volatile uint_fast16_t d = 0U; - int i; - - for (i = 0; i < n; i++) { - d |= x[i] ^ y[i]; - } - return (1 & ((d - 1) >> 8)) - 1; -} - -#endif - -int -crypto_verify_16(const unsigned char *x, const unsigned char *y) -{ - return crypto_verify_n(x, y, crypto_verify_16_BYTES); -} - -int -crypto_verify_32(const unsigned char *x, const unsigned char *y) -{ - return crypto_verify_n(x, y, crypto_verify_32_BYTES); -} - -int -crypto_verify_64(const unsigned char *x, const unsigned char *y) -{ - return crypto_verify_n(x, y, crypto_verify_64_BYTES); -} diff --git a/external/monero-project b/external/monero-project index d4f2a4a9..01a653fb 160000 --- a/external/monero-project +++ b/external/monero-project @@ -1 +1 @@ -Subproject commit d4f2a4a9bba6eead4ad9251f7ef77ab7484dc415 +Subproject commit 01a653fb9f5c40fe2f9096e0c25a63490ceabc40 diff --git a/external/openssl b/external/openssl new file mode 160000 index 00000000..db2ac4f6 --- /dev/null +++ b/external/openssl @@ -0,0 +1 @@ +Subproject commit db2ac4f6ebd8f3d7b2a60882992fbea1269114e2 diff --git a/external/unbound b/external/unbound new file mode 160000 index 00000000..79e4c578 --- /dev/null +++ b/external/unbound @@ -0,0 +1 @@ +Subproject commit 79e4c578518886a32475cfbb0de383ff3a905033