Browse Source

Added support for botan & nettle switching on the android build

Changing the variable CRYPTO_LIB will either use nettle or botan (anything else will crash).

Additionally the threads to use has been returned and will be fixed.
pull/46/head
Sascha Bacardit 2 years ago
parent
commit
4ea6a5e176
  1. 2
      .gitignore
  2. 22
      android/build.gradle
  3. 9
      android/external/Makefile.conf
  4. 58
      android/external/MakefileTemplate
  5. 5
      android/external/createMakefile.sh
  6. 13
      android/external/downloads/Makefile
  7. 18
      android/jni/Android.mk
  8. 3
      android/src/foundation/pEp/jniadapter/AndroidHelper.java

2
.gitignore

@ -84,7 +84,7 @@ androidTests/gradle/wrapper/gradle-wrapper.properties
androidTests/gradlew
androidTests/gradlew.bat
org.tar.gz
*.tar.xz
*.iml
android/external/[?]*

22
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}"
}
}
}

9
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

58
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 \

5
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"

13
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 \

18
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,7 +15,17 @@ 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)
#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
@ -29,7 +40,11 @@ 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,8 +59,7 @@ $(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 := \

3
android/src/foundation/pEp/jniadapter/AndroidHelper.java

@ -126,10 +126,13 @@ public class AndroidHelper {
public static void nativeSetup(Context c) {
// pre-load libs for pepengine, as
// android cannot solve lib dependencies on its own
if(BuildConfig.CRYPTO_BACK_END.equals("nettle")){
System.loadLibrary("gmp");
System.loadLibrary("nettle");
System.loadLibrary("hogweed");
}
migrateFromGPGToSequoiaIfNeeded(c.getFilesDir());
}

Loading…
Cancel
Save