From 96b50eb5aa6d33c8e47eee51a869babb72ceb36c Mon Sep 17 00:00:00 2001 From: tarsin Date: Sat, 23 Jul 2022 15:51:43 +0800 Subject: [PATCH] Add nettle for encrypt --- .gitmodules | 4 +- native/src/main/jni/CMakeLists.txt | 14 + native/src/main/jni/libarchive | 2 +- native/src/main/jni/nettle/CMakeLists.txt | 239 +++++++++++++++ native/src/main/jni/nettle/config.h | 275 ++++++++++++++++++ native/src/main/jni/nettle/keymap.h | 1 + .../{libnettle/libnettle => nettle/nettle} | 0 native/src/main/jni/nettle/rotors.h | 1 + native/src/main/jni/nettle/version.h | 64 ++++ 9 files changed, 597 insertions(+), 3 deletions(-) create mode 100644 native/src/main/jni/nettle/CMakeLists.txt create mode 100644 native/src/main/jni/nettle/config.h create mode 100644 native/src/main/jni/nettle/keymap.h rename native/src/main/jni/{libnettle/libnettle => nettle/nettle} (100%) create mode 100644 native/src/main/jni/nettle/rotors.h create mode 100644 native/src/main/jni/nettle/version.h diff --git a/.gitmodules b/.gitmodules index e61a01970..4fa209fd1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,6 +13,6 @@ [submodule "native/src/main/jni/liblzma"] path = native/src/main/jni/liblzma url = https://github.com/Ehviewer-Overhauled/xz -[submodule "native/src/main/jni/libnettle/libnettle"] - path = native/src/main/jni/libnettle/libnettle +[submodule "native/src/main/jni/nettle/nettle"] + path = native/src/main/jni/nettle/nettle url = https://github.com/Ehviewer-Overhauled/nettle diff --git a/native/src/main/jni/CMakeLists.txt b/native/src/main/jni/CMakeLists.txt index 022746b16..97b49cb00 100644 --- a/native/src/main/jni/CMakeLists.txt +++ b/native/src/main/jni/CMakeLists.txt @@ -13,6 +13,20 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Oz -fvisibility=hidden -fvisibility-inlines -mllvm -polly-detect-profitability-min-per-loop-insts=40 \ -mllvm -polly-invariant-load-hoisting") +# Build GNUTLS libnettle +add_subdirectory(nettle) + +# Configure libnettle support for libarchive +include_directories(nettle) +include_directories(.) +set(HAVE_LIBNETTLE 1) +set(HAVE_NETTLE_AES_H 1) +set(HAVE_NETTLE_HMAC_H 1) +set(HAVE_NETTLE_MD5_H 1) +set(HAVE_NETTLE_PBKDF2_H 1) +set(HAVE_NETTLE_RIPEMD160_H 1) +set(HAVE_NETTLE_SHA_H 1) + # Build liblzma add_subdirectory(liblzma) diff --git a/native/src/main/jni/libarchive b/native/src/main/jni/libarchive index c59388054..b0ff23367 160000 --- a/native/src/main/jni/libarchive +++ b/native/src/main/jni/libarchive @@ -1 +1 @@ -Subproject commit c59388054fa0fa45b7539b6a2f881d61afe25f0c +Subproject commit b0ff233678bd0b2226d0f31aa1ea6d4c94d98fe4 diff --git a/native/src/main/jni/nettle/CMakeLists.txt b/native/src/main/jni/nettle/CMakeLists.txt new file mode 100644 index 000000000..e63dbb33d --- /dev/null +++ b/native/src/main/jni/nettle/CMakeLists.txt @@ -0,0 +1,239 @@ +cmake_minimum_required(VERSION 3.4.1) +project(nettle C) + +set(LIBNETTLE_DEFINITIONS + -DHAVE_CONFIG_H) + +set(LIBNETTLE_SOURCES + nettle/aes-decrypt-internal.c + nettle/aes-decrypt.c + nettle/aes-decrypt-table.c + nettle/aes128-decrypt.c + nettle/aes192-decrypt.c + nettle/aes256-decrypt.c + nettle/aes-encrypt-internal.c + nettle/aes-encrypt.c + nettle/aes-encrypt-table.c + nettle/aes128-encrypt.c + nettle/aes192-encrypt.c + nettle/aes256-encrypt.c + nettle/aes-invert-internal.c + nettle/aes-set-key-internal.c + nettle/aes-set-encrypt-key.c + nettle/aes-set-decrypt-key.c + nettle/aes128-set-encrypt-key.c + nettle/aes128-set-decrypt-key.c + nettle/aes128-meta.c + nettle/aes192-set-encrypt-key.c + nettle/aes192-set-decrypt-key.c + nettle/aes192-meta.c + nettle/aes256-set-encrypt-key.c + nettle/aes256-set-decrypt-key.c + nettle/aes256-meta.c + nettle/nist-keywrap.c + nettle/arcfour.c + nettle/arcfour-crypt.c + nettle/arctwo.c + nettle/arctwo-meta.c + nettle/blowfish.c + nettle/blowfish-bcrypt.c + nettle/base16-encode.c + nettle/base16-decode.c + nettle/base16-meta.c + nettle/base64-encode.c + nettle/base64-decode.c + nettle/base64-meta.c + nettle/base64url-encode.c + nettle/base64url-decode.c + nettle/base64url-meta.c + nettle/buffer.c + nettle/buffer-init.c + nettle/camellia-crypt-internal.c + nettle/camellia-table.c + nettle/camellia-absorb.c + nettle/camellia-invert-key.c + nettle/camellia128-set-encrypt-key.c + nettle/camellia128-crypt.c + nettle/camellia128-set-decrypt-key.c + nettle/camellia128-meta.c + nettle/camellia192-meta.c + nettle/camellia256-set-encrypt-key.c + nettle/camellia256-crypt.c + nettle/camellia256-set-decrypt-key.c + nettle/camellia256-meta.c + nettle/cast128.c + nettle/cast128-meta.c + nettle/cbc.c + nettle/cbc-aes128-encrypt.c + nettle/cbc-aes192-encrypt.c + nettle/cbc-aes256-encrypt.c + nettle/ccm.c + nettle/ccm-aes128.c + nettle/ccm-aes192.c + nettle/ccm-aes256.c + nettle/cfb.c + nettle/siv-cmac.c + nettle/siv-cmac-aes128.c + nettle/siv-cmac-aes256.c + nettle/cnd-memcpy.c + nettle/chacha-crypt.c + nettle/chacha-core-internal.c + nettle/chacha-poly1305.c + nettle/chacha-poly1305-meta.c + nettle/chacha-set-key.c + nettle/chacha-set-nonce.c + nettle/ctr.c + nettle/ctr16.c + nettle/des.c + nettle/des3.c + nettle/eax.c + nettle/eax-aes128.c + nettle/eax-aes128-meta.c + nettle/ghash-set-key.c + nettle/ghash-update.c + nettle/gcm.c + nettle/gcm-aes.c + nettle/gcm-aes128.c + nettle/gcm-aes128-meta.c + nettle/gcm-aes192.c + nettle/gcm-aes192-meta.c + nettle/gcm-aes256.c + nettle/gcm-aes256-meta.c + nettle/gcm-camellia128.c + nettle/gcm-camellia128-meta.c + nettle/gcm-camellia256.c + nettle/gcm-camellia256-meta.c + nettle/cmac.c + nettle/cmac64.c + nettle/cmac-aes128.c + nettle/cmac-aes256.c + nettle/cmac-des3.c + nettle/cmac-aes128-meta.c + nettle/cmac-aes256-meta.c + nettle/cmac-des3-meta.c + nettle/gost28147.c + nettle/gosthash94.c + nettle/gosthash94-meta.c + nettle/hmac.c + nettle/hmac-gosthash94.c + nettle/hmac-md5.c + nettle/hmac-ripemd160.c + nettle/hmac-sha1.c + nettle/hmac-sha224.c + nettle/hmac-sha256.c + nettle/hmac-sha384.c + nettle/hmac-sha512.c + nettle/hmac-streebog.c + nettle/hmac-sm3.c + nettle/hmac-md5-meta.c + nettle/hmac-ripemd160-meta.c + nettle/hmac-sha1-meta.c + nettle/hmac-sha224-meta.c + nettle/hmac-sha256-meta.c + nettle/hmac-sha384-meta.c + nettle/hmac-sha512-meta.c + nettle/hmac-streebog-meta.c + nettle/hmac-sm3-meta.c + nettle/knuth-lfib.c + nettle/hkdf.c + nettle/md2.c + nettle/md2-meta.c + nettle/md4.c + nettle/md4-meta.c + nettle/md5.c + nettle/md5-compress.c + nettle/md5-compat.c + nettle/md5-meta.c + nettle/memeql-sec.c + nettle/memxor.c + nettle/memxor3.c + nettle/nettle-lookup-hash.c + nettle/nettle-meta-aeads.c + nettle/nettle-meta-armors.c + nettle/nettle-meta-ciphers.c + nettle/nettle-meta-hashes.c + nettle/nettle-meta-macs.c + nettle/pbkdf2.c + nettle/pbkdf2-hmac-gosthash94.c + nettle/pbkdf2-hmac-sha1.c + nettle/pbkdf2-hmac-sha256.c + nettle/pbkdf2-hmac-sha384.c + nettle/pbkdf2-hmac-sha512.c + nettle/poly1305-aes.c + nettle/poly1305-internal.c + nettle/realloc.c + nettle/ripemd160.c + nettle/ripemd160-compress.c + nettle/ripemd160-meta.c + nettle/salsa20-core-internal.c + nettle/salsa20-crypt-internal.c + nettle/salsa20-crypt.c + nettle/salsa20r12-crypt.c + nettle/salsa20-set-key.c + nettle/salsa20-set-nonce.c + nettle/salsa20-128-set-key.c + nettle/salsa20-256-set-key.c + nettle/sha1.c + nettle/sha1-compress.c + nettle/sha1-meta.c + nettle/sha256.c + nettle/sha256-compress.c + nettle/sha224-meta.c + nettle/sha256-meta.c + nettle/sha512.c + nettle/sha512-compress.c + nettle/sha384-meta.c + nettle/sha512-meta.c + nettle/sha512-224-meta.c + nettle/sha512-256-meta.c + nettle/sha3.c + nettle/sha3-permute.c + nettle/sha3-224.c + nettle/sha3-224-meta.c + nettle/sha3-256.c + nettle/sha3-256-meta.c + nettle/sha3-384.c + nettle/sha3-384-meta.c + nettle/sha3-512.c + nettle/sha3-512-meta.c + nettle/shake256.c + nettle/sm3.c + nettle/sm3-meta.c + nettle/serpent-set-key.c + nettle/serpent-encrypt.c + nettle/serpent-decrypt.c + nettle/serpent-meta.c + nettle/streebog.c + nettle/streebog-meta.c + nettle/twofish.c + nettle/twofish-meta.c + nettle/umac-nh.c + nettle/umac-nh-n.c + nettle/umac-l2.c + nettle/umac-l3.c + nettle/umac-poly64.c + nettle/umac-poly128.c + nettle/umac-set-key.c + nettle/umac32.c + nettle/umac64.c + nettle/umac96.c + nettle/umac128.c + nettle/version.c + nettle/write-be32.c + nettle/write-le32.c + nettle/write-le64.c + nettle/yarrow256.c + nettle/yarrow_key_event.c + nettle/xts.c + nettle/xts-aes128.c + nettle/xts-aes256.c + ) + +set(LIBNETTLE_INCLUDES + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/nettle + ) + +add_library(nettle STATIC ${LIBNETTLE_SOURCES}) +target_include_directories(nettle PUBLIC ${LIBNETTLE_INCLUDES}) +target_compile_definitions(nettle PRIVATE ${LIBNETTLE_DEFINITIONS}) \ No newline at end of file diff --git a/native/src/main/jni/nettle/config.h b/native/src/main/jni/nettle/config.h new file mode 100644 index 000000000..2ea4575eb --- /dev/null +++ b/native/src/main/jni/nettle/config.h @@ -0,0 +1,275 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* Define to 1 if using 'alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to 1 if you have 'alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if works. */ +#define HAVE_ALLOCA_H 1 + +/* Define if __builtin_bswap64 is available */ +#define HAVE_BUILTIN_BSWAP64 1 + +/* Define if clock_gettime is available */ +#define HAVE_CLOCK_GETTIME 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define if fcntl file locking is available */ +#define HAVE_FCNTL_LOCKING 1 + +/* Define if the compiler understands __attribute__ */ +#define HAVE_GCC_ATTRIBUTE 1 + +/* Define to 1 if you have the `getline' function. */ +#define HAVE_GETLINE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have dlopen (with -ldl). */ +#define HAVE_LIBDL 1 + +/* Define to 1 if you have the `gmp' library (-lgmp). */ +/* #undef HAVE_LIBGMP */ + +/* Define if compiler and linker supports __attribute__ ifunc */ +#define HAVE_LINK_IFUNC 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MALLOC_H 1 + +/* Define to 1 each of the following for which a native (ie. CPU specific) + implementation of the corresponding routine exists. */ +/* #undef HAVE_NATIVE_memxor3 */ +/* #undef HAVE_NATIVE_aes_decrypt */ +/* #undef HAVE_NATIVE_aes_encrypt */ +/* #undef HAVE_NATIVE_aes128_decrypt */ +/* #undef HAVE_NATIVE_aes128_encrypt */ +/* #undef HAVE_NATIVE_aes128_invert_key */ +/* #undef HAVE_NATIVE_aes128_set_decrypt_key */ +/* #undef HAVE_NATIVE_aes128_set_encrypt_key */ +/* #undef HAVE_NATIVE_aes192_decrypt */ +/* #undef HAVE_NATIVE_aes192_encrypt */ +/* #undef HAVE_NATIVE_aes192_invert_key */ +/* #undef HAVE_NATIVE_aes192_set_decrypt_key */ +/* #undef HAVE_NATIVE_aes192_set_encrypt_key */ +/* #undef HAVE_NATIVE_aes256_decrypt */ +/* #undef HAVE_NATIVE_aes256_encrypt */ +/* #undef HAVE_NATIVE_aes256_invert_key */ +/* #undef HAVE_NATIVE_aes256_set_decrypt_key */ +/* #undef HAVE_NATIVE_aes256_set_encrypt_key */ +/* #undef HAVE_NATIVE_cbc_aes128_encrypt */ +/* #undef HAVE_NATIVE_cbc_aes192_encrypt */ +/* #undef HAVE_NATIVE_cbc_aes256_encrypt */ +/* #undef HAVE_NATIVE_chacha_core */ +/* #undef HAVE_NATIVE_chacha_2core */ +/* #undef HAVE_NATIVE_chacha_3core */ +/* #undef HAVE_NATIVE_chacha_4core */ +/* #undef HAVE_NATIVE_fat_chacha_2core */ +/* #undef HAVE_NATIVE_fat_chacha_3core */ +/* #undef HAVE_NATIVE_fat_chacha_4core */ +/* #undef HAVE_NATIVE_ecc_curve25519_modp */ +/* #undef HAVE_NATIVE_ecc_curve448_modp */ +/* #undef HAVE_NATIVE_ecc_secp192r1_modp */ +/* #undef HAVE_NATIVE_ecc_secp192r1_redc */ +/* #undef HAVE_NATIVE_ecc_secp224r1_modp */ +/* #undef HAVE_NATIVE_ecc_secp224r1_redc */ +/* #undef HAVE_NATIVE_ecc_secp256r1_modp */ +/* #undef HAVE_NATIVE_ecc_secp256r1_redc */ +/* #undef HAVE_NATIVE_ecc_secp384r1_modp */ +/* #undef HAVE_NATIVE_ecc_secp384r1_redc */ +/* #undef HAVE_NATIVE_ecc_secp521r1_modp */ +/* #undef HAVE_NATIVE_ecc_secp521r1_redc */ +/* #undef HAVE_NATIVE_ghash_set_key */ +/* #undef HAVE_NATIVE_ghash_update */ +/* #undef HAVE_NATIVE_salsa20_core */ +/* #undef HAVE_NATIVE_salsa20_2core */ +/* #undef HAVE_NATIVE_fat_salsa20_2core */ +/* #undef HAVE_NATIVE_sha1_compress */ +/* #undef HAVE_NATIVE_sha256_compress */ +/* #undef HAVE_NATIVE_sha512_compress */ +/* #undef HAVE_NATIVE_sha3_permute */ +/* #undef HAVE_NATIVE_umac_nh */ +/* #undef HAVE_NATIVE_umac_nh_n */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_OPENSSL_ECDSA_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_OPENSSL_EVP_H */ + +/* Define to 1 if you have the `secure_getenv' function. */ +/* #undef HAVE_SECURE_GETENV */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDIO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strerror' function. */ +#define HAVE_STRERROR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_VALGRIND_MEMCHECK_H */ + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "nettle-bugs@lists.lysator.liu.se" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "nettle" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "nettle 3.8" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "nettle" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "3.8" + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG __SIZEOF_LONG__ + +/* The size of `size_t', as computed by sizeof. */ +#define SIZEOF_SIZE_T __SIZEOF_SIZE_T__ + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ +#define STDC_HEADERS 1 + +/* Define to 1 if you can safely include both and . This + macro is obsolete. */ +#define TIME_WITH_SYS_TIME 1 + +/* Defined if public key features are enabled */ +/* #undef WITH_HOGWEED */ + +/* Define if you have openssl's libcrypto (used for benchmarking) */ +/* #undef WITH_OPENSSL */ + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `int' if doesn't define. */ +/* #undef gid_t */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ + +/* Define to `int' if doesn't define. */ +/* #undef uid_t */ + +/* AIX requires this to be the first thing in the file. */ +#ifndef __GNUC__ +# if HAVE_ALLOCA_H +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +/* Needed for alloca on windows */ +# if HAVE_MALLOC_H +# include +# endif +# endif +#else /* defined __GNUC__ */ +# if HAVE_ALLOCA_H +# include +# else +/* Needed for alloca on windows, also with gcc */ +# if HAVE_MALLOC_H +# include +# endif +# endif +#endif + + +#if HAVE_STRERROR +#define STRERROR strerror +#else +#define STRERROR(x) (sys_errlist[x]) +#endif + + +#if __GNUC__ && HAVE_GCC_ATTRIBUTE +# define NORETURN __attribute__ ((__noreturn__)) +# define PRINTF_STYLE(f, a) __attribute__ ((__format__ (__printf__, f, a))) +# define UNUSED __attribute__ ((__unused__)) +#else +# define NORETURN +# define PRINTF_STYLE(f, a) +# define UNUSED +#endif + + +#if defined(__x86_64__) || defined(__arch64__) +# define HAVE_NATIVE_64_BIT 1 +#else +/* Needs include of before use. */ +# define HAVE_NATIVE_64_BIT (SIZEOF_LONG * CHAR_BIT >= 64) +#endif + diff --git a/native/src/main/jni/nettle/keymap.h b/native/src/main/jni/nettle/keymap.h new file mode 100644 index 000000000..8d1c8b69c --- /dev/null +++ b/native/src/main/jni/nettle/keymap.h @@ -0,0 +1 @@ + diff --git a/native/src/main/jni/libnettle/libnettle b/native/src/main/jni/nettle/nettle similarity index 100% rename from native/src/main/jni/libnettle/libnettle rename to native/src/main/jni/nettle/nettle diff --git a/native/src/main/jni/nettle/rotors.h b/native/src/main/jni/nettle/rotors.h new file mode 100644 index 000000000..8d1c8b69c --- /dev/null +++ b/native/src/main/jni/nettle/rotors.h @@ -0,0 +1 @@ + diff --git a/native/src/main/jni/nettle/version.h b/native/src/main/jni/nettle/version.h new file mode 100644 index 000000000..1e7feb26b --- /dev/null +++ b/native/src/main/jni/nettle/version.h @@ -0,0 +1,64 @@ +/* version.h + + Information about library version. + + Copyright (C) 2015 Red Hat, Inc. + Copyright (C) 2015 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_VERSION_H_INCLUDED +#define NETTLE_VERSION_H_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +/* Individual version numbers in decimal */ +#define NETTLE_VERSION_MAJOR 3 +#define NETTLE_VERSION_MINOR 8 + +#define NETTLE_USE_MINI_GMP 0 + +/* We need a preprocessor constant for GMP_NUMB_BITS, simply using + sizeof(mp_limb_t) * CHAR_BIT is not good enough. */ +#if NETTLE_USE_MINI_GMP +# define GMP_NUMB_BITS n/a +#endif + +int +nettle_version_major (void); + +int +nettle_version_minor (void); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_VERSION_H_INCLUDED */