diff --git a/.gitignore b/.gitignore index 1b8fd1b..eac055b 100644 --- a/.gitignore +++ b/.gitignore @@ -84,7 +84,7 @@ androidTests/gradle/wrapper/gradle-wrapper.properties androidTests/gradlew androidTests/gradlew.bat org.tar.gz - +*.tar.xz *.iml android/external/[?]* diff --git a/android/build.gradle b/android/build.gradle index 3a5e9e4..4e874d5 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -4,12 +4,13 @@ def pEpEngineSrc = hasProperty('pEpEngineSrc') ? pEpEngineSrc : "../../pEpEngine def libpEpTransportSrc = hasProperty('libpEpTransportSrc') ? libpEpTransportSrc : "../../libpEpTransport" def libCxx11Src = hasProperty('libCxx11Src') ? libCxx11Src : "../../libpEpCxx11" def buildAutomatic = hasProperty('buildAutomatic') ? buildAutomatic : "true" -//CHeck M1 answers the correct thing off .avaialableprocessors here -//def threadsToUse = hasProperty('threadsToUse') ? -// threadsToUse : Runtime.getRuntime().availableProcessors() -def threadsToUse = 1 +//CHeck M1 answers the correct thing off .avaialableprocessors here Libetpan seems to break +def threadsToUse = hasProperty('threadsToUse') ? + threadsToUse : Runtime.getRuntime().availableProcessors() +//def threadsToUse = 1 def pEpEngineDB = new File(new File(pEpEngineSrc), 'db') +def CRYPTO_LIB = "botan" ext.archsToCompile = "arm arm64 x86 x86_64" //apply from: 'gradle/plugins/set-pep-jniadapter-archs.gradle' @@ -78,13 +79,22 @@ android { jniDebuggable false minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + buildConfigField "String", "CRYPTO_BACK_END", "\"${CRYPTO_LIB}\"" + externalNativeBuild { + ndkBuild { + arguments "-j${threadsToUse}", 'NDK_LOG=1', 'NDK_DEBUG=1', 'NDEBUG=null', '--output-sync=none', '-B', 'V=1' + // arguments '-B', 'NDK_DEBUG=1', 'NDEBUG=null', 'NDK_LOG=1' + } + } + } debug { + buildConfigField "String", "CRYPTO_BACK_END", "\"${CRYPTO_LIB}\"" jniDebuggable true externalNativeBuild { ndkBuild { - arguments "-j${threadsToUse}", 'NDK_LOG=1', 'NDK_DEBUG=1', 'NDEBUG=null', '--output-sync=none', '-B', 'V=1' + arguments "-j${threadsToUse}", 'NDK_LOG=1', 'NDK_DEBUG=1', 'NDEBUG=null', '--output-sync=none', '-B', 'V=1', "CRYPTO_LIB_NAME=${CRYPTO_LIB}" // arguments '-B', 'NDK_DEBUG=1', 'NDEBUG=null', 'NDK_LOG=1' } } @@ -134,7 +144,7 @@ android { println("buildExternal for abis: ${project.archsToCompile}") exec { workingDir 'external' - commandLine 'make', "-j${threadsToUse}", 'build', "archs=${project.archsToCompile}" + commandLine 'make', "-j${threadsToUse}", 'build', "archs=${project.archsToCompile}", "CRYPTO_LIB_NAME=${CRYPTO_LIB}" } } } diff --git a/android/external/Makefile.conf b/android/external/Makefile.conf index e1565c8..f93adcb 100644 --- a/android/external/Makefile.conf +++ b/android/external/Makefile.conf @@ -37,7 +37,12 @@ STRIP := $(ANDROID_NDK_HOME)/bin/llvm-strip ### Sequoia deps versions OPENSSL_VERSION=1.1.1q GMP_VERSION=6.2.1 +# If nettle is used NETTLE_VERSION=3.7.3 +# If Botan is used +BOTAN_VERSION=2.19.3 +# Crypto backend used +CRYPTO_LIB_NAME ?= nettle ### Git deps repos EXTERNAL_GIT_REPOS += libetpan|https://gitea.pep.foundation/pEp.foundation/libetpan.git?507ab94fc9609432ef2d4c62770139482f1b5084 @@ -50,14 +55,14 @@ EXTERNAL_SRCS += libiconv-src EXTERNAL_SRCS += uuid-src EXTERNAL_SRCS += openssl-src EXTERNAL_SRCS += gmp-src -EXTERNAL_SRCS += nettle-src +EXTERNAL_SRCS += $(CRYPTO_LIB_NAME)-src #### Clean source code targets. EXTERNAL_SRCS_CLEAN += libiconv-clean EXTERNAL_SRCS_CLEAN += uuid-clean EXTERNAL_SRCS_CLEAN += openssl-clean EXTERNAL_SRCS_CLEAN += gmp-clean -EXTERNAL_SRCS_CLEAN += nettle-clean +EXTERNAL_SRCS_CLEAN += $(CRYPTO_LIB_NAME)-clean EXTERNAL_SRCS_CLEAN += pEpEngineSequoiaBackend-clean ### Other variables diff --git a/android/external/MakefileTemplate b/android/external/MakefileTemplate index 42e22b5..9daa015 100644 --- a/android/external/MakefileTemplate +++ b/android/external/MakefileTemplate @@ -10,6 +10,7 @@ APP_ABI ?= [ARCH] HOST ?= [HOST] NDK_TOOLCHAIN_TARGET ?= [NDK_TOOLCHAIN_TARGET] SEQUOIA_ARCH ?= [SEQUOIA_ARCH] +BOTAN_ARCH ?= [BOTAN_ARCH] OPENSSL_ARCHITECTURE ?= [OPENSSL_ARCHITECTURE] COMPILER_PREFIX ?= [COMPILER_PREFIX] @@ -156,12 +157,6 @@ uuid/jni/Android.mk: uuid.src.stamp cp ../libuuid.Android.mk uuid/jni/Android.mk -#------------------------------------------------------------------------------# -# Sequoia - -## Build sequoia dependencies -sequoia-deps-build: $(LOCAL)/lib/libssl.so $(LOCAL)/lib/libnettle.so - #------------------------------------------------------------------------------# # OpenSSL @@ -257,6 +252,43 @@ nettle-build: nettle/libnettle.so ## Install nettle nettle-install: $(LOCAL)/lib/libnettle.so +#------------------------------------------------------------------------------# +# BOTAN + +botan.src.stamp: ../downloads/Botan-$(BOTAN_VERSION).tar.xz + tar xvf $< + mv Botan-$(BOTAN_VERSION) botan + touch $@ + +botan/Makefile: botan.src.stamp + cd botan && \ + AR="$(AR)" CXX="$(CXX)" \ + ./configure.py --os=android --cc="clang" --cpu="$(BOTAN_ARCH)" --prefix="$(LOCAL)" + + + +botan/.libs/libbotan-2.so: botan/Makefile + $(MAKE) -C botan all + +$(LOCAL)/lib/libbotan-2.so: botan/.libs/libbotan-2.so + $(MAKE) -C botan install + ls -l $(LOCAL)/lib/libbotan-2.so + touch $@ + +## Build botan +botan-build: botan/.libs/libbotan-2.so + +## Install botan +botan-install: $(LOCAL)/lib/libbotan-2.so + +#------------------------------------------------------------------------------# +# Sequoia + +## Build sequoia dependencies +sequoia-deps-build: sequoia-deps-build-$(CRYPTO_LIB_NAME) +sequoia-deps-build-nettle: $(LOCAL)/lib/libssl.so $(LOCAL)/lib/libnettle.so +sequoia-deps-build-botan: $(LOCAL)/lib/libbotan-2.so + #------------------------------------------------------------------------------# # pEpEngineSequoiaBackend @@ -267,11 +299,11 @@ pEpEngineSequoiaBackend.src.stamp: ../downloads/pEpEngineSequoiaBackend.tar.gz mkdir -p pEpEngineSequoiaBackend cd pEpEngineSequoiaBackend && tar xvf ../$< mkdir -p $(LOCAL)/lib/ -# This is a bad fix, we should move this to a common makefile (but not the .conf one) find -L $(ANDROID_NDK) -name libunwind.a -execdir sh -c 'echo "INPUT(-lunwind)" > $(LOCAL)/lib/libgcc.a' \; touch $@ -$(CARGO_TARGET_DIR)/$(SEQUOIA_ARCH)/release/libpep_engine_sequoia_backend.a: pEpEngineSequoiaBackend.src.stamp $(LOCAL)/lib/libssl.so $(LOCAL)/lib/libnettle.so +$(CARGO_TARGET_DIR)/$(SEQUOIA_ARCH)/release/libpep_engine_sequoia_backend.a: pEpEngineSequoiaBackend.src.stamp sequoia-deps-build-$(CRYPTO_LIB_NAME) + cd pEpEngineSequoiaBackend && cargo update -p sequoia-openpgp --precise 1.14.0 cd pEpEngineSequoiaBackend && PATH=$(TEMP_WORK_PATH) \ CC="$(CC)" LD="$(LD)" AR="$(AR)" AS="$(AS)" RANLIB=$(RANLIB) STRIP="$(STRIP)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \ LD_LIBRARY_PATH=$(LOCAL)/lib/ \ @@ -280,7 +312,8 @@ $(CARGO_TARGET_DIR)/$(SEQUOIA_ARCH)/release/libpep_engine_sequoia_backend.a: pE ARMV7_LINUX_ANDROIDEABI_OPENSSL_LIB_DIR="$(LOCAL)/lib" \ ARMV7_LINUX_ANDROIDEABI_OPENSSL_INCLUDE_DIR="$(LOCAL)/include" \ ARMV7_LINUX_ANDROIDEABI_OPENSSL_DIR="$(LOCAL)/bin" \ - CARGO_TARGET_DIR=$(CARGO_TARGET_DIR) cargo build --target $(SEQUOIA_ARCH) -p pep_engine_sequoia_backend --release + RUSTFLAGS='-L $(LOCAL)/lib' \ + CARGO_TARGET_DIR=$(CARGO_TARGET_DIR) cargo build --no-default-features --features sequoia-openpgp/crypto-$(CRYPTO_LIB_NAME) --target $(SEQUOIA_ARCH) -p pep_engine_sequoia_backend --release $(LOCAL)/lib/libpep_engine_sequoia_backend.a: $(CARGO_TARGET_DIR)/$(SEQUOIA_ARCH)/release/libpep_engine_sequoia_backend.a cp $(CARGO_TARGET_DIR)/$(SEQUOIA_ARCH)/release/libpep_engine_sequoia_backend.* $(LOCAL)/lib/ @@ -288,7 +321,11 @@ $(LOCAL)/lib/libpep_engine_sequoia_backend.a: $(CARGO_TARGET_DIR)/$(SEQUOIA_ARCH pEpEngineSequoiaBackend-build: $(CARGO_TARGET_DIR)/$(SEQUOIA_ARCH)/release/libpep_engine_sequoia_backend.a -pEpEngineSequoiaBackend-install: $(LOCAL)/lib/libssl.so $(LOCAL)/lib/libnettle.so $(LOCAL)/lib/libpep_engine_sequoia_backend.a +pEpEngineSequoiaBackend-install: pEpEngineSequoiaBackend-install-$(CRYPTO_LIB_NAME) + +pEpEngineSequoiaBackend-install-nettle: $(LOCAL)/lib/libssl.so $(LOCAL)/lib/libnettle.so $(LOCAL)/lib/libpep_engine_sequoia_backend.a + +pEpEngineSequoiaBackend-install-botan: $(LOCAL)/lib/libbotan-2.so $(LOCAL)/lib/libpep_engine_sequoia_backend.a #------------------------------------------------------------------------------# # assets for Android app @@ -343,6 +380,7 @@ clean-all: clean libetpan-build \ uuid-build uuid-prebuild \ gmp-build gmp-install \ + botan-build botan-install \ sequoia-deps-build \ openssl-build openssl-install \ nettle-build nettle-install \ diff --git a/android/external/createMakefile.sh b/android/external/createMakefile.sh index 1f8e528..871c38f 100644 --- a/android/external/createMakefile.sh +++ b/android/external/createMakefile.sh @@ -18,6 +18,7 @@ case $ARCH_DEST in ARCH_DEBUG_CFLAGS=TARGET_x86_debug_CFLAGS OPENSSL_ARCHITECTURE=android-x86 SEQUOIA_ARCH=i686-linux-android + BOTAN_ARCH=x86 ;; x86_64) HOST=x86_64-linux-android @@ -26,6 +27,7 @@ case $ARCH_DEST in ARCH_DEBUG_CFLAGS=TARGET_x86_64_debug_CFLAGS OPENSSL_ARCHITECTURE=android-x86_64 SEQUOIA_ARCH=x86_64-linux-android + BOTAN_ARCH=x86_64 ;; armeabi-v7a) HOST=arm-linux-androideabi @@ -34,6 +36,7 @@ case $ARCH_DEST in ARCH_DEBUG_CFLAGS=TARGET_arm_debug_CFLAGS OPENSSL_ARCHITECTURE=android-arm SEQUOIA_ARCH=armv7-linux-androideabi + BOTAN_ARCH=arm32 ;; arm64-v8a) HOST=aarch64-linux-android @@ -43,6 +46,7 @@ case $ARCH_DEST in OPENSSL_ARCHITECTURE=android-arm64 GMP_MAKEFILE_EXTRA=' MPN_PATH=\"arm64 generic\"' SEQUOIA_ARCH=aarch64-linux-android + BOTAN_ARCH=arm64 ;; esac @@ -72,5 +76,6 @@ $SED -i 's/\[ARCH_DEBUG_CFLAGS\]/'"$ARCH_DEBUG_CFLAGS"'/g' "$FILE_DEST" $SED -i 's/\[OPENSSL_ARCHITECTURE\]/'"$OPENSSL_ARCHITECTURE"'/g' "$FILE_DEST" $SED -i 's/\[GMP_MAKEFILE_EXTRA\]/'"$GMP_MAKEFILE_EXTRA"'/g' "$FILE_DEST" $SED -i 's/\[SEQUOIA_ARCH\]/'"$SEQUOIA_ARCH"'/g' "$FILE_DEST" +$SED -i 's/\[BOTAN_ARCH\]/'"$BOTAN_ARCH"'/g' "$FILE_DEST" cat "$FILE_DEST" diff --git a/android/external/downloads/Makefile b/android/external/downloads/Makefile index 935a4ca..7278dbf 100644 --- a/android/external/downloads/Makefile +++ b/android/external/downloads/Makefile @@ -26,9 +26,15 @@ download-iconv: libiconv-1.15.tar.gz download-uuid: ossp-uuid_1.6.2.orig-patched.tar.gz ## Download sequoia dependencies -download-sequoia-deps: openssl-$(OPENSSL_VERSION).tar.gz gmp-$(GMP_VERSION).tar.bz2 \ + +download-sequoia-deps: download-sequoia-deps-$(CRYPTO_LIB_NAME) +#$(if $(findstring NETTLE,$(CRYPTO_LIB_NAME)), download-sequoia-deps-nettle, download-sequoia-deps-botan) + +download-sequoia-deps-nettle: openssl-$(OPENSSL_VERSION).tar.gz gmp-$(GMP_VERSION).tar.bz2 \ nettle-$(NETTLE_VERSION)-patched.tar.gz +download-sequoia-deps-botan: Botan-$(BOTAN_VERSION).tar.xz + ## Download etpan download-etpan: libetpan.git.stamp @@ -64,11 +70,15 @@ nettle-$(NETTLE_VERSION)-patched.tar.gz: nettle-$(NETTLE_VERSION).tar.gz tar -czvf $@ nettle-$(NETTLE_VERSION) rm -rf nettle-$(NETTLE_VERSION) +Botan-$(BOTAN_VERSION).tar.xz: + wget -nc https://botan.randombit.net/releases/Botan-$(BOTAN_VERSION).tar.xz + nettle-$(NETTLE_VERSION).tar.gz: wget -nc https://ftp.gnu.org/gnu/nettle/nettle-$(NETTLE_VERSION).tar.gz md5sum -c nettle-$(NETTLE_VERSION).tar.gz.md5 + #------------------------------------------------------------------------------# # Clone update and archive external projects GIT repos # Local clone is in external/$project.git while @@ -117,6 +127,7 @@ clean: -rm -rf *.stamp -rm -rf *.tar.gz -rm -rf *.tar.bz2 + -rm -rf *.tar.xz .PHONY: all clean download-iconv \ download-uuid download-etpan \ diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 6ba5fb3..f4beb92 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -4,6 +4,7 @@ ENGINE_PATH := $(LOCAL_PATH)/../../../pEpEngine LIB_PEP_ADAPTER_PATH:=$(SRC_PATH)/libpEpAdapter LIB_PEP_CXX11_PATH:=$(SRC_PATH)/libpEpCxx11 GPGBUILD:= $(LOCAL_PATH)/../external/output/ +include $(LOCAL_PATH)/../external/Makefile.conf include $(CLEAR_VARS) LOCAL_MODULE := libiconv @@ -14,22 +15,36 @@ include $(CLEAR_VARS) LOCAL_MODULE := libpep_engine_sequoia_backend LOCAL_SRC_FILES := $(GPGBUILD)/$(TARGET_ARCH_ABI)/lib/libpep_engine_sequoia_backend.a include $(PREBUILT_STATIC_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := libhogweed -LOCAL_SRC_FILES := $(GPGBUILD)/$(TARGET_ARCH_ABI)/lib/libhogweed.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := libgmp -LOCAL_SRC_FILES := $(GPGBUILD)/$(TARGET_ARCH_ABI)/lib/libgmp.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := libnettle -LOCAL_SRC_FILES := $(GPGBUILD)/$(TARGET_ARCH_ABI)/lib/libnettle.so -include $(PREBUILT_SHARED_LIBRARY) - +#Crypto lib switch, as we can use Sequoia with multiple crypto backends a switch to see which libs are loaded is required, we assume botan is the alternative, botan the 'default' temporarily, but having nothing defined will output an error +ifeq ($(CRYPTO_LIB_NAME), botan) + $(warning ==== JNIADAPTER android.mk using BOTAN for pEpEngineSequoiaBackend) + + include $(CLEAR_VARS) + LOCAL_MODULE := botan + LOCAL_SRC_FILES := $(GPGBUILD)/$(TARGET_ARCH_ABI)/lib/libbotan-2.a + include $(PREBUILT_STATIC_LIBRARY) + +else ifeq ($(CRYPTO_LIB_NAME), nettle) + $(warning ==== JNIADAPTER android.mk using NETTLE for pEpEngineSequoiaBackend) + include $(CLEAR_VARS) + LOCAL_MODULE := libhogweed + LOCAL_SRC_FILES := $(GPGBUILD)/$(TARGET_ARCH_ABI)/lib/libhogweed.so + include $(PREBUILT_SHARED_LIBRARY) + + include $(CLEAR_VARS) + LOCAL_MODULE := libgmp + LOCAL_SRC_FILES := $(GPGBUILD)/$(TARGET_ARCH_ABI)/lib/libgmp.so + include $(PREBUILT_SHARED_LIBRARY) + + include $(CLEAR_VARS) + LOCAL_MODULE := libnettle + LOCAL_SRC_FILES := $(GPGBUILD)/$(TARGET_ARCH_ABI)/lib/libnettle.so + include $(PREBUILT_SHARED_LIBRARY) + LOCAL_SHARED_LIBRARIES := libnettle libhogweed libgmp + +else + $(error No crypto backend given!) +endif include $(CLEAR_VARS) LOCAL_MODULE := libetpan @@ -44,19 +59,18 @@ $(shell sh $(ENGINE_PATH)/build-android/takeOutHeaderFiles.sh $(ENGINE_PATH)) include $(CLEAR_VARS) LOCAL_MODULE := pEpJNI -LOCAL_SHARED_LIBRARIES := libnettle libhogweed libgmp -LOCAL_STATIC_LIBRARIES := pEpEngine libetpan libuuid libiconv pEpAdapter pEpCxx11 libpep_engine_sequoia_backend +LOCAL_STATIC_LIBRARIES := pEpEngine libetpan libuuid libiconv pEpAdapter pEpCxx11 botan libpep_engine_sequoia_backend LOCAL_CPP_FEATURES += exceptions LOCAL_CPPFLAGS += -std=c++11 -DANDROID_STL=c++_shared -DHAVE_PTHREADS -DDISABLE_SYNC -fuse-ld=lld LOCAL_SRC_FILES := \ - ../../src/cxx/foundation_pEp_jniadapter_AbstractEngine.cc \ - ../../src/cxx/foundation_pEp_jniadapter_Engine.cc \ - ../../src/cxx/foundation_pEp_jniadapter_Message.cc \ - ../../src/cxx/foundation_pEp_jniadapter__Blob.cc \ - ../../src/cxx/throw_pEp_exception.cc \ - ../../src/cxx/basic_api.cc \ - ../../src/cxx/identity_api.cc \ - ../../src/cxx/jniutils.cc + ../../src/cxx/foundation_pEp_jniadapter_AbstractEngine.cc \ + ../../src/cxx/foundation_pEp_jniadapter_Engine.cc \ + ../../src/cxx/foundation_pEp_jniadapter_Message.cc \ + ../../src/cxx/foundation_pEp_jniadapter__Blob.cc \ + ../../src/cxx/throw_pEp_exception.cc \ + ../../src/cxx/basic_api.cc \ + ../../src/cxx/identity_api.cc \ + ../../src/cxx/jniutils.cc LOCAL_C_INCLUDES += $(GPGBUILD)/$(TARGET_ARCH_ABI)/include LOCAL_C_INCLUDES += $(LIB_PEP_ADAPTER_PATH)/build-android/include $(SRC_PATH)/libpEpAdapter diff --git a/android/src/foundation/pEp/jniadapter/AndroidHelper.java b/android/src/foundation/pEp/jniadapter/AndroidHelper.java index cba616f..8fa707e 100644 --- a/android/src/foundation/pEp/jniadapter/AndroidHelper.java +++ b/android/src/foundation/pEp/jniadapter/AndroidHelper.java @@ -126,9 +126,12 @@ public class AndroidHelper { public static void nativeSetup(Context c) { // pre-load libs for pepengine, as // android cannot solve lib dependencies on its own - System.loadLibrary("gmp"); - System.loadLibrary("nettle"); - System.loadLibrary("hogweed"); + if(BuildConfig.CRYPTO_BACK_END.equals("nettle")){ + System.loadLibrary("gmp"); + System.loadLibrary("nettle"); + System.loadLibrary("hogweed"); + + } migrateFromGPGToSequoiaIfNeeded(c.getFilesDir());