diff --git a/project/jni/openssl/.gitignore b/project/jni/openssl/.gitignore new file mode 100644 index 000000000..b78d50ccf --- /dev/null +++ b/project/jni/openssl/.gitignore @@ -0,0 +1,3 @@ +/build +/lib-* +/include diff --git a/project/jni/openssl/Android.mk b/project/jni/openssl/Android.mk new file mode 100644 index 000000000..a2d469eb7 --- /dev/null +++ b/project/jni/openssl/Android.mk @@ -0,0 +1,26 @@ +LOCAL_PATH:=$(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := $(notdir $(LOCAL_PATH)) + +ifneq (openssl,$(LOCAL_MODULE)) +ifneq ($(filter $(LOCAL_MODULE), $(APP_MODULES)),) + +LOCAL_MODULE_FILENAME := lib$(notdir $(LOCAL_PATH)).so.sdl.1 # It clashes with system libcrypto and libssl in Android 4.3 and older + +LOCAL_C_INCLUDES := $(LOCAL_PATH)/include +LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/lib$(LOCAL_MODULE).so.sdl.1.so +LOCAL_BUILT_MODULE := # This fixes a bug in NDK r10d + +# NDK is buggy meh +obj/local/$(TARGET_ARCH_ABI)/lib$(LOCAL_MODULE).so.sdl.1.so: $(LOCAL_PATH)/$(LOCAL_SRC_FILES) + cp -f $< $@ + +obj/local/$(TARGET_ARCH_ABI)/lib$(LOCAL_MODULE).so.sdl.0.so: obj/local/$(TARGET_ARCH_ABI)/lib$(LOCAL_MODULE).so.sdl.1.so + cp -f $< $@ + +include $(PREBUILT_SHARED_LIBRARY) + +endif +endif diff --git a/project/jni/openssl/compile.sh b/project/jni/openssl/compile.sh new file mode 100755 index 000000000..5693d128e --- /dev/null +++ b/project/jni/openssl/compile.sh @@ -0,0 +1,104 @@ +#!/bin/sh + +if [ -z "$ARCH_LIST" ] || [ "$ARCH_LIST" = "all" ]; then + ARCH_LIST="arm64-v8a armeabi-v7a x86_64 x86" +fi + +PARALLEL=false + +mkdir -p build + +build() { + ARCH=$1 + NO_ASM="" + + case $ARCH in + armeabi-v7a) + #NO_ASM="-DOPENSSL_NO_ASM=1" # Assembler in OpenSSL is broken when using clang + export CONFIGURE_ARCH=android-arm + ;; + x86) + export CONFIGURE_ARCH=android-x86 + ;; + arm64-v8a) + export CONFIGURE_ARCH=android-arm64 + ;; + x86_64) + #NO_ASM="-DOPENSSL_NO_ASM=1" # Assembler in OpenSSL is broken when using clang + export CONFIGURE_ARCH=android64-x86_64 # No-asm variant + ;; + *) + echo "Arch $ARCH not defined" + exit 1;; + esac + + rm -rf build/$ARCH + mkdir -p build/$ARCH + cd build/$ARCH + + tar -x -v -z -f ../../openssl-1.1.1j.tar.gz --strip=1 + patch -p1 < ../../config.patch || exit 1 + + env LDFLAGS="-shared -landroid -llog" \ + CFLAGS="$NO_ASM" \ + ../../setCrossEnvironment-$ARCH.sh \ + sh -c ' + ln -s $AR `basename -s -clang $CC`-ar + export PATH=`pwd`:`dirname $CC`:$PATH + export ANDROID_NDK_HOME=`dirname $CC`/.. + export CC=clang + export AR=ar + ./Configure shared zlib --prefix=`pwd`/dist --openssldir=. $CONFIGURE_ARCH -fPIC' \ + || exit 1 + + sed -i.old 's/^CNF_CPPFLAGS=.*/CNF_CPPFLAGS=/' Makefile + sed -i.old 's/^CNF_CFLAGS=.*/CNF_CFLAGS=/' Makefile + sed -i.old 's/^CNF_CXXFLAGS=.*/CNF_CXXFLAGS=/' Makefile + sed -i.old 's/^CNF_LDFLAGS=.*/CNF_LDFLAGS=/' Makefile + sed -i.old 's/^SHLIB_VERSION_NUMBER=.*/SHLIB_VERSION_NUMBER=sdl.1.so/' Makefile + if [ "$ARCH" = armeabi-v7a ]; then + sed -i.old 's/-DPOLY1305_ASM //' Makefile + sed -i.old 's@crypto/poly1305/poly1305-armv4.S @@' Makefile + sed -i.old 's@crypto/poly1305/poly1305-armv4.o @@' Makefile + fi + + env LDFLAGS="-shared -landroid -llog" \ + CFLAGS="$NO_ASM" \ + ../../setCrossEnvironment-$ARCH.sh \ + sh -c ' + export PATH=`pwd`:`dirname $CC`:$PATH + make -j8' \ + || exit 1 + + cd ../.. + + rm -rf lib/$ARCH + mkdir -p lib/$ARCH + cp build/$ARCH/libcrypto.so.sdl.1.so lib/${ARCH}/libcrypto.so.sdl.1.so || exit 1 + cp build/$ARCH/libssl.so.sdl.1.so lib/${ARCH}/libssl.so.sdl.1.so || exit 1 +} + + +if $PARALLEL; then + PIDS="" + for ARCH in $ARCH_LIST; do + build $ARCH & + PIDS="$PIDS $!" + done + + for PID in $PIDS; do + wait $PID || exit 1 + done +else + for ARCH in $ARCH_LIST; do + build $ARCH || exit 1 + done +fi + +FIRSTARCH=`echo $ARCH_LIST | sed 's/ .*//'` +rm -rf include +echo "cp -r -L build/$FIRSTARCH/include ./" +cp -r -L build/$FIRSTARCH/include ./ || exit 1 +patch -p1 < opensslconf.h.patch || exit 1 + +rm -rf build diff --git a/project/jni/openssl/config.patch b/project/jni/openssl/config.patch new file mode 100644 index 000000000..11edf61a0 --- /dev/null +++ b/project/jni/openssl/config.patch @@ -0,0 +1,20 @@ +diff -u -r armeabi-v7a-old/Configurations/15-android.conf armeabi-v7a/Configurations/15-android.conf +--- armeabi-v7a-old/Configurations/15-android.conf 2021-02-16 17:24:01.000000000 +0200 ++++ armeabi-v7a/Configurations/15-android.conf 2021-03-12 23:18:14.799128642 +0200 +@@ -8,12 +8,12 @@ + + my $android_ndk = {}; + my %triplet = ( +- arm => "arm-linux-androideabi", +- arm64 => "aarch64-linux-android", ++ arm => "armv7a-linux-androideabi19", ++ arm64 => "aarch64-linux-android21", + mips => "mipsel-linux-android", + mips64 => "mips64el-linux-android", +- x86 => "i686-linux-android", +- x86_64 => "x86_64-linux-android", ++ x86 => "i686-linux-android19", ++ x86_64 => "x86_64-linux-android21", + ); + + sub android_ndk { diff --git a/project/jni/openssl/openssl-1.1.1j.tar.gz b/project/jni/openssl/openssl-1.1.1j.tar.gz new file mode 100644 index 000000000..3ba723770 Binary files /dev/null and b/project/jni/openssl/openssl-1.1.1j.tar.gz differ diff --git a/project/jni/openssl/opensslconf.h.patch b/project/jni/openssl/opensslconf.h.patch new file mode 100644 index 000000000..abd11c236 --- /dev/null +++ b/project/jni/openssl/opensslconf.h.patch @@ -0,0 +1,37 @@ +diff -u -r arm64-v8a-old/include/crypto/bn_conf.h arm64-v8a/include/crypto/bn_conf.h +--- arm64-v8a-old/include/crypto/bn_conf.h 2021-03-12 23:45:55.475710837 +0200 ++++ arm64-v8a/include/crypto/bn_conf.h 2021-03-13 00:52:09.517668615 +0200 +@@ -21,8 +21,13 @@ + /* Should we define BN_DIV2W here? */ + + /* Only one for the following should be defined */ +-#define SIXTY_FOUR_BIT_LONG ++#undef SIXTY_FOUR_BIT_LONG + #undef SIXTY_FOUR_BIT + #undef THIRTY_TWO_BIT ++#ifdef __LP64__ ++#define SIXTY_FOUR_BIT_LONG ++#else ++#define THIRTY_TWO_BIT ++#endif + + #endif +diff -u -r arm64-v8a-old/include/openssl/opensslconf.h arm64-v8a/include/openssl/opensslconf.h +--- arm64-v8a-old/include/openssl/opensslconf.h 2021-03-12 23:45:55.475710837 +0200 ++++ arm64-v8a/include/openssl/opensslconf.h 2021-03-13 00:53:06.261987869 +0200 +@@ -188,9 +188,14 @@ + #if !defined(OPENSSL_SYS_UEFI) + # undef BN_LLONG + /* Only one for the following should be defined */ +-# define SIXTY_FOUR_BIT_LONG ++# undef SIXTY_FOUR_BIT_LONG + # undef SIXTY_FOUR_BIT + # undef THIRTY_TWO_BIT ++# ifdef __LP64__ ++# define SIXTY_FOUR_BIT_LONG ++# else ++# define THIRTY_TWO_BIT ++# endif + #endif + + #define RC4_INT unsigned char diff --git a/project/jni/openssl/setCrossEnvironment-arm64-v8a.sh b/project/jni/openssl/setCrossEnvironment-arm64-v8a.sh new file mode 100755 index 000000000..9c873d4f6 --- /dev/null +++ b/project/jni/openssl/setCrossEnvironment-arm64-v8a.sh @@ -0,0 +1,88 @@ +#!/bin/sh + +IFS=' +' + +NDK=`which ndk-build` +NDK=`dirname $NDK` + +if uname -s | grep -i "linux" > /dev/null ; then + MYARCH=linux-$(arch) + NDK=`readlink -f $NDK` +elif uname -s | grep -i "darwin" > /dev/null ; then + MYARCH=darwin-x86_64 +elif uname -s | grep -i "windows" > /dev/null ; then + MYARCH=windows-x86_64 +fi + +#echo NDK $NDK +[ -z "$NDK_TOOLCHAIN_VERSION" ] && NDK_TOOLCHAIN_VERSION=4.9 +LOCAL_PATH=`dirname $0` +if which realpath > /dev/null ; then + LOCAL_PATH=`realpath $LOCAL_PATH` +else + LOCAL_PATH=`cd $LOCAL_PATH && pwd` +fi +ARCH=arm64-v8a +GCCPREFIX=aarch64-linux-android +APILEVEL=21 + + +CFLAGS=" +-g +-ffunction-sections +-fdata-sections +-funwind-tables +-fstack-protector-strong +-no-canonical-prefixes +-Wformat +-Werror=format-security +-Oz +-DNDEBUG +-fPIC +$CFLAGS" + +CFLAGS="`echo $CFLAGS | tr '\n' ' '`" + +LDFLAGS=" +-fPIC +-g +-ffunction-sections +-fdata-sections +-Wl,--gc-sections +-funwind-tables +-fstack-protector-strong +-no-canonical-prefixes +-Oz +-Wl,--build-id +-Wl,--warn-shared-textrel +-Wl,--fatal-warnings +-Wl,--no-undefined +-Wl,-z,noexecstack +-Qunused-arguments +-Wl,-z,relro +-Wl,-z,now +-latomic +-lm +$LDFLAGS" + +LDFLAGS="`echo $LDFLAGS | tr '\n' ' '`" + +CC="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/$GCCPREFIX$APILEVEL-clang" +CXX="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/$GCCPREFIX$APILEVEL-clang++" +CPP="$CC -E $CFLAGS" + +env \ +CFLAGS="$CFLAGS" \ +CXXFLAGS="$CXXFLAGS $CFLAGS -frtti -fexceptions" \ +LDFLAGS="$LDFLAGS" \ +CC="$CC" \ +CXX="$CXX" \ +RANLIB="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/llvm-ranlib" \ +LD="$CXX" \ +AR="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/llvm-ar" \ +CPP="$CPP" \ +NM="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/llvm-nm" \ +AS="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/$GCCPREFIX-as" \ +STRIP="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/llvm-strip" \ +"$@" diff --git a/project/jni/openssl/setCrossEnvironment-armeabi-v7a.sh b/project/jni/openssl/setCrossEnvironment-armeabi-v7a.sh new file mode 100755 index 000000000..f54f6f47b --- /dev/null +++ b/project/jni/openssl/setCrossEnvironment-armeabi-v7a.sh @@ -0,0 +1,95 @@ +#!/bin/sh + +IFS=' +' + +NDK=`which ndk-build` +NDK=`dirname $NDK` + +if uname -s | grep -i "linux" > /dev/null ; then + MYARCH=linux-$(arch) + NDK=`readlink -f $NDK` +elif uname -s | grep -i "darwin" > /dev/null ; then + MYARCH=darwin-x86_64 +elif uname -s | grep -i "windows" > /dev/null ; then + MYARCH=windows-x86_64 +fi + +#echo NDK $NDK +[ -z "$NDK_TOOLCHAIN_VERSION" ] && NDK_TOOLCHAIN_VERSION=4.9 +LOCAL_PATH=`dirname $0` +if which realpath > /dev/null ; then + LOCAL_PATH=`realpath $LOCAL_PATH` +else + LOCAL_PATH=`cd $LOCAL_PATH && pwd` +fi +ARCH=armeabi-v7a +GCCPREFIX=armv7a-linux-androideabi +BINUTILSPREFIX=arm-linux-androideabi +APILEVEL=19 + + +CFLAGS=" +-g +-ffunction-sections +-fdata-sections +-funwind-tables +-fstack-protector-strong +-no-canonical-prefixes +-mthumb +-Wformat +-Werror=format-security +-Oz +-DNDEBUG +-fPIC +$CFLAGS" + +CFLAGS="`echo $CFLAGS | tr '\n' ' '`" + +LDFLAGS=" +-fPIC +-g +-ffunction-sections +-fdata-sections +-Wl,--gc-sections +-funwind-tables +-fstack-protector-strong +-no-canonical-prefixes +-mthumb +-Wformat +-Werror=format-security +-Oz +-DNDEBUG +-Wl,--build-id +-Wl,--warn-shared-textrel +-Wl,--fatal-warnings +-Wl,--no-undefined +-Wl,-z,noexecstack +-Qunused-arguments +-Wl,-z,relro +-Wl,-z,now +-latomic +-lm +-ldl +$LDFLAGS" + +LDFLAGS="`echo $LDFLAGS | tr '\n' ' '`" + +CC="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/$GCCPREFIX$APILEVEL-clang" +CXX="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/$GCCPREFIX$APILEVEL-clang++" +CPP="$CC -E $CFLAGS" + +env \ +CFLAGS="$CFLAGS" \ +CXXFLAGS="$CXXFLAGS $CFLAGS -frtti -fexceptions" \ +LDFLAGS="$LDFLAGS" \ +CC="$CC" \ +CXX="$CXX" \ +RANLIB="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/llvm-ranlib" \ +LD="$CXX" \ +AR="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/llvm-ar" \ +CPP="$CPP" \ +NM="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/llvm-nm" \ +AS="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/$BINUTILSPREFIX-as" \ +STRIP="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/llvm-strip" \ +"$@" diff --git a/project/jni/openssl/setCrossEnvironment-x86.sh b/project/jni/openssl/setCrossEnvironment-x86.sh new file mode 100755 index 000000000..685d6bc89 --- /dev/null +++ b/project/jni/openssl/setCrossEnvironment-x86.sh @@ -0,0 +1,92 @@ +#!/bin/sh + +IFS=' +' + +NDK=`which ndk-build` +NDK=`dirname $NDK` + +if uname -s | grep -i "linux" > /dev/null ; then + MYARCH=linux-$(arch) + NDK=`readlink -f $NDK` +elif uname -s | grep -i "darwin" > /dev/null ; then + MYARCH=darwin-x86_64 +elif uname -s | grep -i "windows" > /dev/null ; then + MYARCH=windows-x86_64 +fi + +#echo NDK $NDK +[ -z "$NDK_TOOLCHAIN_VERSION" ] && NDK_TOOLCHAIN_VERSION=4.9 +LOCAL_PATH=`dirname $0` +if which realpath > /dev/null ; then + LOCAL_PATH=`realpath $LOCAL_PATH` +else + LOCAL_PATH=`cd $LOCAL_PATH && pwd` +fi +ARCH=x86 +GCCPREFIX=i686-linux-android +APILEVEL=19 + + +CFLAGS=" +-g +-ffunction-sections +-funwind-tables +-fdata-sections +-fstack-protector-strong +-no-canonical-prefixes +-Wformat +-Werror=format-security +-Oz +-DNDEBUG +-fPIC +$CFLAGS" + +CFLAGS="`echo $CFLAGS | tr '\n' ' '`" + +LDFLAGS=" +-fPIC +-g +-ffunction-sections +-fdata-sections +-Wl,--gc-sections +-funwind-tables +-fstack-protector-strong +-no-canonical-prefixes +-Wformat +-Werror=format-security +-Oz +-DNDEBUG +-Wl,--build-id +-Wl,--warn-shared-textrel +-Wl,--fatal-warnings +-Wl,--no-undefined +-Wl,-z,noexecstack +-Qunused-arguments +-Wl,-z,relro +-Wl,-z,now +-latomic +-lm +$LDFLAGS +" + +LDFLAGS="`echo $LDFLAGS | tr '\n' ' '`" + +CC="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/$GCCPREFIX$APILEVEL-clang" +CXX="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/$GCCPREFIX$APILEVEL-clang++" +CPP="$CC -E $CFLAGS" + +env \ +CFLAGS="$CFLAGS" \ +CXXFLAGS="$CXXFLAGS $CFLAGS -frtti -fexceptions" \ +LDFLAGS="$LDFLAGS" \ +CC="$CC" \ +CXX="$CXX" \ +RANLIB="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/llvm-ranlib" \ +LD="$CXX" \ +AR="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/llvm-ar" \ +CPP="$CPP" \ +NM="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/llvm-nm" \ +AS="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/$GCCPREFIX-as" \ +STRIP="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/llvm-strip" \ +"$@" diff --git a/project/jni/openssl/setCrossEnvironment-x86_64.sh b/project/jni/openssl/setCrossEnvironment-x86_64.sh new file mode 100755 index 000000000..54edc61e5 --- /dev/null +++ b/project/jni/openssl/setCrossEnvironment-x86_64.sh @@ -0,0 +1,92 @@ +#!/bin/sh + +IFS=' +' + +NDK=`which ndk-build` +NDK=`dirname $NDK` + +if uname -s | grep -i "linux" > /dev/null ; then + MYARCH=linux-$(arch) + NDK=`readlink -f $NDK` +elif uname -s | grep -i "darwin" > /dev/null ; then + MYARCH=darwin-x86_64 +elif uname -s | grep -i "windows" > /dev/null ; then + MYARCH=windows-x86_64 +fi + +#echo NDK $NDK +[ -z "$NDK_TOOLCHAIN_VERSION" ] && NDK_TOOLCHAIN_VERSION=4.9 +LOCAL_PATH=`dirname $0` +if which realpath > /dev/null ; then + LOCAL_PATH=`realpath $LOCAL_PATH` +else + LOCAL_PATH=`cd $LOCAL_PATH && pwd` +fi +ARCH=x86_64 +GCCPREFIX=x86_64-linux-android +APILEVEL=21 + + +CFLAGS=" +-g +-ffunction-sections +-fdata-sections +-funwind-tables +-fstack-protector-strong +-no-canonical-prefixes +-Wformat +-Werror=format-security +-Oz +-DNDEBUG +-fPIC +$CFLAGS" + +CFLAGS="`echo $CFLAGS | tr '\n' ' '`" + +LDFLAGS=" +-fPIC +-g +-ffunction-sections +-fdata-sections +-Wl,--gc-sections +-funwind-tables +-fstack-protector-strong +-no-canonical-prefixes +-Wformat +-Werror=format-security +-Oz +-DNDEBUG +-Wl,--build-id +-Wl,--warn-shared-textrel +-Wl,--fatal-warnings +-Wl,--no-undefined +-Wl,-z,noexecstack +-Qunused-arguments +-Wl,-z,relro +-Wl,-z,now +-latomic +-lm +$LDFLAGS +" + +LDFLAGS="`echo $LDFLAGS | tr '\n' ' '`" + +CC="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/$GCCPREFIX$APILEVEL-clang" +CXX="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/$GCCPREFIX$APILEVEL-clang++" +CPP="$CC -E $CFLAGS" + +env \ +CFLAGS="$CFLAGS" \ +CXXFLAGS="$CXXFLAGS $CFLAGS -frtti -fexceptions" \ +LDFLAGS="$LDFLAGS" \ +CC="$CC" \ +CXX="$CXX" \ +RANLIB="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/llvm-ranlib" \ +LD="$CXX" \ +AR="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/llvm-ar" \ +CPP="$CPP" \ +NM="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/llvm-nm" \ +AS="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/$GCCPREFIX-as" \ +STRIP="$NDK/toolchains/llvm/prebuilt/$MYARCH/bin/llvm-strip" \ +"$@"