aboutsummaryrefslogtreecommitdiff
path: root/standalone/src
diff options
context:
space:
mode:
authorJán Jančár2024-08-17 16:38:39 +0200
committerGitHub2024-08-17 16:38:39 +0200
commit2b5a0e4222e3a5e788f82dcce649cc73002f09bd (patch)
treeec971ed78025b4c4faf80929e6490e2826f5d3c6 /standalone/src
parent65ddb496e2090581e40bce003f6c14490e6cf5fb (diff)
parent8d54fae02136eea7706d3b1d8b3547a61df7bd19 (diff)
downloadECTester-2b5a0e4222e3a5e788f82dcce649cc73002f09bd.tar.gz
ECTester-2b5a0e4222e3a5e788f82dcce649cc73002f09bd.tar.zst
ECTester-2b5a0e4222e3a5e788f82dcce649cc73002f09bd.zip
Merge pull request #29 from quapka/build-with-nix
Build with Nix. Finally!
Diffstat (limited to 'standalone/src')
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/BotanLib.java2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/CryptoppLib.java2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/GcryptLib.java2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/NativeECLibrary.java24
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/OpensslLib.java2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/TomcryptLib.java2
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile65
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile.ext241
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/boringssl.c3
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_utils.h12
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_utils.hpp11
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp15
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/mbedtls.c58
14 files changed, 364 insertions, 77 deletions
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/BotanLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/BotanLib.java
index c072e84..d3691df 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/BotanLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/BotanLib.java
@@ -9,7 +9,7 @@ import java.util.Set;
public class BotanLib extends NativeECLibrary {
public BotanLib() {
- super("Botan", "botan_provider", "botan-2");
+ super("Botan", "botan_provider");
}
@Override
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/CryptoppLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/CryptoppLib.java
index 25f2de4..4449f99 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/CryptoppLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/CryptoppLib.java
@@ -9,7 +9,7 @@ import java.util.Set;
public class CryptoppLib extends NativeECLibrary {
public CryptoppLib() {
- super("Crypto++","cryptopp_provider", "cryptopp");
+ super("Crypto++","cryptopp_provider");
}
@Override
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/GcryptLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/GcryptLib.java
index d1452a9..3647ab9 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/GcryptLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/GcryptLib.java
@@ -9,7 +9,7 @@ import java.util.Set;
public class GcryptLib extends NativeECLibrary {
public GcryptLib() {
- super("libgcrypt","gcrypt_provider", "gcrypt", "gpg-error");
+ super("libgcrypt","gcrypt_provider");
}
@Override
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NativeECLibrary.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NativeECLibrary.java
index fb4e430..210a6e9 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NativeECLibrary.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NativeECLibrary.java
@@ -38,25 +38,13 @@ public abstract class NativeECLibrary extends ProviderECLibrary {
return false;
}
- /* Load the requirements, if they are bundled, write them in and load them. */
- try {
- for (String requirement : requriements) {
- if (requirement.endsWith(suffix)) {
- /* The requirement is bundled, write it */
- Path reqPath = libReqDir.resolve(requirement);
- found = FileUtil.write(ECTesterStandalone.LIB_RESOURCE_DIR + requirement, reqPath);
- if (!found) {
- return false;
- }
- System.load(reqPath.toString());
- } else {
- System.loadLibrary(requirement);
- }
+ /* Load the requirements, if they are bundled, write them in. */
+ for (String requirement : requriements) {
+ if (requirement.endsWith(suffix)) {
+ /* The requirement is bundled, write it */
+ Path reqPath = libReqDir.resolve(requirement);
+ FileUtil.write(ECTesterStandalone.LIB_RESOURCE_DIR + requirement, reqPath);
}
- } catch (UnsatisfiedLinkError ule) {
- System.err.println(resource);
- ule.printStackTrace();
- return false;
}
System.load(libPath.toString());
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java
index aa90c38..ea9cca3 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java
@@ -18,7 +18,7 @@ import java.util.Set;
public class NettleLib extends NativeECLibrary {
public NettleLib() {
- super("Nettle", "nettle_provider", "nettle","hogweed", "gmp");
+ super("Nettle", "nettle_provider");
}
@Override
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/OpensslLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/OpensslLib.java
index 69c84bc..036739c 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/OpensslLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/OpensslLib.java
@@ -8,7 +8,7 @@ import java.util.Set;
*/
public class OpensslLib extends NativeECLibrary {
public OpensslLib() {
- super("OpenSSL", "openssl_provider", "crypto");
+ super("OpenSSL", "openssl_provider");
}
@Override
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/TomcryptLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/TomcryptLib.java
index e499451..f1fac47 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/TomcryptLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/TomcryptLib.java
@@ -9,7 +9,7 @@ import java.util.Set;
public class TomcryptLib extends NativeECLibrary {
public TomcryptLib() {
- super("tomcrypt","tomcrypt_provider", "tommath", "tomcrypt");
+ super("tomcrypt","tomcrypt_provider");
}
@Override
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile
index f947c78..1393f82 100644
--- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile
@@ -99,57 +99,59 @@ clibs: lib_timing.so lib_csignals.so lib_preload.so lib_prng.so
cpplibs: lib_timing.so lib_cppsignals.so lib_preload.so lib_prng.so
+
# OpenSSL shim
openssl: openssl_provider.so
openssl_provider.so: openssl.o c_utils.o | clibs
- $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs openssl) -l:lib_timing.so -l:lib_csignals.so
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -Wl,-Bstatic $(shell pkg-config --libs libcrypto) -lcrypto -L. -Wl,-Bdynamic -l:lib_timing.so -l:lib_csignals.so
openssl.o: openssl.c
- $(CC) $(shell pkg-config --cflags openssl) $(CFLAGS) -c $<
+ $(CC) $(shell pkg-config --cflags openssl) $(OPENSSL_CFLAGS) $(CFLAGS) -c $<
# BoringSSL shim
boringssl: boringssl_provider.so
-lib_boringssl.so:
- cp $(PROJECT_ROOT_PATH)/ext/boringssl/build/crypto/libcrypto.so lib_boringssl.so
-
-boringssl_provider.so: boringssl.o c_utils.o | clibs lib_boringssl.so
- $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_boringssl.so -l:lib_timing.so -l:lib_csignals.so
+boringssl_provider.so: boringssl.o c_utils.o | clibs
+ $(CC) $(CFLAGS) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -Wl,-Bstatic -l:lib_boringssl.a -Wl,-Bdynamic -l:lib_timing.so -l:lib_csignals.so
boringssl.o: boringssl.c
- $(CC) -I$(PROJECT_ROOT_PATH)/ext/boringssl/include/ $(CFLAGS) -c $<
+ $(CC) $(BORINGSSL_CFLAGS) $(CFLAGS) -c $<
# libgcrypt shim
gcrypt: gcrypt_provider.so
gcrypt_provider.so: gcrypt.o c_utils.o | clibs
- $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -pthread -lpthread $(shell libgcrypt-config --libs) -l:lib_timing.so -l:lib_csignals.so
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -pthread -lpthread -Wl,-Bstatic $(shell libgcrypt-config --libs) -Wl,-Bdynamic -l:lib_timing.so -l:lib_csignals.so
gcrypt.o: gcrypt.c
- $(CC) $(shell libgcrypt-config --cflags) $(CFLAGS) -c $<
+ $(CC) $(shell libgcrypt-config --cflags) $(LIBGCRYPT_CFLAGS) $(CFLAGS) -c $<
# Libtomcrypt shim
tomcrypt: tomcrypt_provider.so
tomcrypt_provider.so: tomcrypt.o c_utils.o | clibs
- $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -ltommath $(shell pkg-config --libs libtomcrypt) -l:lib_timing.so -l:lib_csignals.so
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -Wl,-Bstatic $(shell pkg-config --libs libtomcrypt libtommath) -Wl,-Bdynamic -l:lib_timing.so -l:lib_csignals.so
tomcrypt.o: tomcrypt.c
$(CC) -DLTM_DESC $(shell pkg-config --cflags libtomcrypt) $(CFLAGS) -c $<
# Botan-2 shim
+BOTAN_NAME := "botan-2"
+ifeq ($(shell pkg-config --exists $(BOTAN_NAME); echo $$?),1)
+ BOTAN_NAME := "botan-3"
+endif
botan: botan_provider.so
botan_provider.so: botan.o cpp_utils.o | cpplibs
- $(CXX) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs botan-2) -l:lib_timing.so -l:lib_cppsignals.so
+ $(CXX) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -Wl,-Bstatic $(shell pkg-config --libs $(BOTAN_NAME)) -Wl,-Bdynamic -l:lib_timing.so -l:lib_cppsignals.so
botan.o: botan.cpp
- $(CXX) $(shell pkg-config --cflags botan-2) $(CXXFLAGS) -c $<
+ $(CXX) $(shell pkg-config --cflags $(BOTAN_NAME)) $(BOTAN_CXXFLAGS) $(CXXFLAGS) -c $<
# Crypto++ shim
@@ -160,60 +162,51 @@ endif
cryptopp: cryptopp_provider.so
cryptopp_provider.so: cryptopp.o cpp_utils.o | cpplibs
- $(CXX) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs $(CRYPTOPP_NAME)) -l:lib_timing.so -l:lib_cppsignals.so
+ $(CXX) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -Wl,-Bstatic $(shell pkg-config --libs $(CRYPTOPP_NAME)) -Wl,-Bdynamic -l:lib_timing.so -l:lib_cppsignals.so
cryptopp.o: cryptopp.cpp
- $(CXX) $(shell pkg-config --cflags $(CRYPTOPP_NAME)) $(CXXFLAGS) -c $<
+ $(CXX) $(shell pkg-config --cflags $(CRYPTOPP_NAME)) $(CRYPTOPP_CXXFLAGS) $(CXXFLAGS) -c $<
# mbedTLS shim
mbedtls: mbedtls_provider.so
-lib_mbedtls.so:
- cp $(PROJECT_ROOT_PATH)/ext/mbedtls/build/library/libmbedcrypto.so lib_mbedtls.so
-
-mbedtls_provider.so: mbedtls.o c_utils.o | clibs lib_mbedtls.so
- $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_mbedtls.so -l:lib_timing.so -l:lib_csignals.so
+mbedtls_provider.so: mbedtls.o c_utils.o | clibs
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -Wl,-Bstatic -lmbedcrypto -Wl,-Bdynamic -l:lib_timing.so -l:lib_csignals.so
mbedtls.o: mbedtls.c
- $(CC) -I$(PROJECT_ROOT_PATH)/ext/mbedtls/build/include/ $(CFLAGS) -c $<
+ $(CC) $(MBEDTLS_CFLAGS) $(CFLAGS) -c $<
# Intel Performance Primitives crypto shim
ippcp: ippcp_provider.so
-lib_ippcp.so:
- cp $(PROJECT_ROOT_PATH)/ext/ipp-crypto/build/.build/RELEASE/lib/libippcp.so lib_ippcp.so
-
-ippcp_provider.so: ippcp.o c_utils.o | clibs lib_ippcp.so
- $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_ippcp.so -l:lib_timing.so -l:lib_csignals.so
+ippcp_provider.so: ippcp.o c_utils.o | clibs
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ $(IPP_CRYPTO_LFLAGS) -Wl,-Bstatic -l:libippcp.a -L. -Wl,-Bdynamic -l:lib_timing.so -l:lib_csignals.so
ippcp.o: ippcp.c
- $(CC) -I$(PROJECT_ROOT_PATH)/ext/ipp-crypto/build/.build/RELEASE/include/ $(CFLAGS) -c $<
+ $(CC) $(IPP_CRYPTO_CFLAGS) $(CFLAGS) -c $<
# Nettle shim
nettle: nettle_provider.so
nettle_provider.so: nettle.o c_utils.o | clibs
- $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs nettle) -l:lib_timing.so -l:lib_csignals.so $(shell pkg-config --libs hogweed) -lgmp
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -Wl,-Bstatic $(shell pkg-config --libs nettle hogweed gmp) \
+ -Wl,-Bdynamic -l:lib_timing.so -l:lib_csignals.so
nettle.o: nettle.c
- $(CC) $(shell pkg-config --cflags nettle) $(shell pkg-config --libs hogweed) -lgmp $(CFLAGS) -c $<
+ $(CC) -Wl,-static $(shell pkg-config --cflags nettle hogweed gmp) $(NETTLE_CFLAGS) $(CFLAGS) -c $<
# LibreSSL shim
libressl: libressl_provider.so
-lib_libressl.so:
- cp $(PROJECT_ROOT_PATH)/ext/libressl/build/crypto/libcrypto.so lib_libressl.so
-
-libressl_provider.so: libressl.o c_utils.o | clibs lib_libressl.so
- $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_libressl.so -l:lib_timing.so -l:lib_csignals.so
+libressl_provider.so: libressl.o c_utils.o | clibs
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -Wl,-Bstatic $(shell pkg-config --libs libresslcrypto) -Wl,-Bdynamic -l:lib_timing.so -l:lib_csignals.so
libressl.o: libressl.c
- $(CC) -I$(PROJECT_ROOT_PATH)/ext/libressl/build/include/ $(CFLAGS) -c $<
-
+ $(CC) $(shell pkg-config --cflags libresslcrypto) $(LIBRESSL_CFLAGS) $(CFLAGS) -c $<
help:
@echo "# This makefile builds the JNI shims necessary to test native libraries."
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile.ext b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile.ext
new file mode 100644
index 0000000..948988b
--- /dev/null
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile.ext
@@ -0,0 +1,241 @@
+###############################################################################
+## General CC setup.
+
+CC?=gcc
+CXX?=g++
+
+LFLAGS+=-fPIC -shared -L "$(JNI_LIBDIR)" -L "$(JNI_LIBDIR)/server" #-ljsig -ljvm
+CFLAGS+=-fPIC -I"$(JNI_INCLUDEDIR)" -I"$(JNI_PLATFORMINCLUDEDIR)" -I. -Wno-deprecated-declarations
+CXXFLAGS+=-fPIC -I"$(JNI_INCLUDEDIR)" -I"$(JNI_PLATFORMINCLUDEDIR)" -I. -Wno-deprecated-declarations
+
+DEBUG ?= 0
+PROJECT_ROOT_PATH ?= ../../../../../../../../../..
+
+ifeq ($(DEBUG), 1)
+ CFLAGS+=-g -O0 -Wall
+ LFLAGS+=-g
+ CXXFLAGS+=-g -O0 -Wall
+else
+ CFLAGS+=-O2
+ LFLAGS+=-O2
+ CXXFLAGS+=-O2
+endif
+
+###############################################################################
+## Java JNI setup.
+
+ifeq ($(JAVA_HOME),)
+ ifeq ($(OS),Windows_NT)
+ which = $(shell where $1)
+ else
+ which = $(shell which $1)
+ endif
+ JAVAC ?= $(realpath $(call which,javac))
+ JAVA_HOME = $(abspath $(dir $(JAVAC))..)
+endif
+
+ifneq ($(JAVA_HOME),)
+ JNI_INCLUDEDIR ?= $(JAVA_HOME)/include
+ JNI_LIBDIR ?= $(JAVA_HOME)/lib
+endif
+
+ifeq ($(JNI_INCLUDEDIR),)
+ $(error "Could not determine JNI include dir. Try specifying either JAVA_HOME or JNI_INCLUDEDIR.")
+endif
+
+ifeq ($(JNI_LIBDIR),)
+ $(error "Could not determine JNI lib dir. Try specifying either JAVA_HOME or JNI_LIBDIR.")
+endif
+
+TARGETTRIPLET := $(shell $(CC) -dumpmachine)
+
+ifeq ($(JNI_PLATFORM),)
+ ifeq ($(findstring mingw,$(TARGETTRIPLET)),mingw)
+ JNI_PLATFORM:= win32
+ else
+ ifeq ($(findstring linux,$(TARGETTRIPLET)),linux)
+ JNI_PLATFORM:= linux
+ endif
+ endif
+endif
+
+JNI_PLATFORMINCLUDEDIR ?= $(JNI_INCLUDEDIR)/$(JNI_PLATFORM)
+
+###############################################################################
+## Targets.
+
+all: tomcrypt botan cryptopp openssl boringssl gcrypt mbedtls ippcp nettle libressl
+
+# Common utils
+c_utils.o: c_utils.c
+ $(CC) $(CFLAGS) -c $<
+
+lib_timing.so: c_timing.c
+ $(CC) -o $@ -shared $(CFLAGS) -Wl,-soname,lib_timing.so $<
+
+prng.o: prng/prng.c
+ $(CC) $(CFLAGS) -c $<
+
+lib_prng.so: c_prng.c
+ $(CC) -o $@ -shared -Wl,-soname,lib_prng.so $(CFLAGS) $<
+
+c_preload.o: c_preload.c
+ $(CC) $(CFLAGS) -c $<
+
+lib_preload.so: c_preload.o prng.o
+ $(CC) -o $@ -shared $(CFLAGS) -ldl -Wl,-soname,lib_preload.so $^
+
+lib_csignals.so: c_signals.c
+ $(CC) -o $@ -shared $(CFLAGS) -pthread -lpthread -Wl,-soname,lib_csignals.so $<
+
+lib_cppsignals.so: cpp_signals.cpp
+ $(CC) -o $@ -shared $(CFLAGS) -pthread -lpthread -Wl,-soname,lib_cppsignals.so $<
+
+cpp_utils.o: cpp_utils.cpp
+ $(CXX) $(CXXFLAGS) -c $<
+
+
+clibs: lib_timing.so lib_csignals.so lib_preload.so lib_prng.so
+
+cpplibs: lib_timing.so lib_cppsignals.so lib_preload.so lib_prng.so
+
+# OpenSSL shim
+openssl: openssl_provider.so
+
+openssl_provider.so: openssl.o c_utils.o | clibs
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs openssl) -l:lib_timing.so -l:lib_csignals.so
+
+openssl.o: openssl.c
+ $(CC) $(shell pkg-config --cflags openssl) $(CFLAGS) -c $<
+
+
+# BoringSSL shim
+boringssl: boringssl_provider.so
+
+lib_boringssl.so:
+ cp $(PROJECT_ROOT_PATH)/ext/boringssl/build/crypto/libcrypto.so lib_boringssl.so
+ patchelf --set-soname lib_boringssl.so lib_boringssl.so
+
+boringssl_provider.so: boringssl.o c_utils.o | clibs lib_boringssl.so
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_boringssl.so -l:lib_timing.so -l:lib_csignals.so
+
+boringssl.o: boringssl.c
+ $(CC) -I$(PROJECT_ROOT_PATH)/ext/boringssl/include/ $(CFLAGS) -c $<
+
+
+# libgcrypt shim
+gcrypt: gcrypt_provider.so
+
+gcrypt_provider.so: gcrypt.o c_utils.o | clibs
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -pthread -lpthread $(shell libgcrypt-config --libs) -l:lib_timing.so -l:lib_csignals.so
+
+gcrypt.o: gcrypt.c
+ $(CC) $(shell libgcrypt-config --cflags) $(CFLAGS) -c $<
+
+
+# Libtomcrypt shim
+tomcrypt: tomcrypt_provider.so
+
+tomcrypt_provider.so: tomcrypt.o c_utils.o | clibs
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -ltommath $(shell pkg-config --libs libtomcrypt) -l:lib_timing.so -l:lib_csignals.so
+
+tomcrypt.o: tomcrypt.c
+ $(CC) -DLTM_DESC $(shell pkg-config --cflags libtomcrypt) $(CFLAGS) -c $<
+
+
+# Botan-2 shim
+botan: botan_provider.so
+
+botan_provider.so: botan.o cpp_utils.o | cpplibs
+ $(CXX) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs botan-2) -l:lib_timing.so -l:lib_cppsignals.so
+
+botan.o: botan.cpp
+ $(CXX) $(shell pkg-config --cflags botan-2) $(CXXFLAGS) -c $<
+
+
+# Crypto++ shim
+CRYPTOPP_NAME := "libcrypto++"
+ifeq ($(shell pkg-config --exists $(CRYPTOPP_NAME); echo $$?),1)
+ CRYPTOPP_NAME := "libcryptopp"
+endif
+cryptopp: cryptopp_provider.so
+
+cryptopp_provider.so: cryptopp.o cpp_utils.o | cpplibs
+ $(CXX) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs $(CRYPTOPP_NAME)) -l:lib_timing.so -l:lib_cppsignals.so
+
+cryptopp.o: cryptopp.cpp
+ $(CXX) $(shell pkg-config --cflags $(CRYPTOPP_NAME)) $(CXXFLAGS) -c $<
+
+
+# mbedTLS shim
+mbedtls: mbedtls_provider.so
+
+lib_mbedtls.so:
+ cp $(PROJECT_ROOT_PATH)/ext/mbedtls/build/library/libmbedcrypto.so lib_mbedtls.so
+ patchelf --set-soname lib_mbedtls.so lib_mbedtls.so
+
+mbedtls_provider.so: mbedtls.o c_utils.o | clibs lib_mbedtls.so
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_mbedtls.so -l:lib_timing.so -l:lib_csignals.so
+
+mbedtls.o: mbedtls.c
+ $(CC) -I$(PROJECT_ROOT_PATH)/ext/mbedtls/build/include/ $(CFLAGS) -c $<
+
+
+# Intel Performance Primitives crypto shim
+ippcp: ippcp_provider.so
+
+lib_ippcp.so:
+ cp $(PROJECT_ROOT_PATH)/ext/ipp-crypto/build/.build/RELEASE/lib/libippcp.so lib_ippcp.so
+ patchelf --set-soname lib_ippcp.so lib_ippcp.so
+
+ippcp_provider.so: ippcp.o c_utils.o | clibs lib_ippcp.so
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_ippcp.so -l:lib_timing.so -l:lib_csignals.so
+
+ippcp.o: ippcp.c
+ $(CC) -I$(PROJECT_ROOT_PATH)/ext/ipp-crypto/build/.build/RELEASE/include/ $(CFLAGS) -c $<
+
+
+# Nettle shim
+nettle: nettle_provider.so
+
+nettle_provider.so: nettle.o c_utils.o | clibs
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs nettle) -l:lib_timing.so -l:lib_csignals.so $(shell pkg-config --libs hogweed) -lgmp
+
+nettle.o: nettle.c
+ $(CC) $(shell pkg-config --cflags nettle) $(shell pkg-config --libs hogweed) -lgmp $(CFLAGS) -c $<
+
+
+# LibreSSL shim
+libressl: libressl_provider.so
+
+lib_libressl.so:
+ cp $(PROJECT_ROOT_PATH)/ext/libressl/build/crypto/libcrypto.so lib_libressl.so
+ patchelf --set-soname lib_libressl.so lib_libressl.so
+
+libressl_provider.so: libressl.o c_utils.o | clibs lib_libressl.so
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_libressl.so -l:lib_timing.so -l:lib_csignals.so
+
+libressl.o: libressl.c
+ $(CC) -I$(PROJECT_ROOT_PATH)/ext/libressl/build/include/ $(CFLAGS) -c $<
+
+
+help:
+ @echo "# This makefile builds the JNI shims necessary to test native libraries."
+ @echo "# Targets:"
+ @echo " - openssl"
+ @echo " - boringssl"
+ @echo " - gcrypt"
+ @echo " - tomcrypt"
+ @echo " - botan"
+ @echo " - cryptopp"
+ @echo " - mbedtls"
+ @echo " - ippcp"
+ @echo " - nettle"
+ @echo " - libressl"
+
+
+clean:
+ rm -rf *.o
+ rm -rf *.so
+
+.PHONY: all help clean openssl boringssl gcrypt tomcrypt botan cryptopp mbedtls ippcp nettle libressl
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/boringssl.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/boringssl.c
index 919cc79..307d611 100644
--- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/boringssl.c
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/boringssl.c
@@ -6,6 +6,7 @@
#include <strings.h>
#include <openssl/conf.h>
+#include <openssl/crypto.h>
#include <openssl/opensslv.h>
#include <openssl/objects.h>
#include <openssl/obj_mac.h>
@@ -569,4 +570,4 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna
EC_KEY_free(pub);
EC_GROUP_free(curve);
return (result == 1) ? JNI_TRUE : JNI_FALSE;
-} \ No newline at end of file
+}
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_utils.h b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_utils.h
index 93a11ed..ec62a40 100644
--- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_utils.h
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_utils.h
@@ -65,4 +65,14 @@ char *biginteger_to_hex(JNIEnv *env, jobject big, jint bytes);
} while (0)
#define ADD_KPG(env, self, kpg_name, kpg_class) ADD_PROPERTY(env, self, "KeyPairGenerator.", "cz.crcs.ectester.standalone.libs.jni.NativeKeyPairGeneratorSpi$", kpg_name, kpg_class)
#define ADD_KA(env, self, ka_name, ka_class) ADD_PROPERTY(env, self, "KeyAgreement.", "cz.crcs.ectester.standalone.libs.jni.NativeKeyAgreementSpi$", ka_name, ka_class)
-#define ADD_SIG(env, self, sig_name, sig_class) ADD_PROPERTY(env, self, "Signature.", "cz.crcs.ectester.standalone.libs.jni.NativeSignatureSpi$", sig_name, sig_class) \ No newline at end of file
+#define ADD_SIG(env, self, sig_name, sig_class) ADD_PROPERTY(env, self, "Signature.", "cz.crcs.ectester.standalone.libs.jni.NativeSignatureSpi$", sig_name, sig_class)
+
+
+/**
+ * Version handling.
+ */
+#define VERSION_GT(lib,a,b,c) ((ECTESTER_##lib##_MAJOR == a && ECTESTER_##lib##_MINOR == b && ECTESTER_##lib##_PATCH > c) || (ECTESTER_##lib##_MAJOR == a && ECTESTER_##lib##_MINOR > b) || (ECTESTER_##lib##_MAJOR > a))
+#define VERSION_EQ(lib,a,b,c) (ECTESTER_##lib##_MAJOR == a && ECTESTER_##lib##_MINOR == b && ECTESTER_##lib##_PATCH == c)
+#define VERSION_GE(lib,a,b,c) (VERSION_GT(lib,a,b,c) || VERSION_EQ(lib,a,b,c))
+#define VERSION_LT(lib,a,b,c) !(VERSION_GE(lib,a,b,c))
+#define VERSION_LE(lib,a,b,c) !(VERSION_GT(lib,a,b,c))
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_utils.hpp b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_utils.hpp
index ed26c01..0e74ee0 100644
--- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_utils.hpp
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_utils.hpp
@@ -47,4 +47,13 @@ void add_ka(JNIEnv *env, const std::string &type, const std::string &klass, jobj
/**
* Add a SignatureSpi class to this provider.
*/
-void add_sig(JNIEnv *env, const std::string &type, const std::string &klass, jobject provider, jmethodID put_method); \ No newline at end of file
+void add_sig(JNIEnv *env, const std::string &type, const std::string &klass, jobject provider, jmethodID put_method);
+
+/**
+ * Version handling.
+ */
+#define VERSION_GT(lib,a,b,c) ((ECTESTER_##lib##_MAJOR == a && ECTESTER_##lib##_MINOR == b && ECTESTER_##lib##_PATCH > c) || (ECTESTER_##lib##_MAJOR == a && ECTESTER_##lib##_MINOR > b) || (ECTESTER_##lib##_MAJOR > a))
+#define VERSION_EQ(lib,a,b,c) (ECTESTER_##lib##_MAJOR == a && ECTESTER_##lib##_MINOR == b && ECTESTER_##lib##_PATCH == c)
+#define VERSION_GE(lib,a,b,c) (VERSION_GT(lib,a,b,c) || VERSION_EQ(lib,a,b,c))
+#define VERSION_LT(lib,a,b,c) !(VERSION_GE(lib,a,b,c))
+#define VERSION_LE(lib,a,b,c) !(VERSION_GT(lib,a,b,c))
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp
index 1f82f8a..25e1ba4 100644
--- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp
@@ -95,6 +95,13 @@ using CryptoPP::Integer;
static jclass provider_class;
static std::unique_ptr<RandomNumberGenerator> rng = std::make_unique<AutoSeededRandomPool>();
+// Fallback to newest
+#if !(defined(ECTESTER_CRYPTOPP_MAJOR) && defined(ECTESTER_CRYPTOPP_MINOR) && defined(ECTESTER_CRYPTOPP_PATCH))
+#define ECTESTER_CRYPTOPP_MAJOR 99
+#define ECTESTER_CRYPTOPP_MINOR 99
+#define ECTESTER_CRYPTOPP_PATCH 99
+#endif
+
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_CryptoppLib_createProvider(JNIEnv *env, jobject self) {
/* Create the custom provider. */
@@ -115,7 +122,7 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_CryptoppLib_crea
}
jstring name = env->NewStringUTF(lib_name.c_str());
- double version = lib_version / 100;
+ double version = lib_version / 100.0;
jstring info = env->NewStringUTF(ss.str().c_str());
return env->NewObject(provider_class, init, name, version, info);
@@ -163,7 +170,11 @@ static std::vector<OID> get_all_curve_oids() {
}
static std::string oid_to_str(const OID &oid) {
+#if VERSION_LT(CRYPTOPP, 7, 0, 0)
+ const std::vector<CryptoPP::word32>& oid_values = oid.m_values;
+#else
const std::vector<CryptoPP::word32>& oid_values = oid.GetValues();
+#endif
std::stringstream ss;
for (size_t i = 0; i < oid_values.size(); ++i) {
if(i != 0)
@@ -839,4 +850,4 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna
}
// unreachable
return JNI_FALSE;
-} \ No newline at end of file
+}
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/mbedtls.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/mbedtls.c
index 8f5e0fb..8b7fbbb 100644
--- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/mbedtls.c
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/mbedtls.c
@@ -21,6 +21,32 @@ static mbedtls_entropy_context fixed_entropy;
static jclass provider_class;
+// Fallback to newest
+#if !(defined(ECTESTER_MBEDTLS_MAJOR) && defined(ECTESTER_MBEDTLS_MINOR) && defined(ECTESTER_MBEDTLS_PATCH))
+#define ECTESTER_MBEDTLS_MAJOR 99
+#define ECTESTER_MBEDTLS_MINOR 99
+#define ECTESTER_MBEDTLS_PATCH 99
+#endif
+
+
+#if VERSION_LT(MBEDTLS, 3, 0, 0)
+#define MBEDTLS_PRIVATE(member) member
+#else
+#define MBEDTLS_PRIVATE(member) private_##member
+#endif
+
+
+#if VERSION_LT(MBEDTLS, 3, 1, 0)
+#define CURVE_GRP_ID(curve_info) curve_info->MBEDTLS_PRIVATE(grp_id)
+#define CURVE_NAME(curve_info) curve_info->MBEDTLS_PRIVATE(name)
+#define CURVE_BIT_SIZE(curve_info) curve_info->MBEDTLS_PRIVATE(bit_size)
+#else
+#define CURVE_GRP_ID(curve_info) curve_info->grp_id
+#define CURVE_NAME(curve_info) curve_info->name
+#define CURVE_BIT_SIZE(curve_info) curve_info->bit_size
+#endif
+
+
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MbedTLSLib_createProvider(JNIEnv *env, jobject this) {
/* Create the custom provider. */
jclass local_provider_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeProvider$MbedTLS");
@@ -104,10 +130,10 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MbedTLSLib_getCu
jobject result = (*env)->NewObject(env, hash_set_class, hash_set_ctr);
for (const mbedtls_ecp_curve_info *curve_info = mbedtls_ecp_curve_list();
- curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
+ CURVE_GRP_ID(curve_info) != MBEDTLS_ECP_DP_NONE;
curve_info++) {
- jstring curve_name = (*env)->NewStringUTF(env, curve_info->name);
+ jstring curve_name = (*env)->NewStringUTF(env, CURVE_NAME(curve_info));
(*env)->CallBooleanMethod(env, result, hash_set_add, curve_name);
}
return result;
@@ -132,7 +158,8 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_MbedTLSLib_setu
mbedtls_entropy_init(&fixed_entropy);
// This is NASTY! We are accessing something the library does not want us to.
- fixed_entropy.private_source_count = 0;
+
+ fixed_entropy.MBEDTLS_PRIVATE(source_count) = 0;
mbedtls_entropy_add_source(&fixed_entropy, fixed_random, NULL, 32, MBEDTLS_ENTROPY_SOURCE_STRONG);
mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &fixed_entropy, NULL, 0);
@@ -141,9 +168,9 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_MbedTLSLib_setu
JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024MbedTLS_keysizeSupported(JNIEnv *env, jobject this, jint keysize) {
for (const mbedtls_ecp_curve_info *curve_info = mbedtls_ecp_curve_list();
- curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
+ CURVE_GRP_ID(curve_info) != MBEDTLS_ECP_DP_NONE;
curve_info++) {
- if (keysize == curve_info->bit_size) {
+ if (keysize == CURVE_BIT_SIZE(curve_info)) {
return JNI_TRUE;
}
}
@@ -170,9 +197,9 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPa
jstring name = (*env)->CallObjectMethod(env, params, get_name);
const char *utf_name = (*env)->GetStringUTFChars(env, name, NULL);
for (const mbedtls_ecp_curve_info *curve_info = mbedtls_ecp_curve_list();
- curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
+ CURVE_GRP_ID(curve_info) != MBEDTLS_ECP_DP_NONE;
curve_info++) {
- if (strcasecmp(utf_name, curve_info->name) == 0) {
+ if (strcasecmp(utf_name, CURVE_NAME(curve_info)) == 0) {
(*env)->ReleaseStringUTFChars(env, name, utf_name);
return JNI_TRUE;
}
@@ -244,6 +271,13 @@ static void mpi_from_biginteger(JNIEnv* env, jobject biginteger, mbedtls_mpi *mp
(*env)->ReleaseByteArrayElements(env, byte_array, byte_data, JNI_ABORT);
}
+#if (VERSION_LT(MBEDTLS, 3, 5, 0) && VERSION_GE(MBEDTLS, 3, 0, 0)) || VERSION_LT(MBEDTLS, 2, 28, 5)
+static inline int mbedtls_ecp_group_a_is_minus_3(const mbedtls_ecp_group *grp)
+{
+ return grp->A.MBEDTLS_PRIVATE(p) == NULL;
+}
+#endif
+
static jobject create_ec_param_spec(JNIEnv *env, const mbedtls_ecp_group *group) {
jobject p = biginteger_from_mpi(env, &group->P);
jmethodID fp_field_init = (*env)->GetMethodID(env, fp_field_class, "<init>", "(Ljava/math/BigInteger;)V");
@@ -402,7 +436,7 @@ static jobject generate_from_curve(JNIEnv *env, mbedtls_ecp_group *group) {
static jobject generate_from_curve_info(JNIEnv *env, const mbedtls_ecp_curve_info *curve) {
mbedtls_ecp_group group;
mbedtls_ecp_group_init(&group);
- mbedtls_ecp_group_load(&group, curve->grp_id);
+ mbedtls_ecp_group_load(&group, CURVE_GRP_ID(curve));
jobject result = generate_from_curve(env, &group);
mbedtls_ecp_group_free(&group);
return result;
@@ -411,9 +445,9 @@ static jobject generate_from_curve_info(JNIEnv *env, const mbedtls_ecp_curve_inf
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024MbedTLS_generate__ILjava_security_SecureRandom_2(JNIEnv *env, jobject this, jint keysize, jobject random) {
const mbedtls_ecp_curve_info *curve = NULL;
for (const mbedtls_ecp_curve_info *curve_info = mbedtls_ecp_curve_list();
- curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
+ CURVE_GRP_ID(curve_info) != MBEDTLS_ECP_DP_NONE;
curve_info++) {
- if (keysize == curve_info->bit_size) {
+ if (keysize == CURVE_BIT_SIZE(curve_info)) {
curve = curve_info;
break;
}
@@ -443,9 +477,9 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPai
const char *utf_name = (*env)->GetStringUTFChars(env, name, NULL);
const mbedtls_ecp_curve_info *curve = NULL;
for (const mbedtls_ecp_curve_info *curve_info = mbedtls_ecp_curve_list();
- curve_info->grp_id != MBEDTLS_ECP_DP_NONE;
+ CURVE_GRP_ID(curve_info) != MBEDTLS_ECP_DP_NONE;
curve_info++) {
- if (strcasecmp(utf_name, curve_info->name) == 0) {
+ if (strcasecmp(utf_name, CURVE_NAME(curve_info)) == 0) {
(*env)->ReleaseStringUTFChars(env, name, utf_name);
curve = curve_info;
break;