diff options
| author | J08nY | 2024-03-23 13:01:03 +0100 |
|---|---|---|
| committer | J08nY | 2024-03-25 14:57:34 +0100 |
| commit | c01f16cbacb45682547e4712bdae854c56604e61 (patch) | |
| tree | 5bfe030c2b6333dde0ee34b444d975d02bbc5659 /standalone/src/main/java | |
| parent | 73af477a8774e1ede5dd8de6491eb353dc0b12bd (diff) | |
| download | ECTester-c01f16cbacb45682547e4712bdae854c56604e61.tar.gz ECTester-c01f16cbacb45682547e4712bdae854c56604e61.tar.zst ECTester-c01f16cbacb45682547e4712bdae854c56604e61.zip | |
Fix applet building.
Diffstat (limited to 'standalone/src/main/java')
24 files changed, 1 insertions, 10821 deletions
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/.clang-format b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/.clang-format deleted file mode 100644 index 0aa8562..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/.clang-format +++ /dev/null @@ -1,90 +0,0 @@ ---- -Language: Cpp -# BasedOnStyle: Google -AccessModifierOffset: -1 -AlignAfterOpenBracket: Align -AlignConsecutiveAssignments: false -AlignConsecutiveDeclarations: false -AlignEscapedNewlinesLeft: true -AlignOperands: true -AlignTrailingComments: true -AllowAllParametersOfDeclarationOnNextLine: true -AllowShortBlocksOnASingleLine: false -AllowShortCaseLabelsOnASingleLine: false -AllowShortFunctionsOnASingleLine: All -AllowShortIfStatementsOnASingleLine: true -AllowShortLoopsOnASingleLine: true -AlwaysBreakAfterDefinitionReturnType: None -AlwaysBreakAfterReturnType: None -AlwaysBreakBeforeMultilineStrings: true -AlwaysBreakTemplateDeclarations: true -BinPackArguments: true -BinPackParameters: true -BraceWrapping: - AfterClass: false - AfterControlStatement: false - AfterEnum: false - AfterFunction: false - AfterNamespace: false - AfterObjCDeclaration: false - AfterStruct: false - AfterUnion: false - BeforeCatch: false - BeforeElse: false - IndentBraces: false -BreakBeforeBinaryOperators: None -BreakBeforeBraces: Attach -BreakBeforeTernaryOperators: true -BreakConstructorInitializersBeforeComma: false -ColumnLimit: 140 -CommentPragmas: '^ IWYU pragma:' -ConstructorInitializerAllOnOneLineOrOnePerLine: true -ConstructorInitializerIndentWidth: 4 -ContinuationIndentWidth: 4 -Cpp11BracedListStyle: true -DerivePointerAlignment: true -DisableFormat: false -ExperimentalAutoDetectBinPacking: false -ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] -IncludeCategories: - - Regex: '^<.*\.h>' - Priority: 1 - - Regex: '^<.*' - Priority: 2 - - Regex: '.*' - Priority: 3 -IndentCaseLabels: true -IndentWidth: 4 -IndentWrappedFunctionNames: false -KeepEmptyLinesAtTheStartOfBlocks: false -MacroBlockBegin: '' -MacroBlockEnd: '' -MaxEmptyLinesToKeep: 1 -NamespaceIndentation: None -ObjCBlockIndentWidth: 2 -ObjCSpaceAfterProperty: false -ObjCSpaceBeforeProtocolList: false -PenaltyBreakBeforeFirstCallParameter: 1 -PenaltyBreakComment: 300 -PenaltyBreakFirstLessLess: 120 -PenaltyBreakString: 1000 -PenaltyExcessCharacter: 10000 -PenaltyReturnTypeOnItsOwnLine: 200 -PointerAlignment: Left -ReflowComments: true -SortIncludes: true -SpaceAfterCStyleCast: false -SpaceBeforeAssignmentOperators: true -SpaceBeforeParens: ControlStatements -SpaceInEmptyParentheses: false -SpacesBeforeTrailingComments: 2 -SpacesInAngles: false -SpacesInContainerLiterals: true -SpacesInCStyleCastParentheses: false -SpacesInParentheses: false -SpacesInSquareBrackets: false -Standard: Auto -TabWidth: 4 -UseTab: ForIndentation -... - diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/.gitignore b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/.gitignore deleted file mode 100644 index 777d8e0..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -libcore_s.a -libcrypt_s.a -matrixssl/ -*.o -*.so - -CMakeLists.txt -cmake-build-debug
\ No newline at end of file diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/Makefile b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/Makefile deleted file mode 100644 index c3995e3..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/Makefile +++ /dev/null @@ -1,217 +0,0 @@ -############################################################################### -## General CC setup. - -CC?=gcc -CXX?=g++ - -LFLAGS+=-fPIC -shared -CFLAGS+=-fPIC -I"$(JNI_INCLUDEDIR)" -I"$(JNI_PLATFORMINCLUDEDIR)" -I. -CXXFLAGS+=-fPIC -I"$(JNI_INCLUDEDIR)" -I"$(JNI_PLATFORMINCLUDEDIR)" -I. - -DEBUG ?= 0 - -ifeq ($(DEBUG), 1) - CFLAGS+=-g -Wall - LFLAGS+=-g - CXXFLAGS+=-g -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 -endif - -ifeq ($(JNI_INCLUDEDIR),) - $(error Could not determine JNI include dir. Try specifying either JAVA_HOME or JNI_INCLUDEDIR.) -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 matrixssl 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 $< - -cpp_utils.o: cpp_utils.cpp - $(CXX) $(CXXFLAGS) -c $< - - -# OpenSSL shim -openssl: openssl_provider.so - -openssl_provider.so: openssl.o c_utils.o | lib_timing.so - $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs openssl) -l:lib_timing.so - -openssl.o: openssl.c - $(CC) $(shell pkg-config --cflags openssl) $(CFLAGS) -c $< - - -# BoringSSL shim -boringssl: boringssl_provider.so - -lib_boringssl.so: - cp ../../../../../../../ext/boringssl/build/crypto/libcrypto.so lib_boringssl.so - -boringssl_provider.so: boringssl.o c_utils.o | lib_timing.so lib_boringssl.so - $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_boringssl.so -l:lib_timing.so - -boringssl.o: boringssl.c - $(CC) -I../../../../../../../ext/boringssl/include/ $(CFLAGS) -c $< - - -# libgcrypt shim -gcrypt: gcrypt_provider.so - -gcrypt_provider.so: gcrypt.o c_utils.o | lib_timing.so - $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell libgcrypt-config --libs) -l:lib_timing.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 | lib_timing.so - $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -ltommath $(shell pkg-config --libs libtomcrypt) -l:lib_timing.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 | lib_timing.so - $(CXX) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs botan-2) -l:lib_timing.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 | lib_timing.so - $(CXX) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs $(CRYPTOPP_NAME)) -l:lib_timing.so - -cryptopp.o: cryptopp.cpp - $(CXX) $(shell pkg-config --cflags $(CRYPTOPP_NAME)) $(CXXFLAGS) -c $< - - -# mbedTLS shim -mbedtls: mbedtls_provider.so - -mbedtls_provider.so: mbedtls.o c_utils.o | lib_timing.so - $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -lmbedcrypto -l:lib_timing.so - -mbedtls.o: mbedtls.c - $(CC) $(CFLAGS) -c $< - - -# Intel Performance Primitives crypto shim -ippcp: ippcp_provider.so - -lib_ippcp.so: - cp ../../../../../../../ext/ipp-crypto/build/.build/RELEASE/lib/libippcp.so lib_ippcp.so - -ippcp_provider.so: ippcp.o c_utils.o | lib_timing.so lib_ippcp.so - $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_ippcp.so -l:lib_timing.so - -ippcp.o: ippcp.c - $(CC) -I../../../../../../../ext/ipp-crypto/build/.build/RELEASE/include/ $(CFLAGS) -c $< - - -# MatrixSSL shim -matrixssl: matrixssl_provider.so - -matrixssl_provider.so: matrixssl.o c_utils.o | lib_timing.so - $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' -L. $^ libcrypt_s.a libcore_s.a -l:lib_timing.so - -matrixssl.o: matrixssl.c - $(CC) $(CFLAGS) -Imatrixssl/ -c $< - - -# Nettle shim -nettle: nettle_provider.so - -nettle_provider.so: nettle.o c_utils.o | lib_timing.so - $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs nettle) -l:lib_timing.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 ../../../../../../../ext/libressl/build/crypto/libcrypto.so lib_libressl.so - -libressl_provider.so: libressl.o c_utils.o | lib_timing.so lib_libressl.so - $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_libressl.so -l:lib_timing.so - -libressl.o: libressl.c - $(CC) -I../../../../../../../ext/libressl/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 " - matrixssl" - @echo " - nettle" - @echo " - libressl" - - -clean: - rm -rf *.o - rm -rf *.so - -.PHONY: all help clean openssl boringssl gcrypt tomcrypt botan cryptopp mbedtls ippcp matrixssl nettle libressl diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/Makefile.bat b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/Makefile.bat deleted file mode 100755 index e6c98d5..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/Makefile.bat +++ /dev/null @@ -1,163 +0,0 @@ -@if not defined _echo echo off -setlocal EnableDelayedExpansion - -:: ENV variables respected: -:: - JAVA_HOME -:: - CC -:: - USE_EXT_MSCNG -:: - DEBUG - -:: See if we are cleaning. -if "%1" == "clean" ( - echo ** cleaning - del *.dll *.exp *.lib *.obj - exit -) - -set TAB= - - -:: Determine arch. -reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > NUL 2>&1 && (set ARCH=32& set ARCH_S=x86& set ARCH_VS=x86) || (set ARCH=64& set ARCH_S=x64& set ARCH_VS=amd64) - -echo ** ARCH%TAB%%TAB%%ARCH_S% - - -:: Find a working visual studio environment. -set found=0 -set vsw_path="%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" - -set vs_path= -for /f "usebackq delims=" %%i in (`%vsw_path% -nologo -prerelease -latest -property installationPath`) do ( - if exist "%%i\Common7\Tools\vsdevcmd.bat" ( - echo ** VsDevCmd%TAB%%TAB%%%i\Common7\Tools\vsdevcmd.bat - call "%%i\Common7\Tools\vsdevcmd.bat" -no_logo -arch=%ARCH_VS% - if ERRORLEVEL 1 ( - echo nope. - ) else ( - set found=1 - set vs_path=%%i - break - ) - ) -) - -:: Test if we have a visual studio env. -if %found% EQU 0 ( - echo Working VsDevCmd not found. - exit /b 2 -) - -echo ** VS_PATH%TAB%%TAB%%vs_path% - - -:: Try to find vcruntime. -set vc_base=%vs_path%\VC\Tools\MSVC\ -if exist %vc_base% ( - set vc_version= - for /f "delims=" %%i in ('dir /b /on "!vc_base!"') do ( - set vc_version=%%i - ) - echo ** VC_VERSION%TAB%!vc_version! - set vc_include=%vc_base%!vc_version!\include - set vc_lib=%vc_base%!vc_version!\lib\%ARCH_S% -) - - -:: Get the paths to Microsoft CNG SDK. -set root_rel=..\..\..\..\..\..\..\ -set mscng_rel_include=ext\mscng\10\Include -set mscng_rel_lib=ext\mscng\10\Lib - -pushd %root_rel% -pushd %mscng_rel_include% -set mscng_include=%CD% -popd -pushd %mscng_rel_lib% -set mscng_lib=%CD% -popd -popd - -set mscng_lib_arch=%mscng_lib%\X%ARCH% - -echo ** CNG_INCLUDE%TAB%%mscng_include% -echo ** CNG_LIB%TAB%%TAB%%mscng_lib_arch% - - -:: Get the paths to Java JNI. -if not defined JAVA_HOME ( - set jva= - for /f "delims=" %%i in ('where javac') do ( - set jva=%%~dpi - ) - pushd !jva!\.. - set JAVA_HOME=!CD! - popd -) - -echo ** JAVA_HOME%TAB%%JAVA_HOME% - -set JNI_INCLUDEDIR=%JAVA_HOME%\include -set JNI_PLATFORMINCLUDEDIR=%JNI_INCLUDEDIR%\win32 -set JNI_LIBDIR=%JAVA_HOME%\lib - - -:: Setup binaries. -if not defined CC ( - set CC=cl.exe -) - -echo ** CC%TAB%%TAB%%CC% - - -:: Try to find uCRT. -set ucrt_base=%ProgramFiles(x86)%\Windows Kits\10\ -if exist %ucrt_base% ( - set ucrt_version= - for /f "delims=" %%i in ('dir /b /on "!ucrt_base!\Include"') do ( - set ucrt_version=%%i - ) - echo ** uCRT%TAB%%TAB%!ucrt_version! - set ucrt_include=%ucrt_base%Include\!ucrt_version!\ucrt - set ucrt_lib=%ucrt_base%Lib\!ucrt_version! - set ucrt_lib_arch=!ucrt_lib!\ucrt\%ARCH_S% -) - - -:: Setup INCLUDE paths. -set INCLUDE_CLI=/I. /I"%JNI_INCLUDEDIR%" /I"%JNI_PLATFORMINCLUDEDIR%" - -if defined USE_EXT_MSCNG ( - set INCLUDE_CLI=!INCLUDE_CLI! /I"%mscng_include%" -) - -echo ** INCLUDE%TAB%%TAB%%INCLUDE% -echo ** INCLUDE_CLI%TAB%%INCLUDE_CLI% - - -:: Setup LIB paths. -set LIBPATH=/LIBPATH:"%JNI_LIBDIR%" - -if defined USE_EXT_MSCNG ( - set LIBPATH=!LIBPATH! /LIBPATH:"%mscng_lib_arch%" -) - -echo ** LIB%TAB%%TAB%%LIB% -echo ** LIBPATH%TAB%%TAB%%LIBPATH% - - -:: Setup DEBUB options. -set OTHER_CLI= -if defined DEBUG ( - set OTHER_CLI=/Od /Z7 -) else ( - set OTHER_CLI=/O2 -) - -echo ** OTHER_CLI%TAB%%OTHER_CLI% -echo. - -echo ^>^> %CC% /W2 /EHsc %OTHER_CLI% %INCLUDE_CLI% mscng.c c_utils.c c_timing.c bcrypt.lib jvm.lib kernel32.lib /Femscng_provider.dll /LD /link %LIBPATH% /nologo -echo. - -%CC% /W2 /EHsc %OTHER_CLI% %INCLUDE_CLI% mscng.c c_utils.c c_timing.c bcrypt.lib jvm.lib kernel32.lib /Femscng_provider.dll /LD /link %LIBPATH% /nologo diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/boringssl.c b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/boringssl.c deleted file mode 100644 index bca2ead..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/boringssl.c +++ /dev/null @@ -1,516 +0,0 @@ -#include "native.h" -#include <string.h> - -#include <openssl/conf.h> -#include <openssl/opensslv.h> -#include <openssl/objects.h> -#include <openssl/obj_mac.h> -#include <openssl/bn.h> -#include <openssl/evp.h> -#include <openssl/err.h> -#include <openssl/ec.h> -#include <openssl/ecdh.h> -#include <openssl/ecdsa.h> - -#include "c_utils.h" -#include "c_timing.h" - - -static jclass provider_class; - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_BoringsslLib_createProvider(JNIEnv *env, jobject self) { - /* Create the custom provider. */ - jclass local_provider_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeProvider$Boringssl"); - provider_class = (*env)->NewGlobalRef(env, local_provider_class); - - jmethodID init = (*env)->GetMethodID(env, local_provider_class, "<init>", "(Ljava/lang/String;DLjava/lang/String;)V"); - - jstring name = (*env)->NewStringUTF(env, OPENSSL_VERSION_TEXT); - long ver_hi = (OPENSSL_VERSION_NUMBER & 0xff000000L) >> 28; - long ver_mid = (OPENSSL_VERSION_NUMBER & 0xff0000L) >> 20; - long ver_low = (OPENSSL_VERSION_NUMBER & 0xff00L) >> 12; - double version = (double)ver_hi + ((double)ver_mid/10) + ((double)ver_low/100); - - return (*env)->NewObject(env, provider_class, init, name, version, name); -} - -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Boringssl_setup(JNIEnv *env, jobject self) { - ERR_load_crypto_strings(); - CRYPTO_library_init(); - - INIT_PROVIDER(env, provider_class); - - ADD_KPG(env, self, "EC", "Boringssl"); - ADD_KA(env, self, "ECDH", "BoringsslECDH"); - ADD_SIG(env, self, "NONEwithECDSA", "BoringsslECDSAwithNONE"); - - init_classes(env, "Boringssl"); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_BoringsslLib_getCurves(JNIEnv *env, jobject self) { - jclass hash_set_class = (*env)->FindClass(env, "java/util/TreeSet"); - - jmethodID hash_set_ctr = (*env)->GetMethodID(env, hash_set_class, "<init>", "()V"); - jmethodID hash_set_add = (*env)->GetMethodID(env, hash_set_class, "add", "(Ljava/lang/Object;)Z"); - - jobject result = (*env)->NewObject(env, hash_set_class, hash_set_ctr); - - size_t ncurves = EC_get_builtin_curves(NULL, 0); - EC_builtin_curve curves[ncurves]; - EC_get_builtin_curves(curves, ncurves); - - for (size_t i = 0; i < ncurves; ++i) { - jstring curve_name = (*env)->NewStringUTF(env, OBJ_nid2sn(curves[i].nid)); - (*env)->CallBooleanMethod(env, result, hash_set_add, curve_name); - } - - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Boringssl_keysizeSupported(JNIEnv *env, jobject self, jint keysize) { - size_t ncurves = EC_get_builtin_curves(NULL, 0); - EC_builtin_curve curves[ncurves]; - EC_get_builtin_curves(curves, ncurves); - - for (size_t i = 0; i < ncurves; ++i) { - EC_GROUP *curve = EC_GROUP_new_by_curve_name(curves[i].nid); - if (EC_GROUP_get_degree(curve) == keysize) { - EC_GROUP_free(curve); - return JNI_TRUE; - } - EC_GROUP_free(curve); - } - return JNI_FALSE; -} - -static jobject bignum_to_biginteger(JNIEnv *env, const BIGNUM *bn) { - jmethodID biginteger_init = (*env)->GetMethodID(env, biginteger_class, "<init>", "(I[B)V"); - int size = BN_num_bytes(bn); - jbyteArray bytes = (*env)->NewByteArray(env, size); - jbyte *data = (*env)->GetByteArrayElements(env, bytes, NULL); - BN_bn2bin(bn, (unsigned char *) data); - (*env)->ReleaseByteArrayElements(env, bytes, data, 0); - jobject result = (*env)->NewObject(env, biginteger_class, biginteger_init, 1, bytes); - return result; -} - -static BIGNUM *biginteger_to_bignum(JNIEnv *env, jobject bigint) { - jmethodID to_byte_array = (*env)->GetMethodID(env, biginteger_class, "toByteArray", "()[B"); - - jbyteArray byte_array = (jbyteArray) (*env)->CallObjectMethod(env, bigint, to_byte_array); - jsize byte_length = (*env)->GetArrayLength(env, byte_array); - jbyte *byte_data = (*env)->GetByteArrayElements(env, byte_array, NULL); - BIGNUM *result = BN_bin2bn((unsigned char *) byte_data, byte_length, NULL); - (*env)->ReleaseByteArrayElements(env, byte_array, byte_data, JNI_ABORT); - return result; -} - -static EC_GROUP *create_curve(JNIEnv *env, jobject params) { - jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject elliptic_curve = (*env)->CallObjectMethod(env, params, get_curve); - - jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field); - - if ((*env)->IsInstanceOf(env, field, f2m_field_class)) { - return NULL; - } - - jmethodID get_a = (*env)->GetMethodID(env, elliptic_curve_class, "getA", "()Ljava/math/BigInteger;"); - jobject a = (*env)->CallObjectMethod(env, elliptic_curve, get_a); - BIGNUM *a_bn = biginteger_to_bignum(env, a); - - jmethodID get_b = (*env)->GetMethodID(env, elliptic_curve_class, "getB", "()Ljava/math/BigInteger;"); - jobject b = (*env)->CallObjectMethod(env, elliptic_curve, get_b); - BIGNUM *b_bn = biginteger_to_bignum(env, b); - - jmethodID get_g = (*env)->GetMethodID(env, ec_parameter_spec_class, "getGenerator", "()Ljava/security/spec/ECPoint;"); - jobject g = (*env)->CallObjectMethod(env, params, get_g); - - jmethodID get_x = (*env)->GetMethodID(env, point_class, "getAffineX", "()Ljava/math/BigInteger;"); - jobject gx = (*env)->CallObjectMethod(env, g, get_x); - BIGNUM *gx_bn = biginteger_to_bignum(env, gx); - - jmethodID get_y = (*env)->GetMethodID(env, point_class, "getAffineY", "()Ljava/math/BigInteger;"); - jobject gy = (*env)->CallObjectMethod(env, g, get_y); - BIGNUM *gy_bn = biginteger_to_bignum(env, gy); - - EC_GROUP *result; - EC_POINT *g_point; - - jmethodID get_p = (*env)->GetMethodID(env, fp_field_class, "getP", "()Ljava/math/BigInteger;"); - jobject p = (*env)->CallObjectMethod(env, field, get_p); - - BIGNUM *p_bn = biginteger_to_bignum(env, p); - result = EC_GROUP_new_curve_GFp(p_bn, a_bn, b_bn, NULL); - BN_free(p_bn); - BN_free(a_bn); - BN_free(b_bn); - - if (!result) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating EC_GROUP, EC_GROUP_new_curve_GFp."); - BN_free(gx_bn); BN_free(gy_bn); - return NULL; - } - - g_point = EC_POINT_new(result); - if(!EC_POINT_set_affine_coordinates_GFp(result, g_point, gx_bn, gy_bn, NULL)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating EC_GROUP, EC_POINT_set_affine_coordinates_GFp."); - BN_free(gx_bn); BN_free(gy_bn); EC_POINT_free(g_point); EC_GROUP_free(result); - return NULL; - } - - jmethodID get_n = (*env)->GetMethodID(env, ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;"); - jobject n = (*env)->CallObjectMethod(env, params, get_n); - BIGNUM *n_bn = biginteger_to_bignum(env, n); - - jmethodID get_h = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCofactor", "()I"); - jint h = (*env)->CallIntMethod(env, params, get_h); - BIGNUM *h_bn = BN_new(); - BN_set_word(h_bn, h); - - if (!EC_GROUP_set_generator(result, g_point, n_bn, h_bn)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating EC_GROUP, EC_GROUP_set_generator."); - BN_free(n_bn); BN_free(h_bn); BN_free(gx_bn); BN_free(gy_bn); EC_POINT_free(g_point); EC_GROUP_free(result); - return NULL; - } - - EC_POINT_free(g_point); - BN_free(gx_bn); - BN_free(gy_bn); - BN_free(n_bn); - BN_free(h_bn); - - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Boringssl_paramsSupported(JNIEnv *env, jobject self, jobject params){ - if (params == NULL) { - return JNI_FALSE; - } - - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - EC_GROUP *curve = create_curve(env, params); - jboolean result = !curve; - EC_GROUP_free(curve); - return result; - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char *utf_name = (*env)->GetStringUTFChars(env, name, NULL); - size_t ncurves = EC_get_builtin_curves(NULL, 0); - EC_builtin_curve curves[ncurves]; - EC_get_builtin_curves(curves, ncurves); - for (size_t i = 0; i < ncurves; ++i) { - if (strcasecmp(utf_name, OBJ_nid2sn(curves[i].nid)) == 0) { - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return JNI_TRUE; - } - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return JNI_FALSE; - } else { - return JNI_FALSE; - } -} - -static jobject create_ec_param_spec(JNIEnv *env, const EC_GROUP *curve) { - BIGNUM *a; - BIGNUM *b; - - BIGNUM *gx; - BIGNUM *gy; - jobject field; - - BIGNUM *p = BN_new(); - a = BN_new(); - b = BN_new(); - if (!EC_GROUP_get_curve_GFp(curve, p, a, b, NULL)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_GROUP_get_curve_GFp."); - BN_free(p); BN_free(a); BN_free(b); - return NULL; - } - - jobject p_int = bignum_to_biginteger(env, p); - - jmethodID fp_field_init = (*env)->GetMethodID(env, fp_field_class, "<init>", "(Ljava/math/BigInteger;)V"); - field = (*env)->NewObject(env, fp_field_class, fp_field_init, p_int); - - BN_free(p); - - gx = BN_new(); - gy = BN_new(); - if (!EC_POINT_get_affine_coordinates_GFp(curve, EC_GROUP_get0_generator(curve), gx, gy, NULL)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_POINT_get_affine_coordinates_GFp."); - BN_free(a); BN_free(b); BN_free(gx); BN_free(gy); - return NULL; - } - - jobject a_int = bignum_to_biginteger(env, a); - jobject b_int = bignum_to_biginteger(env, b); - - jmethodID elliptic_curve_init = (*env)->GetMethodID(env, elliptic_curve_class, "<init>", "(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject elliptic_curve = (*env)->NewObject(env, elliptic_curve_class, elliptic_curve_init, field, a_int, b_int); - - BN_free(a); - BN_free(b); - - jobject gx_int = bignum_to_biginteger(env, gx); - jobject gy_int = bignum_to_biginteger(env, gy); - - BN_free(gx); - BN_free(gy); - - jmethodID point_init = (*env)->GetMethodID(env, point_class, "<init>", "(Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject g = (*env)->NewObject(env, point_class, point_init, gx_int, gy_int); - - jobject order = bignum_to_biginteger(env, EC_GROUP_get0_order(curve)); - BIGNUM *h = BN_new(); - EC_GROUP_get_cofactor(curve, h, NULL); - jint cofactor = BN_get_word(h); - BN_free(h); - - jmethodID ec_parameter_spec_init = (*env)->GetMethodID(env, ec_parameter_spec_class, "<init>", "(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V"); - return (*env)->NewObject(env, ec_parameter_spec_class, ec_parameter_spec_init, elliptic_curve, g, order, cofactor); -} - -static jobject generate_from_curve(JNIEnv *env, const EC_GROUP *curve) { - jint keysize = EC_GROUP_get_degree(curve); - unsigned long key_bytes = (keysize + 7) / 8; - - EC_KEY *key = EC_KEY_new(); - EC_KEY_set_group(key, curve); - - native_timing_start(); - int err = EC_KEY_generate_key(key); - native_timing_stop(); - - if (!err) { - throw_new(env, "java/security/GeneralSecurityException", "Error generating key, EC_KEY_generate_key."); - EC_KEY_free(key); - return NULL; - } - - jbyteArray priv_bytes = (*env)->NewByteArray(env, key_bytes); - jbyte *key_priv = (*env)->GetByteArrayElements(env, priv_bytes, NULL); - BN_bn2bin_padded((unsigned char *) key_priv, key_bytes, EC_KEY_get0_private_key(key)); - (*env)->ReleaseByteArrayElements(env, priv_bytes, key_priv, 0); - - unsigned long key_len = 2*key_bytes + 1; - jbyteArray pub_bytes = (*env)->NewByteArray(env, key_len); - jbyte *key_pub = (*env)->GetByteArrayElements(env, pub_bytes, NULL); - EC_POINT_point2oct(curve, EC_KEY_get0_public_key(key), POINT_CONVERSION_UNCOMPRESSED, (unsigned char *) key_pub, key_len, NULL); - (*env)->ReleaseByteArrayElements(env, pub_bytes, key_pub, 0); - - EC_KEY_free(key); - - jobject ec_param_spec = create_ec_param_spec(env, curve); - - jobject ec_pub_param_spec = (*env)->NewLocalRef(env, ec_param_spec); - jmethodID ec_pub_init = (*env)->GetMethodID(env, pubkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject pubkey = (*env)->NewObject(env, pubkey_class, ec_pub_init, pub_bytes, ec_pub_param_spec); - - jobject ec_priv_param_spec = (*env)->NewLocalRef(env, ec_param_spec); - jmethodID ec_priv_init = (*env)->GetMethodID(env, privkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject privkey = (*env)->NewObject(env, privkey_class, ec_priv_init, priv_bytes, ec_priv_param_spec); - - jmethodID keypair_init = (*env)->GetMethodID(env, keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V"); - return (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Boringssl_generate__ILjava_security_SecureRandom_2(JNIEnv *env, jobject self, jint keysize, jobject random) { - size_t ncurves = EC_get_builtin_curves(NULL, 0); - EC_builtin_curve curves[ncurves]; - EC_get_builtin_curves(curves, ncurves); - - EC_GROUP *curve = NULL; - for (size_t i = 0; i < ncurves; ++i) { - curve = EC_GROUP_new_by_curve_name(curves[i].nid); - if (EC_GROUP_get_degree(curve) == keysize) { - break; - } - EC_GROUP_free(curve); - } - - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve for given bitsize not found."); - return NULL; - } - - jobject result = generate_from_curve(env, curve); - EC_GROUP_free(curve); - return result; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Boringssl_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(JNIEnv *env, jobject self, jobject params, jobject random) { - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - EC_GROUP *curve = create_curve(env, params); - jobject result = generate_from_curve(env, curve); - EC_GROUP_free(curve); - return result; - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char* utf_name = (*env)->GetStringUTFChars(env, name, NULL); - size_t ncurves = EC_get_builtin_curves(NULL, 0); - EC_builtin_curve curves[ncurves]; - EC_get_builtin_curves(curves, ncurves); - EC_GROUP *curve = NULL; - for (size_t i = 0; i < ncurves; ++i) { - if (strcasecmp(utf_name, OBJ_nid2sn(curves[i].nid)) == 0) { - curve = EC_GROUP_new_by_curve_name(curves[i].nid); - break; - } - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve for given bitsize not found."); - return NULL; - } - jobject result = generate_from_curve(env, curve); - EC_GROUP_free(curve); - return result; - } else { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found."); - return NULL; - } -} - -EC_KEY *barray_to_pubkey(JNIEnv *env, const EC_GROUP *curve, jbyteArray pub) { - EC_KEY *result = EC_KEY_new(); - EC_KEY_set_group(result, curve); - jsize pub_len = (*env)->GetArrayLength(env, pub); - jbyte *pub_data = (*env)->GetByteArrayElements(env, pub, NULL); - EC_POINT *pub_point = EC_POINT_new(curve); - EC_POINT_oct2point(curve, pub_point, (unsigned char *) pub_data, pub_len, NULL); - (*env)->ReleaseByteArrayElements(env, pub, pub_data, JNI_ABORT); - EC_KEY_set_public_key(result, pub_point); - EC_POINT_free(pub_point); - return result; -} - -EC_KEY *barray_to_privkey(JNIEnv *env, const EC_GROUP *curve, jbyteArray priv) { - EC_KEY *result = EC_KEY_new(); - EC_KEY_set_group(result, curve); - jsize priv_len = (*env)->GetArrayLength(env, priv); - jbyte *priv_data = (*env)->GetByteArrayElements(env, priv, NULL); - BIGNUM *s = BN_bin2bn((unsigned char *) priv_data, priv_len, NULL); - (*env)->ReleaseByteArrayElements(env, priv, priv_data, JNI_ABORT); - EC_KEY_set_private_key(result, s); - BN_free(s); - return result; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Boringssl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params) { - EC_GROUP *curve = create_curve(env, params); - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found."); - return NULL; - } - - EC_KEY *pub = barray_to_pubkey(env, curve, pubkey); - EC_KEY *priv = barray_to_privkey(env, curve, privkey); - - int field_size = EC_GROUP_get_degree(curve); - size_t secret_len = (field_size + 7)/8; - - //TODO: Do more KeyAgreements here, but will have to do the hash-fun manually, - // probably using the ECDH_KDF_X9_62 by wrapping it and dynamically choosing the EVP_MD. from the type string. - jbyteArray result = (*env)->NewByteArray(env, secret_len); - jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL); - - native_timing_start(); - int err = ECDH_compute_key(result_data, secret_len, EC_KEY_get0_public_key(pub), priv, NULL); - native_timing_stop(); - - if (err <= 0) { - throw_new(env, "java/security/GeneralSecurityException", "Error computing ECDH, ECDH_compute_key."); - EC_KEY_free(pub); EC_KEY_free(priv); EC_GROUP_free(curve); - (*env)->ReleaseByteArrayElements(env, result, result_data, JNI_ABORT); - return NULL; - } - (*env)->ReleaseByteArrayElements(env, result, result_data, 0); - - EC_KEY_free(pub); - EC_KEY_free(priv); - EC_GROUP_free(curve); - return result; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Boringssl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm) { - throw_new(env, "java/lang/UnsupportedOperationException", "Not supported."); - return NULL; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Boringssl_sign(JNIEnv *env, jobject self, jbyteArray data, jbyteArray privkey, jobject params) { - EC_GROUP *curve = create_curve(env, params); - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found."); - return NULL; - } - - EC_KEY *priv = barray_to_privkey(env, curve, privkey); - - jsize data_size = (*env)->GetArrayLength(env, data); - jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL); - // TODO: Do more Signatures here, maybe use the EVP interface to get to the hashes easier and not hash manually? - - native_timing_start(); - ECDSA_SIG *signature = ECDSA_do_sign((unsigned char *) data_data, data_size, priv); - native_timing_stop(); - - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - if (!signature) { - throw_new(env, "java/security/GeneralSecurityException", "Error signing, ECDSA_do_sign."); - EC_KEY_free(priv); EC_GROUP_free(curve); - return NULL; - } - - jsize sig_len = i2d_ECDSA_SIG(signature, NULL); - jbyteArray result = (*env)->NewByteArray(env, sig_len); - jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL); - jbyte *result_data_ptr = result_data; - i2d_ECDSA_SIG(signature, (unsigned char **)&result_data_ptr); - (*env)->ReleaseByteArrayElements(env, result, result_data, 0); - - ECDSA_SIG_free(signature); - EC_KEY_free(priv); - EC_GROUP_free(curve); - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Boringssl_verify(JNIEnv *env, jobject self, jbyteArray signature, jbyteArray data, jbyteArray pubkey, jobject params) { - EC_GROUP *curve = create_curve(env, params); - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found."); - return JNI_FALSE; - } - - EC_KEY *pub = barray_to_pubkey(env, curve, pubkey); - - jsize sig_len = (*env)->GetArrayLength(env, signature); - jbyte *sig_data = (*env)->GetByteArrayElements(env, signature, NULL); - jbyte *sig_data_ptr = sig_data; - ECDSA_SIG *sig_obj = d2i_ECDSA_SIG(NULL, (const unsigned char **)&sig_data_ptr, sig_len); - (*env)->ReleaseByteArrayElements(env, signature, sig_data, JNI_ABORT); - - jsize data_size = (*env)->GetArrayLength(env, data); - jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL); - - native_timing_start(); - int result = ECDSA_do_verify((unsigned char *) data_data, data_size, sig_obj, pub); - native_timing_stop(); - - if (result < 0) { - throw_new(env, "java/security/GeneralSecurityException", "Error verifying, ECDSA_do_verify."); - EC_KEY_free(pub); EC_GROUP_free(curve); ECDSA_SIG_free(sig_obj); - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - return JNI_FALSE; - } - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - - ECDSA_SIG_free(sig_obj); - 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/java/cz/crcs/ectester/standalone/libs/jni/botan.cpp b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/botan.cpp deleted file mode 100644 index c0d249c..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/botan.cpp +++ /dev/null @@ -1,528 +0,0 @@ -#include "native.h" -#include <string> - -#include <botan/version.h> -#include <botan/rng.h> -#include <botan/secmem.h> -#include <botan/auto_rng.h> - -#include <botan/ec_group.h> -#include <botan/ecc_key.h> -#include <botan/ecdsa.h> -#include <botan/eckcdsa.h> -#include <botan/ecgdsa.h> -#include <botan/ecdh.h> -#include <botan/pubkey.h> -#include "cpp_utils.hpp" -#include "c_timing.h" - -static jclass provider_class; -static Botan::AutoSeeded_RNG rng; - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_BotanLib_createProvider(JNIEnv *env, jobject self) { - /* Create the custom provider. */ - jclass local_provider_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeProvider$Botan"); - provider_class = (jclass) env->NewGlobalRef(local_provider_class); - - jmethodID init = env->GetMethodID(local_provider_class, "<init>", "(Ljava/lang/String;DLjava/lang/String;)V"); - - const char* info_str = Botan::version_cstr(); - const char* v_str = Botan::short_version_cstr(); - std::string name_str = Botan::short_version_string(); - name_str.insert(0, "Botan "); - - jstring name = env->NewStringUTF(name_str.c_str()); - double version = strtod(v_str, NULL); - jstring info = env->NewStringUTF(info_str); - - return env->NewObject(provider_class, init, name, version, info); -} - -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Botan_setup(JNIEnv *env, jobject self){ - jmethodID provider_put = env->GetMethodID(provider_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); - - add_kpg(env, "ECDH", "BotanECDH", self, provider_put); - add_kpg(env, "ECDSA", "BotanECDSA", self, provider_put); - add_kpg(env, "ECKCDSA", "BotanECKCDSA", self, provider_put); - add_kpg(env, "ECGDSA", "BotanECGDSA", self, provider_put); - - add_ka(env, "ECDH", "BotanECDH", self, provider_put); - add_ka(env, "ECDHwithSHA1KDF", "BotanECDHwithSHA1KDF", self, provider_put); - add_ka(env, "ECDHwithSHA224KDF", "BotanECDHwithSHA224KDF", self, provider_put); - add_ka(env, "ECDHwithSHA256KDF", "BotanECDHwithSHA256KDF", self, provider_put); - add_ka(env, "ECDHwithSHA384KDF", "BotanECDHwithSHA384KDF", self, provider_put); - add_ka(env, "ECDHwithSHA512KDF", "BotanECDHwithSHA512KDF", self, provider_put); - - add_sig(env, "NONEwithECDSA", "BotanECDSAwithNONE", self, provider_put); - add_sig(env, "SHA1withECDSA", "BotanECDSAwithSHA1", self, provider_put); - add_sig(env, "SHA224withECDSA", "BotanECDSAwithSHA224", self, provider_put); - add_sig(env, "SHA256withECDSA", "BotanECDSAwithSHA256", self, provider_put); - add_sig(env, "SHA384withECDSA", "BotanECDSAwithSHA384", self, provider_put); - add_sig(env, "SHA512withECDSA", "BotanECDSAwithSHA512", self, provider_put); - - add_sig(env, "NONEwithECKCDSA", "BotanECKCDSAwithNONE", self, provider_put); - add_sig(env, "SHA1withECKCDSA", "BotanECKCDSAwithSHA1", self, provider_put); - add_sig(env, "SHA224withECKCDSA", "BotanECKCDSAwithSHA224", self, provider_put); - add_sig(env, "SHA256withECKCDSA", "BotanECKCDSAwithSHA256", self, provider_put); - add_sig(env, "SHA384withECKCDSA", "BotanECKCDSAwithSHA384", self, provider_put); - add_sig(env, "SHA512withECKCDSA", "BotanECKCDSAwithSHA512", self, provider_put); - - add_sig(env, "NONEwithECGDSA", "BotanECGDSAwithNONE", self, provider_put); - add_sig(env, "SHA1withECGDSA", "BotanECGDSAwithSHA1", self, provider_put); - add_sig(env, "SHA224withECGDSA", "BotanECGDSAwithSHA224", self, provider_put); - add_sig(env, "SHA256withECGDSA", "BotanECGDSAwithSHA256", self, provider_put); - add_sig(env, "SHA384withECGDSA", "BotanECGDSAwithSHA384", self, provider_put); - add_sig(env, "SHA512withECGDSA", "BotanECGDSAwithSHA512", self, provider_put); - - init_classes(env, "Botan"); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_BotanLib_getCurves(JNIEnv *env, jobject self){ - jclass set_class = env->FindClass("java/util/TreeSet"); - - jmethodID set_ctr = env->GetMethodID(set_class, "<init>", "()V"); - jmethodID set_add = env->GetMethodID(set_class, "add", "(Ljava/lang/Object;)Z"); - - jobject result = env->NewObject(set_class, set_ctr); - - const std::set<std::string>& curves = Botan::EC_Group::known_named_groups(); - for (auto it = curves.begin(); it != curves.end(); ++it) { - std::string curve_name = *it; - jstring name_str = env->NewStringUTF(curve_name.c_str()); - env->CallBooleanMethod(result, set_add, name_str); - } - - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Botan_keysizeSupported(JNIEnv *env, jobject self, jint keysize){ - return JNI_TRUE; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Botan_paramsSupported(JNIEnv *env, jobject self, jobject params){ - if (params == NULL) { - return JNI_FALSE; - } - - if (env->IsInstanceOf(params, ec_parameter_spec_class)) { - jmethodID get_curve = env->GetMethodID(ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject curve = env->CallObjectMethod(params, get_curve); - - jmethodID get_field = env->GetMethodID(elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = env->CallObjectMethod(curve, get_field); - - if (env->IsInstanceOf(field, fp_field_class)) { - return JNI_TRUE; - } - } else if (env->IsInstanceOf(params, ecgen_parameter_spec_class)) { - const std::set<std::string>& curves = Botan::EC_Group::known_named_groups(); - jmethodID get_name = env->GetMethodID(ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (jstring) env->CallObjectMethod(params, get_name); - const char *utf_name = env->GetStringUTFChars(name, NULL); - std::string str_name(utf_name); - env->ReleaseStringUTFChars(name, utf_name); - if (curves.find(str_name) != curves.end()) { - return JNI_TRUE; - } - } - return JNI_FALSE; -} - -static jobject biginteger_from_bigint(JNIEnv *env, const Botan::BigInt& bigint) { - std::vector<uint8_t> bigint_data = Botan::BigInt::encode(bigint); - jbyteArray bigint_array = env->NewByteArray(bigint_data.size()); - jbyte * bigint_bytes = env->GetByteArrayElements(bigint_array, NULL); - std::copy(bigint_data.begin(), bigint_data.end(), bigint_bytes); - env->ReleaseByteArrayElements(bigint_array, bigint_bytes, 0); - - jmethodID biginteger_init = env->GetMethodID(biginteger_class, "<init>", "(I[B)V"); - return env->NewObject(biginteger_class, biginteger_init, (jint) 1, bigint_array); -} - -static Botan::BigInt bigint_from_biginteger(JNIEnv *env, jobject biginteger) { - jmethodID to_byte_array = env->GetMethodID(biginteger_class, "toByteArray", "()[B"); - jbyteArray byte_array = (jbyteArray) env->CallObjectMethod(biginteger, to_byte_array); - jsize byte_length = env->GetArrayLength(byte_array); - jbyte *byte_data = env->GetByteArrayElements(byte_array, NULL); - Botan::BigInt result((unsigned char *) byte_data, byte_length); - env->ReleaseByteArrayElements(byte_array, byte_data, JNI_ABORT); - return result; -} - -static Botan::EC_Group group_from_params(JNIEnv *env, jobject params) { - if (env->IsInstanceOf(params, ec_parameter_spec_class)) { - jmethodID get_curve = env->GetMethodID(ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject elliptic_curve = env->CallObjectMethod(params, get_curve); - - jmethodID get_field = env->GetMethodID(elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = env->CallObjectMethod(elliptic_curve, get_field); - - jmethodID get_a = env->GetMethodID(elliptic_curve_class, "getA", "()Ljava/math/BigInteger;"); - jobject a = env->CallObjectMethod(elliptic_curve, get_a); - - jmethodID get_b = env->GetMethodID(elliptic_curve_class, "getB", "()Ljava/math/BigInteger;"); - jobject b = env->CallObjectMethod(elliptic_curve, get_b); - - jmethodID get_p = env->GetMethodID(fp_field_class, "getP", "()Ljava/math/BigInteger;"); - jobject p = env->CallObjectMethod(field, get_p); - - jmethodID get_g = env->GetMethodID(ec_parameter_spec_class, "getGenerator", "()Ljava/security/spec/ECPoint;"); - jobject g = env->CallObjectMethod(params, get_g); - - jmethodID get_x = env->GetMethodID(point_class, "getAffineX", "()Ljava/math/BigInteger;"); - jobject gx = env->CallObjectMethod(g, get_x); - - jmethodID get_y = env->GetMethodID(point_class, "getAffineY", "()Ljava/math/BigInteger;"); - jobject gy = env->CallObjectMethod(g, get_y); - - jmethodID get_n = env->GetMethodID(ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;"); - jobject n = env->CallObjectMethod(params, get_n); - - jmethodID get_h = env->GetMethodID(ec_parameter_spec_class, "getCofactor", "()I"); - jint h = env->CallIntMethod(params, get_h); - - Botan::BigInt pi = bigint_from_biginteger(env, p); - Botan::BigInt ai = bigint_from_biginteger(env, a); - Botan::BigInt bi = bigint_from_biginteger(env, b); - - Botan::BigInt gxi = bigint_from_biginteger(env, gx); - Botan::BigInt gyi = bigint_from_biginteger(env, gy); - - Botan::BigInt ni = bigint_from_biginteger(env, n); - Botan::BigInt hi(h); - - return Botan::EC_Group(pi, ai, bi, gxi, gyi, ni, hi); - } else if (env->IsInstanceOf(params, ecgen_parameter_spec_class)) { - jmethodID get_name = env->GetMethodID(ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (jstring) env->CallObjectMethod(params, get_name); - const char *utf_name = env->GetStringUTFChars(name, NULL); - std::string curve_name(utf_name); - env->ReleaseStringUTFChars(name, utf_name); - return Botan::EC_Group(curve_name); - } - return Botan::EC_Group(); -} - -static jobject params_from_group(JNIEnv *env, Botan::EC_Group group) { - jobject p = biginteger_from_bigint(env, group.get_p()); - - jmethodID fp_field_init = env->GetMethodID(fp_field_class, "<init>", "(Ljava/math/BigInteger;)V"); - jobject fp_field = env->NewObject(fp_field_class, fp_field_init, p); - - jobject a = biginteger_from_bigint(env, group.get_a()); - jobject b = biginteger_from_bigint(env, group.get_b()); - - jmethodID elliptic_curve_init = env->GetMethodID(elliptic_curve_class, "<init>", "(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject elliptic_curve = env->NewObject(elliptic_curve_class, elliptic_curve_init, fp_field, a, b); - - const Botan::PointGFp& generator = group.get_base_point(); - jobject gx = biginteger_from_bigint(env, generator.get_affine_x()); - jobject gy = biginteger_from_bigint(env, generator.get_affine_y()); - - jmethodID point_init = env->GetMethodID(point_class, "<init>", "(Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject g = env->NewObject(point_class, point_init, gx, gy); - - const Botan::BigInt& order = group.get_order(); - jobject n = biginteger_from_bigint(env, order); - - const Botan::BigInt& cofactor = group.get_cofactor(); - jint h = (jint) cofactor.to_u32bit(); - - jmethodID ec_parameter_spec_init = env->GetMethodID(ec_parameter_spec_class, "<init>", "(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V"); - return env->NewObject(ec_parameter_spec_class, ec_parameter_spec_init, elliptic_curve, g, n, h); -} - -static jobject generate_from_group(JNIEnv* env, jobject self, Botan::EC_Group group) { - jclass botan_kpg_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi$Botan"); - jfieldID type_id = env->GetFieldID(botan_kpg_class, "type", "Ljava/lang/String;"); - jstring type = (jstring) env->GetObjectField(self, type_id); - const char* type_data = env->GetStringUTFChars(type, NULL); - std::string type_str(type_data); - env->ReleaseStringUTFChars(type, type_data); - - std::unique_ptr<Botan::EC_PrivateKey> skey; - try { - native_timing_start(); - if (type_str == "ECDH") { - skey = std::make_unique<Botan::ECDH_PrivateKey>(rng, group); - } else if (type_str == "ECDSA") { - skey = std::make_unique<Botan::ECDSA_PrivateKey>(rng, group); - } else if (type_str == "ECKCDSA") { - skey = std::make_unique<Botan::ECKCDSA_PrivateKey>(rng, group); - } else if (type_str == "ECGDSA") { - skey = std::make_unique<Botan::ECGDSA_PrivateKey>(rng, group); - } - native_timing_stop(); - } catch (Botan::Exception & ex) { - throw_new(env, "java/security/GeneralSecurityException", ex.what()); - return NULL; - } - - jobject ec_param_spec = params_from_group(env, group); - - const Botan::PointGFp& pub_point = skey->public_point(); - std::vector<uint8_t> pub_data = pub_point.encode(Botan::PointGFp::UNCOMPRESSED); - - jbyteArray pub_bytearray = env->NewByteArray(pub_data.size()); - jbyte *pub_bytes = env->GetByteArrayElements(pub_bytearray, NULL); - std::copy(pub_data.begin(), pub_data.end(), pub_bytes); - env->ReleaseByteArrayElements(pub_bytearray, pub_bytes, 0); - - jobject ec_pub_param_spec = env->NewLocalRef(ec_param_spec); - jmethodID ec_pub_init = env->GetMethodID(pubkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject pubkey = env->NewObject(pubkey_class, ec_pub_init, pub_bytearray, ec_pub_param_spec); - - const Botan::BigInt& priv_scalar = skey->private_value(); - std::vector<uint8_t> priv_data = Botan::BigInt::encode(priv_scalar); - - jbyteArray priv_bytearray = env->NewByteArray(priv_data.size()); - jbyte *priv_bytes = env->GetByteArrayElements(priv_bytearray, NULL); - std::copy(priv_data.begin(), priv_data.end(), priv_bytes); - env->ReleaseByteArrayElements(priv_bytearray, priv_bytes, 0); - - jobject ec_priv_param_spec = env->NewLocalRef(ec_param_spec); - jmethodID ec_priv_init = env->GetMethodID(privkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject privkey = env->NewObject(privkey_class, ec_priv_init, priv_bytearray, ec_priv_param_spec); - - jmethodID keypair_init = env->GetMethodID(keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V"); - - return env->NewObject(keypair_class, keypair_init, pubkey, privkey); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Botan_generate__ILjava_security_SecureRandom_2(JNIEnv *env, jobject self, jint keysize, jobject random){ - const std::set<std::string>& curves = Botan::EC_Group::known_named_groups(); - for (auto it = curves.begin(); it != curves.end(); ++it) { - Botan::EC_Group curve_group = Botan::EC_Group(*it); - size_t curve_size = curve_group.get_p_bits(); - if (curve_size == (size_t) keysize) { - //generate on this group. Even thou no default groups are present... - return generate_from_group(env, self, curve_group); - } - } - - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found."); - return NULL; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Botan_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(JNIEnv *env, jobject self, jobject params, jobject random){ - Botan::EC_Group curve_group = group_from_params(env, params); - return generate_from_group(env, self, curve_group); -} - -static std::string get_kdf(const std::string& type_str, size_t *kdf_bits) { - std::string kdf; - size_t key_len = 0; - if (type_str == "ECDH") { - kdf = "Raw"; - //key len unused - } else if (type_str == "ECDHwithSHA1KDF") { - kdf = "KDF2(SHA-1)"; - key_len = 20; - } else if (type_str == "ECDHwithSHA224KDF") { - kdf = "KDF2(SHA-224)"; - key_len = 28; - } else if (type_str == "ECDHwithSHA256KDF") { - kdf = "KDF2(SHA-256)"; - key_len = 32; - } else if (type_str == "ECDHwithSHA384KDF") { - kdf = "KDF2(SHA-384)"; - key_len = 48; - } else if (type_str == "ECDHwithSHA512KDF") { - kdf = "KDF2(SHA-512)"; - key_len = 64; - } - - if (*kdf_bits == 0) { - *kdf_bits = key_len; - } - - return kdf; -} - -jbyteArray generate_secret(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm) { - Botan::EC_Group curve_group = group_from_params(env, params); - - jsize privkey_length = env->GetArrayLength(privkey); - jbyte *privkey_data = env->GetByteArrayElements(privkey, NULL); - Botan::BigInt privkey_scalar((unsigned char *) privkey_data, privkey_length); - env->ReleaseByteArrayElements(privkey, privkey_data, JNI_ABORT); - - Botan::ECDH_PrivateKey skey(rng, curve_group, privkey_scalar); - - jsize pubkey_length = env->GetArrayLength(pubkey); - jbyte *pubkey_data = env->GetByteArrayElements(pubkey, NULL); - Botan::PointGFp public_point = curve_group.OS2ECP((uint8_t*) pubkey_data, pubkey_length); - env->ReleaseByteArrayElements(pubkey, pubkey_data, JNI_ABORT); - - Botan::ECDH_PublicKey pkey(curve_group, public_point); - //TODO: do check_key here? - - jclass botan_ka_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi$Botan"); - jfieldID type_id = env->GetFieldID(botan_ka_class, "type", "Ljava/lang/String;"); - jstring type = (jstring) env->GetObjectField(self, type_id); - const char *type_data = env->GetStringUTFChars(type, NULL); - std::string type_str(type_data); - env->ReleaseStringUTFChars(type, type_data); - - size_t key_len = (get_kdf_bits(env, algorithm) + 7) / 8; - std::string kdf = get_kdf(type_str, &key_len); - - Botan::PK_Key_Agreement ka(skey, rng, kdf); - - std::vector<uint8_t> derived; - try { - native_timing_start(); - derived = Botan::unlock(ka.derive_key(key_len, pkey.public_value()).bits_of()); - native_timing_stop(); - } catch (Botan::Exception & ex) { - throw_new(env, "java/security/GeneralSecurityException", ex.what()); - return NULL; - } - jbyteArray result = env->NewByteArray(derived.size()); - jbyte *result_data = env->GetByteArrayElements(result, NULL); - std::copy(derived.begin(), derived.end(), result_data); - env->ReleaseByteArrayElements(result, result_data, 0); - - return result; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Botan_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params){ - return generate_secret(env, self, pubkey, privkey, params, NULL); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Botan_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm) { - jbyteArray secret = generate_secret(env, self, pubkey, privkey, params, algorithm); - if (secret == NULL) { - return NULL; - } - jmethodID spec_init = env->GetMethodID(secret_key_spec_class, "<init>", ("([BLjava/lang/String;)V")); - return env->NewObject(secret_key_spec_class, spec_init, secret, algorithm); -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Botan_sign(JNIEnv *env, jobject self, jbyteArray data, jbyteArray privkey, jobject params){ - Botan::EC_Group curve_group = group_from_params(env, params); - - jclass botan_sig_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi$Botan"); - jfieldID type_id = env->GetFieldID(botan_sig_class, "type", "Ljava/lang/String;"); - jstring type = (jstring) env->GetObjectField(self, type_id); - const char *type_data = env->GetStringUTFChars(type, NULL); - std::string type_str(type_data); - env->ReleaseStringUTFChars(type, type_data); - - jsize privkey_length = env->GetArrayLength(privkey); - jbyte *privkey_bytes = env->GetByteArrayElements(privkey, NULL); - Botan::BigInt privkey_scalar((uint8_t*) privkey_bytes, privkey_length); - env->ReleaseByteArrayElements(privkey, privkey_bytes, JNI_ABORT); - - std::unique_ptr<Botan::EC_PrivateKey> skey; - if (type_str.find("ECDSA") != std::string::npos) { - skey = std::make_unique<Botan::ECDSA_PrivateKey>(rng, curve_group, privkey_scalar); - } else if (type_str.find("ECKCDSA") != std::string::npos) { - skey = std::make_unique<Botan::ECKCDSA_PrivateKey>(rng, curve_group, privkey_scalar); - } else if (type_str.find("ECGDSA") != std::string::npos) { - skey = std::make_unique<Botan::ECGDSA_PrivateKey>(rng, curve_group, privkey_scalar); - } - - std::string emsa; - if (type_str.find("NONE") != std::string::npos) { - emsa = "Raw"; - } else if (type_str.find("SHA1") != std::string::npos) { - emsa = "EMSA1(SHA-1)"; - } else if (type_str.find("SHA224") != std::string::npos) { - emsa = "EMSA1(SHA-224)"; - } else if (type_str.find("SHA256") != std::string::npos) { - emsa = "EMSA1(SHA-256)"; - } else if (type_str.find("SHA384") != std::string::npos) { - emsa = "EMSA1(SHA-384)"; - } else if (type_str.find("SHA512") != std::string::npos) { - emsa = "EMSA1(SHA-512)"; - } - - Botan::PK_Signer signer(*skey, rng, emsa, Botan::DER_SEQUENCE); - - jsize data_length = env->GetArrayLength(data); - jbyte *data_bytes = env->GetByteArrayElements(data, NULL); - std::vector<uint8_t> sig; - try { - native_timing_start(); - sig = signer.sign_message((uint8_t*) data_bytes, data_length, rng); - native_timing_stop(); - } catch (Botan::Exception & ex) { - throw_new(env, "java/security/GeneralSecurityException", ex.what()); - env->ReleaseByteArrayElements(data, data_bytes, JNI_ABORT); - return NULL; - } - env->ReleaseByteArrayElements(data, data_bytes, JNI_ABORT); - - jbyteArray result = env->NewByteArray(sig.size()); - jbyte *result_data = env->GetByteArrayElements(result, NULL); - std::copy(sig.begin(), sig.end(), result_data); - env->ReleaseByteArrayElements(result, result_data, 0); - - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Botan_verify(JNIEnv *env, jobject self, jbyteArray signature, jbyteArray data, jbyteArray pubkey, jobject params){ - Botan::EC_Group curve_group = group_from_params(env, params); - - jclass botan_sig_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi$Botan"); - jfieldID type_id = env->GetFieldID(botan_sig_class, "type", "Ljava/lang/String;"); - jstring type = (jstring) env->GetObjectField(self, type_id); - const char *type_data = env->GetStringUTFChars(type, NULL); - std::string type_str(type_data); - env->ReleaseStringUTFChars(type, type_data); - - jsize pubkey_length = env->GetArrayLength(pubkey); - jbyte *pubkey_data = env->GetByteArrayElements(pubkey, NULL); - Botan::PointGFp public_point = curve_group.OS2ECP((uint8_t*) pubkey_data, pubkey_length); - env->ReleaseByteArrayElements(pubkey, pubkey_data, JNI_ABORT); - - std::unique_ptr<Botan::EC_PublicKey> pkey; - if (type_str.find("ECDSA") != std::string::npos) { - pkey = std::make_unique<Botan::ECDSA_PublicKey>(curve_group, public_point); - } else if (type_str.find("ECKCDSA") != std::string::npos) { - pkey = std::make_unique<Botan::ECKCDSA_PublicKey>(curve_group, public_point); - } else if (type_str.find("ECGDSA") != std::string::npos) { - pkey = std::make_unique<Botan::ECGDSA_PublicKey>(curve_group, public_point); - } - - std::string emsa; - if (type_str.find("NONE") != std::string::npos) { - emsa = "Raw"; - } else if (type_str.find("SHA1") != std::string::npos) { - emsa = "EMSA1(SHA-1)"; - } else if (type_str.find("SHA224") != std::string::npos) { - emsa = "EMSA1(SHA-224)"; - } else if (type_str.find("SHA256") != std::string::npos) { - emsa = "EMSA1(SHA-256)"; - } else if (type_str.find("SHA384") != std::string::npos) { - emsa = "EMSA1(SHA-384)"; - } else if (type_str.find("SHA512") != std::string::npos) { - emsa = "EMSA1(SHA-512)"; - } - - Botan::PK_Verifier verifier(*pkey, emsa, Botan::DER_SEQUENCE); - - jsize data_length = env->GetArrayLength(data); - jsize sig_length = env->GetArrayLength(signature); - jbyte *data_bytes = env->GetByteArrayElements(data, NULL); - jbyte *sig_bytes = env->GetByteArrayElements(signature, NULL); - - bool result; - try { - native_timing_start(); - result = verifier.verify_message((uint8_t*)data_bytes, data_length, (uint8_t*)sig_bytes, sig_length); - native_timing_stop(); - } catch (Botan::Exception & ex) { - throw_new(env, "java/security/GeneralSecurityException", ex.what()); - env->ReleaseByteArrayElements(data, data_bytes, JNI_ABORT); - env->ReleaseByteArrayElements(signature, sig_bytes, JNI_ABORT); - return JNI_FALSE; - } - env->ReleaseByteArrayElements(data, data_bytes, JNI_ABORT); - env->ReleaseByteArrayElements(signature, sig_bytes, JNI_ABORT); - if (result) { - return JNI_TRUE; - } - return JNI_FALSE; -}
\ No newline at end of file diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/c_timing.c b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/c_timing.c deleted file mode 100644 index 018ceda..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/c_timing.c +++ /dev/null @@ -1,254 +0,0 @@ -#include "c_timing.h" - -#if __linux || __posix - -#include <unistd.h> -#include <time.h> -#include <string.h> - -static unsigned long long tsc_start = 0; -static unsigned long long tsc_end = 0; -static unsigned long long tsc_partial = 0; -static const char *rdtsc_unit = "instr"; - -static inline unsigned long long rdtsc(void) { - unsigned long long int x; - __asm__ volatile ("rdtsc" : "=A" (x)); - return x; -} - -static jlong rdtsc_timing_resolution() { - return 1; -} - -static void rdtsc_timing_start() { - tsc_partial = 0; - tsc_start = rdtsc(); -} - -static void rdtsc_timing_pause() { - tsc_end = rdtsc(); - tsc_partial += tsc_end - tsc_start; -} - -static void rdtsc_timing_restart() { - tsc_start = rdtsc(); -} - -static void rdtsc_timing_stop() { - tsc_end = rdtsc(); -} - -static jlong rdtsc_timing_last() { - jlong res = (jlong) ((tsc_end - tsc_start) + tsc_partial); - if (res < 0) { - return 0; - } else { - return res; - } -} - -static struct timespec start = {0}; -static struct timespec end = {0}; -static jlong partial = 0; -static clockid_t clk_id = CLOCK_MONOTONIC_RAW; -static const char *clock_unit = "nano"; - -static jlong clock_timing_resolution() { - struct timespec timeval; - clock_getres(clk_id, &timeval); - return timeval.tv_nsec; -} - -static void clock_timing_start() { - partial = 0; - clock_gettime(clk_id, &start); -} - -static void clock_timing_pause() { - clock_gettime(clk_id, &end); - partial += (end.tv_sec - start.tv_sec) * 1000000000 + (end.tv_nsec - start.tv_nsec); -} - -static void clock_timing_restart() { - clock_gettime(clk_id, (struct timespec *)&start); -} - -static void clock_timing_stop() { - clock_gettime(clk_id, (struct timespec *)&end); -} - -static jlong clock_timing_last() { - jlong res = (end.tv_sec - start.tv_sec) * 1000000000 + (end.tv_nsec - start.tv_nsec) + partial; - if (res < 0) { - return 0; - } else { - return res; - } -} - -static jlong (*func_timing_resolution)() = &clock_timing_resolution; -static void (*func_timing_start)() = &clock_timing_start; -static void (*func_timing_pause)() = &clock_timing_pause; -static void (*func_timing_restart)() = &clock_timing_restart; -static void (*func_timing_stop)() = &clock_timing_stop; -static jlong (*func_timing_last)() = &clock_timing_last; -static const char *unit = "nano"; - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_NativeECLibrary_getNativeTimingSupport(JNIEnv *env, jobject self) { - jclass set_class = (*env)->FindClass(env, "java/util/TreeSet"); - - jmethodID set_ctr = (*env)->GetMethodID(env, set_class, "<init>", "()V"); - jmethodID set_add = (*env)->GetMethodID(env, set_class, "add", "(Ljava/lang/Object;)Z"); - - jobject result = (*env)->NewObject(env, set_class, set_ctr); - (*env)->CallBooleanMethod(env, result, set_add, (*env)->NewStringUTF(env, "rdtsc")); - (*env)->CallBooleanMethod(env, result, set_add, (*env)->NewStringUTF(env, "monotonic")); - (*env)->CallBooleanMethod(env, result, set_add, (*env)->NewStringUTF(env, "monotonic-raw")); - (*env)->CallBooleanMethod(env, result, set_add, (*env)->NewStringUTF(env, "cputime-processor")); - (*env)->CallBooleanMethod(env, result, set_add, (*env)->NewStringUTF(env, "cputime-thread")); - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_NativeECLibrary_setNativeTimingType(JNIEnv *env, jobject self, jstring type) { - const char *type_data = (*env)->GetStringUTFChars(env, type, NULL); - - if (strcmp(type_data, "rdtsc") == 0) { - func_timing_resolution = &rdtsc_timing_resolution; - func_timing_start = &rdtsc_timing_start; - func_timing_pause = &rdtsc_timing_pause; - func_timing_restart = &rdtsc_timing_restart; - func_timing_stop = &rdtsc_timing_stop; - func_timing_last = &rdtsc_timing_last; - unit = rdtsc_unit; - return JNI_TRUE; - } else { - if (strcmp(type_data, "monotonic") == 0) { - clk_id = CLOCK_MONOTONIC; - } else if (strcmp(type_data, "monotonic-raw") == 0) { - clk_id = CLOCK_MONOTONIC_RAW; - } else if (strcmp(type_data, "cputime-processor") == 0) { - clk_id = CLOCK_PROCESS_CPUTIME_ID; - } else if (strcmp(type_data, "cputime-thread") == 0) { - clk_id = CLOCK_THREAD_CPUTIME_ID; - } else { - return JNI_FALSE; - } - - func_timing_resolution = &clock_timing_resolution; - func_timing_start = &clock_timing_start; - func_timing_pause = &clock_timing_pause; - func_timing_restart = &clock_timing_restart; - func_timing_stop = &clock_timing_stop; - func_timing_last = &clock_timing_last; - unit = clock_unit; - return JNI_TRUE; - } -} - -JNIEXPORT jlong JNICALL Java_cz_crcs_ectester_standalone_libs_NativeECLibrary_getNativeTimingResolution(JNIEnv *env, jobject self) { - return native_timing_resolution(); -} - -JNIEXPORT jstring JNICALL Java_cz_crcs_ectester_standalone_libs_NativeECLibrary_getNativeTimingUnit(JNIEnv *env, jobject self) { - return (*env)->NewStringUTF(env, unit); -} - -JNIEXPORT jlong JNICALL Java_cz_crcs_ectester_standalone_libs_NativeECLibrary_getLastNativeTiming(JNIEnv *env, jobject self) { - return native_timing_last(); -} - -jlong native_timing_resolution() { - return func_timing_resolution(); -} - -void native_timing_start() { - func_timing_start(); -} - -void native_timing_pause() { - func_timing_pause(); -} - -void native_timing_restart() { - func_timing_restart(); -} - -void native_timing_stop() { - func_timing_stop(); -} - -jlong native_timing_last() { - return func_timing_last(); -} - -#elif defined(__WIN32__) || defined(_MSC_VER) - -#include <Windows.h> -#error TODO - -static LARGE_INTEGER start = {0}; -static LARGE_INTEGER end = {0}; -static jlong partial = 0; - -jboolean native_timing_supported() { - return JNI_TRUE; -} - -jlong native_timing_resolution() { - LARGE_INTEGER freq; - QueryPerformanceFrequency(&freq); - return 1000000000 / freq.QuadPart; -} - -void native_timing_start() { - partial = 0; - QueryPerformanceCounter(&start); -} - -void native_timing_pause() { - QueryPerformanceCounter(&end); - partial = (end.QuadPart - start.QuadPart) * native_timing_resolution(); -} - -void native_timing_restart() { - QueryPerformanceCounter(&start); -} - -void native_timing_stop() { - QueryPerformanceCounter(&end); -} - -jlong native_timing_last() { - jlong res = (end.QuadPart - start.QuadPart) * native_timing_resolution() + partial; - if (res < 0) { - return 0; - } else { - return res; - } -} - -#else - -#error TODO -jboolean native_timing_supported() { - return JNI_FALSE; -} - -jlong native_timing_resolution() { - return 0; -} - -void native_timing_start() {} - -void native_timing_pause() {} - -void native_timing_restart() {} - -void native_timing_stop() {} - -jlong native_timing_last() { - return 0; -} - -#endif diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/c_timing.h b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/c_timing.h deleted file mode 100644 index e12ccdd..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/c_timing.h +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once - -#include <jni.h> - -#ifdef __cplusplus -extern "C" -{ -#endif - -/** - * - */ -__attribute__((visibility("default"))) jlong native_timing_resolution(); - -/** - * - */ -__attribute__((visibility("default"))) void native_timing_start(); - -/** - * - */ -__attribute__((visibility("default"))) void native_timing_pause(); - -/** - * - */ -__attribute__((visibility("default"))) void native_timing_restart(); - -/** - * - */ -__attribute__((visibility("default"))) void native_timing_stop(); - -/** - * - */ -__attribute__((visibility("default"))) jlong native_timing_last(); - - - -#ifdef __cplusplus -} -#endif diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/c_utils.c b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/c_utils.c deleted file mode 100644 index 46286fd..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/c_utils.c +++ /dev/null @@ -1,252 +0,0 @@ -#include "c_utils.h" -#define _ISOC99_SOURCE -#include <string.h> -#include <stdlib.h> - -#if defined(__WIN32__) || defined(_MSC_VER) -#include <windows.h> -#endif - -jclass ec_parameter_spec_class; -jclass ecgen_parameter_spec_class; -jclass secret_key_spec_class; -jclass pubkey_class; -jclass privkey_class; -jclass keypair_class; -jclass elliptic_curve_class; -jclass fp_field_class; -jclass f2m_field_class; -jclass point_class; -jclass biginteger_class; -jclass illegal_state_exception_class; - -void init_classes(JNIEnv *env, const char* lib_name) { - jclass local_ec_parameter_spec_class = (*env)->FindClass(env, "java/security/spec/ECParameterSpec"); - ec_parameter_spec_class = (*env)->NewGlobalRef(env, local_ec_parameter_spec_class); - - jclass local_ecgen_parameter_spec_class = (*env)->FindClass(env, "java/security/spec/ECGenParameterSpec"); - ecgen_parameter_spec_class = (*env)->NewGlobalRef(env, local_ecgen_parameter_spec_class); - - jclass local_secret_key_spec_class = (*env)->FindClass(env, "javax/crypto/spec/SecretKeySpec"); - secret_key_spec_class = (*env)->NewGlobalRef(env, local_secret_key_spec_class); - - const char *pubkey_base = "cz/crcs/ectester/standalone/libs/jni/NativeECPublicKey$"; - char pubkey_class_name[2048] = { 0 }; //strlen(pubkey_base) + strlen(lib_name) + 1 - pubkey_class_name[0] = 0; - strcat(pubkey_class_name, pubkey_base); - strcat(pubkey_class_name, lib_name); - - jclass local_pubkey_class = (*env)->FindClass(env, pubkey_class_name); - pubkey_class = (*env)->NewGlobalRef(env, local_pubkey_class); - - const char *privkey_base = "cz/crcs/ectester/standalone/libs/jni/NativeECPrivateKey$"; - char privkey_class_name[2048] = { 0 }; //strlen(privkey_base) + strlen(lib_name) + 1 - privkey_class_name[0] = 0; - strcat(privkey_class_name, privkey_base); - strcat(privkey_class_name, lib_name); - - jclass local_privkey_class = (*env)->FindClass(env, privkey_class_name); - privkey_class = (*env)->NewGlobalRef(env, local_privkey_class); - - jclass local_keypair_class = (*env)->FindClass(env, "java/security/KeyPair"); - keypair_class = (*env)->NewGlobalRef(env, local_keypair_class); - - jclass local_elliptic_curve_class = (*env)->FindClass(env, "java/security/spec/EllipticCurve"); - elliptic_curve_class = (*env)->NewGlobalRef(env, local_elliptic_curve_class); - - jclass local_fp_field_class = (*env)->FindClass(env, "java/security/spec/ECFieldFp"); - fp_field_class = (*env)->NewGlobalRef(env, local_fp_field_class); - - jclass local_f2m_field_class = (*env)->FindClass(env, "java/security/spec/ECFieldF2m"); - f2m_field_class = (*env)->NewGlobalRef(env, local_f2m_field_class); - - jclass local_biginteger_class = (*env)->FindClass(env, "java/math/BigInteger"); - biginteger_class = (*env)->NewGlobalRef(env, local_biginteger_class); - - jclass local_point_class = (*env)->FindClass(env, "java/security/spec/ECPoint"); - point_class = (*env)->NewGlobalRef(env, local_point_class); - - jclass local_illegal_state_exception_class = (*env)->FindClass(env, "java/lang/IllegalStateException"); - illegal_state_exception_class = (*env)->NewGlobalRef(env, local_illegal_state_exception_class); -} - -void throw_new(JNIEnv *env, const char *class, const char *message) { - jclass clazz = (*env)->FindClass(env, class); - (*env)->ThrowNew(env, clazz, message); -} - -void throw_new_var(JNIEnv *env, const char *class, const char *format, ...) { - char buffer[2048]; - va_list args; - va_start(args, format); - vsnprintf(buffer, 2048, format, args); - va_end(args); - throw_new(env, class, buffer); -} - -jint get_kdf_bits(JNIEnv *env, jstring algorithm) { - if (algorithm == NULL) { - return 0; - } - - const char *algo_data = (*env)->GetStringUTFChars(env, algorithm, NULL); - - jint result = 0; - if (strcmp(algo_data, "DES") == 0) { - result = 64; - } else if (strcmp(algo_data, "BLOWFISH") == 0) { - result = 128; - } else if (strcmp(algo_data, "DESEDE") == 0) { - result = 192; - } else if (strcmp(algo_data, "AES") == 0 || strcmp(algo_data, "CAMELLIA") == 0) { - result = 256; - } else { - char *end; - long bits = strtol(algo_data, &end, 10); - if (*end == 0) { - result = (jint) bits; - } - } - (*env)->ReleaseStringUTFChars(env, algorithm, algo_data); - return result; -} - -jbyteArray asn1_der_encode(JNIEnv *env, const jbyte *r, size_t r_len, const jbyte *s, size_t s_len) { - const jbyte *rtmp = r; - while (*rtmp++ == 0) { - r++; - r_len--; - } - const jbyte *stmp = s; - while (*stmp++ == 0) { - s++; - s_len--; - } - - jbyte r_length = (jbyte) r_len + (r[0] & 0x80 ? 1 : 0); - jbyte s_length = (jbyte) s_len + (s[0] & 0x80 ? 1 : 0); - - // R and S are < 128 bytes, so 1 byte tag + 1 byte len + len bytes value - size_t seq_value_len = 2 + r_length + 2 + s_length; - size_t whole_len = seq_value_len; - - // The SEQUENCE length might be >= 128, so more bytes of length - size_t seq_len_len = 0; - if (seq_value_len >= 128) { - size_t s = seq_value_len; - do { - seq_len_len++; - } while ((s = s >> 8)); - } - // seq_len_len bytes for length and one for length of length - whole_len += seq_len_len + 1; - - // 1 byte tag for SEQUENCE - whole_len += 1; - - jbyteArray result = (jbyteArray) (*env)->NewByteArray(env, whole_len); - jbyte *data = (*env)->GetByteArrayElements(env, result, NULL); - size_t i = 0; - data[i++] = 0x30; // SEQUENCE - if (seq_value_len < 128) { - data[i++] = (jbyte) seq_value_len; - } else { - data[i++] = (jbyte) (seq_len_len | (1 << 7)); - for (size_t j = 0; j < seq_len_len; ++j) { - data[i++] = (jbyte) (seq_value_len & (0xff << (8 * (seq_len_len - j - 1)))); - } - } - data[i++] = 0x02; //INTEGER - data[i++] = r_length; - if (r[0] & 0x80) { - data[i++] = 0; - } - memcpy(data + i, r, r_len); - i += r_len; - data[i++] = 0x02; //INTEGER - data[i++] = s_length; - if (s[0] & 0x80) { - data[i++] = 0; - } - memcpy(data + i, s, s_len); - i += s_len; - (*env)->ReleaseByteArrayElements(env, result, data, 0); - - return result; -} - -bool asn1_der_decode(JNIEnv *env, jbyteArray sig, jbyte **r_data, size_t *r_len, jbyte **s_data, size_t *s_len) { - size_t sig_len = (*env)->GetArrayLength(env, sig); - jbyte *data = (*env)->GetByteArrayElements(env, sig, NULL); - size_t i = 0; - if (data[i++] != 0x30) {//SEQUENCE - (*env)->ReleaseByteArrayElements(env, sig, data, JNI_ABORT); - return false; - } - size_t seq_value_len = 0; - if (!(data[i] & 0x80)) { - seq_value_len = data[i++]; - } else { - size_t seq_len_len = data[i++] & 0x7f; - while (seq_len_len > 0) { - seq_value_len |= (data[i++] << (seq_len_len - 1)); - seq_len_len--; - } - } - - if (data[i++] != 0x02) {//INTEGER - (*env)->ReleaseByteArrayElements(env, sig, data, JNI_ABORT); - return false; - } - size_t r_length = data[i++]; - jbyte *r_out = malloc(r_length); - memcpy(r_out, data + i, r_length); - i += r_length; - - if (data[i++] != 0x02) {//INTEGER - free(r_out); - (*env)->ReleaseByteArrayElements(env, sig, data, JNI_ABORT); - return false; - } - size_t s_length = data[i++]; - jbyte *s_out = malloc(s_length); - memcpy(s_out, data + i, s_length); - i += s_length; - - (*env)->ReleaseByteArrayElements(env, sig, data, JNI_ABORT); - if (i != sig_len) { - free(r_out); - free(s_out); - return false; - } - - *r_len = r_length; - *r_data = r_out; - *s_len = s_length; - *s_data = s_out; - return true; -} - -char *biginteger_to_hex(JNIEnv *env, jobject big, jint bytes) { - jmethodID to_string = (*env)->GetMethodID(env, biginteger_class, "toString", "(I)Ljava/lang/String;"); - jstring big_string = (*env)->CallObjectMethod(env, big, to_string, (jint) 16); - - jsize len = (*env)->GetStringUTFLength(env, big_string); -#if defined(__WIN32__) || defined(_MSC_VER) - char *raw_string = _alloca(len); -#else - char raw_string[len]; -#endif - (*env)->GetStringUTFRegion(env, big_string, 0, len, raw_string); - - char *result = calloc(bytes, 2); - if (len >= bytes) { - return strncpy(result, raw_string, 2*bytes); - } else { - jsize diff = bytes - len; - for (jint i = 0; i < diff*2; ++i) { - result[i] = '0'; - } - return strncpy(result + diff*2, raw_string, 2*bytes); - } -}
\ No newline at end of file diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/c_utils.h b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/c_utils.h deleted file mode 100644 index f2f3f2f..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/c_utils.h +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once - -#include "native.h" -#include <stdbool.h> - -/** - * Classes that are accessed alot are cached here, manually. - */ -extern jclass ec_parameter_spec_class; -extern jclass ecgen_parameter_spec_class; -extern jclass secret_key_spec_class; -extern jclass pubkey_class; -extern jclass privkey_class; -extern jclass keypair_class; -extern jclass elliptic_curve_class; -extern jclass fp_field_class; -extern jclass f2m_field_class; -extern jclass point_class; -extern jclass biginteger_class; -extern jclass illegal_state_exception_class; - -/** - * Initialize the classes. - */ -void init_classes(JNIEnv *env, const char* lib_name); - -/** - * Throw a new exception of class with message. - */ -void throw_new(JNIEnv *env, const char *class, const char *message); - -/** - * Throw a new exception of class, with formatted message. - */ -void throw_new_var(JNIEnv *env, const char *class, const char *format, ...); - -/** - * Get the size of the specified key algorithm in bits, for ECDH KDF output size. - */ -jint get_kdf_bits(JNIEnv *env, jstring algorithm); - -/** - * DER encode the r and s values. - */ -jbyteArray asn1_der_encode(JNIEnv *env, const jbyte *r, size_t r_len, const jbyte *s, size_t s_len); - -/** - * DER decode a signature into r and s values. - */ -bool asn1_der_decode(JNIEnv *env, jbyteArray sig, jbyte **r_data, size_t *r_len, jbyte **s_data, size_t *s_len); - -/** - * Convert a BigInteger to an allocated hex string. - */ -char *biginteger_to_hex(JNIEnv *env, jobject big, jint bytes); - -/** - * Some useful defines to init the provider. - */ -#define INIT_PROVIDER(env, provider_class) jmethodID provider_put = (*env)->GetMethodID(env, provider_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;") -#define ADD_PROPERTY(env, self, base_name, base_class, prop_name, prop_class) do { \ - jstring ec = (*env)->NewStringUTF(env, base_name prop_name); \ - jstring ec_value = (*env)->NewStringUTF(env, base_class prop_class); \ - (*env)->CallObjectMethod(env, self, provider_put, ec, ec_value); \ - } 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 diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/cpp_utils.cpp b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/cpp_utils.cpp deleted file mode 100644 index 20d9a3c..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/cpp_utils.cpp +++ /dev/null @@ -1,115 +0,0 @@ -#include "cpp_utils.hpp" - -jclass ec_parameter_spec_class; -jclass ecgen_parameter_spec_class; -jclass secret_key_spec_class; -jclass pubkey_class; -jclass privkey_class; -jclass keypair_class; -jclass elliptic_curve_class; -jclass fp_field_class; -jclass f2m_field_class; -jclass point_class; -jclass biginteger_class; -jclass illegal_state_exception_class; - -void init_classes(JNIEnv *env, std::string lib_name) { - jclass local_ec_parameter_spec_class = env->FindClass("java/security/spec/ECParameterSpec"); - ec_parameter_spec_class = (jclass) env->NewGlobalRef(local_ec_parameter_spec_class); - - jclass local_ecgen_parameter_spec_class = env->FindClass("java/security/spec/ECGenParameterSpec"); - ecgen_parameter_spec_class = (jclass) env->NewGlobalRef(local_ecgen_parameter_spec_class); - - jclass local_secret_key_spec_class = env->FindClass("javax/crypto/spec/SecretKeySpec"); - secret_key_spec_class = (jclass) env->NewGlobalRef(local_secret_key_spec_class); - - std::string pubkey_class_name("cz/crcs/ectester/standalone/libs/jni/NativeECPublicKey$"); - pubkey_class_name += lib_name; - - jclass local_pubkey_class = env->FindClass(pubkey_class_name.c_str()); - pubkey_class = (jclass) env->NewGlobalRef(local_pubkey_class); - - std::string privkey_class_name("cz/crcs/ectester/standalone/libs/jni/NativeECPrivateKey$"); - privkey_class_name += lib_name; - - jclass local_privkey_class = env->FindClass(privkey_class_name.c_str()); - privkey_class = (jclass) env->NewGlobalRef(local_privkey_class); - - jclass local_keypair_class = env->FindClass("java/security/KeyPair"); - keypair_class = (jclass) env->NewGlobalRef(local_keypair_class); - - jclass local_elliptic_curve_class = env->FindClass("java/security/spec/EllipticCurve"); - elliptic_curve_class = (jclass) env->NewGlobalRef(local_elliptic_curve_class); - - jclass local_fp_field_class = env->FindClass("java/security/spec/ECFieldFp"); - fp_field_class = (jclass) env->NewGlobalRef(local_fp_field_class); - - jclass local_f2m_field_class = env->FindClass("java/security/spec/ECFieldF2m"); - f2m_field_class = (jclass) env->NewGlobalRef(local_f2m_field_class); - - jclass local_biginteger_class = env->FindClass("java/math/BigInteger"); - biginteger_class = (jclass) env->NewGlobalRef(local_biginteger_class); - - jclass local_point_class = env->FindClass("java/security/spec/ECPoint"); - point_class = (jclass) env->NewGlobalRef(local_point_class); - - jclass local_illegal_state_exception_class = env->FindClass("java/lang/IllegalStateException"); - illegal_state_exception_class = (jclass) env->NewGlobalRef(local_illegal_state_exception_class); -} - -void throw_new(JNIEnv *env, const std::string& klass, const std::string& message) { - jclass clazz = env->FindClass(klass.c_str()); - env->ThrowNew(clazz, message.c_str()); -} - -jint get_kdf_bits(JNIEnv *env, jstring algorithm) { - if (algorithm == NULL) { - return 0; - } - - const char *algo_data = env->GetStringUTFChars(algorithm, NULL); - std::string algo(algo_data); - - jint result = 0; - if (algo == "DES") { - result = 64; - } else if (algo == "BLOWFISH") { - result = 128; - } else if (algo == "DESEDE") { - result = 192; - } else if (algo == "AES" || algo == "CAMELLIA") { - result = 256; - } else { - char *end; - long bits = strtol(algo_data, &end, 10); - if (*end == 0) { - result = (jint) bits; - } - } - env->ReleaseStringUTFChars(algorithm, algo_data); - return result; -} - -static void add_provider_property(JNIEnv *env, const std::string &type, const std::string &klass, jobject provider, jmethodID put_method) { - jstring type_str = env->NewStringUTF(type.c_str()); - jstring class_str = env->NewStringUTF(klass.c_str()); - env->CallObjectMethod(provider, put_method, type_str, class_str); -} - -void add_kpg(JNIEnv *env, const std::string &type, const std::string &klass, jobject provider, jmethodID put_method) { - const std::string full_type = "KeyPairGenerator." + type; - const std::string full_class = "cz.crcs.ectester.standalone.libs.jni.NativeKeyPairGeneratorSpi$" + klass; - add_provider_property(env, full_type, full_class, provider, put_method); -} - -void add_ka(JNIEnv *env, const std::string &type, const std::string &klass, jobject provider, jmethodID put_method) { - const std::string full_type = "KeyAgreement." + type; - const std::string full_class = "cz.crcs.ectester.standalone.libs.jni.NativeKeyAgreementSpi$" + klass; - add_provider_property(env, full_type, full_class, provider, put_method); -} - -void add_sig(JNIEnv *env, const std::string &type, const std::string &klass, jobject provider, jmethodID put_method) { - const std::string full_type = "Signature." + type; - const std::string full_class = "cz.crcs.ectester.standalone.libs.jni.NativeSignatureSpi$" + klass; - add_provider_property(env, full_type, full_class, provider, put_method); -}
\ No newline at end of file diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/cpp_utils.hpp b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/cpp_utils.hpp deleted file mode 100644 index ed26c01..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/cpp_utils.hpp +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -#include "native.h" -#include <string> - -/** - * Classes that are accessed alot are cached here, manually. - */ -extern jclass ec_parameter_spec_class; -extern jclass ecgen_parameter_spec_class; -extern jclass secret_key_spec_class; -extern jclass pubkey_class; -extern jclass privkey_class; -extern jclass keypair_class; -extern jclass elliptic_curve_class; -extern jclass fp_field_class; -extern jclass f2m_field_class; -extern jclass point_class; -extern jclass biginteger_class; -extern jclass illegal_state_exception_class; - -/** - * Initialize the classes. - */ -void init_classes(JNIEnv *env, std::string lib_name); - -/** - * Throw a new exception of class with message. - */ -void throw_new(JNIEnv *env, const std::string& klass, const std::string& message); - -/** - * Get the size of the specified key algorithm in bits, for ECDH KDF output size. - */ -jint get_kdf_bits(JNIEnv *env, jstring algorithm); - -/** - * Add a KeyPairGeneratorSpi class to this provider. - */ -void add_kpg(JNIEnv *env, const std::string &type, const std::string &klass, jobject provider, jmethodID put_method); - -/** - * Add a KeyAgreementSpi class to this provider. - */ -void add_ka(JNIEnv *env, const std::string &type, const std::string &klass, jobject provider, jmethodID put_method); - -/** - * 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 diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp deleted file mode 100644 index eb782b7..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp +++ /dev/null @@ -1,767 +0,0 @@ -#include "native.h" - -#include <iostream> -using std::cout; -using std::cerr; -using std::endl; - -#include <string> -#include <sstream> -using std::string; - -#include <stdexcept> -using std::runtime_error; - -#include <cstdlib> -using std::exit; - -#include "cryptopp/cryptlib.h" -using CryptoPP::Exception; - -#include "cryptopp/config.h" -using CryptoPP::byte; - -#include "cryptopp/osrng.h" -using CryptoPP::AutoSeededRandomPool; - -#include "cryptopp/sha.h" -using CryptoPP::SHA1; -using CryptoPP::SHA224; -using CryptoPP::SHA256; -using CryptoPP::SHA384; -using CryptoPP::SHA512; - -#include "cryptopp/aes.h" -using CryptoPP::AES; - -#include "cryptopp/modarith.h" -using CryptoPP::ModularArithmetic; - -#include "cryptopp/gf2n.h" -using CryptoPP::PolynomialMod2; -using CryptoPP::GF2NP; -using CryptoPP::GF2NT; -using CryptoPP::GF2NPP; - -#include "cryptopp/eccrypto.h" -using CryptoPP::ECP; -using CryptoPP::EC2N; -using CryptoPP::ECDH; -using CryptoPP::DL_GroupParameters_EC; -using CryptoPP::ECDSA; - -#include "cryptopp/secblock.h" -using CryptoPP::SecByteBlock; - -#include "cryptopp/oids.h" -using CryptoPP::OID; - -#include "cryptopp/dsa.h" -using CryptoPP::DSAConvertSignatureFormat; -using CryptoPP::DSA_DER; -using CryptoPP::DSA_P1363; - -// ASN1 is a namespace, not an object -#include "cryptopp/asn.h" -using namespace CryptoPP::ASN1; - -#include "cryptopp/integer.h" -using CryptoPP::Integer; - - -#include "cpp_utils.hpp" -#include "c_timing.h" - -static jclass provider_class; -static AutoSeededRandomPool rng; - - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_CryptoppLib_createProvider(JNIEnv *env, jobject self) { - /* Create the custom provider. */ - jclass local_provider_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeProvider$Cryptopp"); - provider_class = (jclass) env->NewGlobalRef(local_provider_class); - - jmethodID init = env->GetMethodID(local_provider_class, "<init>", "(Ljava/lang/String;DLjava/lang/String;)V"); - - std::string lib_name = "Crypto++"; - - int lib_version = CRYPTOPP_VERSION; - std::string info_str = std::to_string(lib_version); - std::stringstream ss; - ss << lib_name << " "; - ss << info_str[0]; - for (size_t i = 1; i < info_str.size(); ++i) { - ss << "." << info_str[i]; - } - - jstring name = env->NewStringUTF(lib_name.c_str()); - double version = lib_version / 100; - jstring info = env->NewStringUTF(ss.str().c_str()); - - return env->NewObject(provider_class, init, name, version, info); -} - -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Cryptopp_setup(JNIEnv *env, jobject self){ - jmethodID provider_put = env->GetMethodID(provider_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); - - add_kpg(env, "ECDH", "CryptoppECDH", self, provider_put); - add_kpg(env, "ECDSA", "CryptoppECDSA", self, provider_put); - - add_ka(env, "ECDH", "CryptoppECDH", self, provider_put); - - add_sig(env, "SHA1withECDSA", "CryptoppECDSAwithSHA1", self, provider_put); - add_sig(env, "SHA224withECDSA", "CryptoppECDSAwithSHA224", self, provider_put); - add_sig(env, "SHA256withECDSA", "CryptoppECDSAwithSHA256", self, provider_put); - add_sig(env, "SHA384withECDSA", "CryptoppECDSAwithSHA384", self, provider_put); - add_sig(env, "SHA512withECDSA", "CryptoppECDSAwithSHA512", self, provider_put); - - init_classes(env, "Cryptopp"); -} - -template <class EC> static std::vector<OID> get_curve_oids() { - std::vector<OID> oids; - OID it = OID(); - do { - it = DL_GroupParameters_EC<EC>::GetNextRecommendedParametersOID(it); - if (it == OID()) { - break; - } - oids.push_back(it); - } while (true); - - return oids; -} - -static std::vector<OID> get_all_curve_oids() { - std::vector<OID> ecp_oids = get_curve_oids<ECP>(); - std::vector<OID> ec2n_oids = get_curve_oids<EC2N>(); - - std::vector<OID> all_oids; - all_oids.insert(all_oids.end(), ecp_oids.begin(), ecp_oids.end()); - all_oids.insert(all_oids.end(), ec2n_oids.begin(), ec2n_oids.end()); - return all_oids; -} - -static std::string oid_to_str(const OID &oid) { - const std::vector<CryptoPP::word32>& oid_values = oid.GetValues(); - std::stringstream ss; - for (size_t i = 0; i < oid_values.size(); ++i) { - if(i != 0) - ss << "."; - ss << std::to_string(oid_values[i]); - } - return ss.str(); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_CryptoppLib_getCurves(JNIEnv *env, jobject self){ - jclass set_class = env->FindClass("java/util/TreeSet"); - - jmethodID set_ctr = env->GetMethodID(set_class, "<init>", "()V"); - jmethodID set_add = env->GetMethodID(set_class, "add", "(Ljava/lang/Object;)Z"); - - jobject result = env->NewObject(set_class, set_ctr); - - std::vector<OID> all_oids = get_all_curve_oids(); - - for (auto oid = all_oids.begin(); oid != all_oids.end(); ++oid) { - jstring name_str = env->NewStringUTF(oid_to_str(*oid).c_str()); - env->CallBooleanMethod(result, set_add, name_str); - } - - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Cryptopp_keysizeSupported(JNIEnv *env, jobject self, jint keysize){ - std::vector<OID> ecp_oids = get_curve_oids<ECP>(); - for (auto oid = ecp_oids.begin(); oid != ecp_oids.end(); ++oid) { - DL_GroupParameters_EC<ECP> group(*oid); - if (((jint) group.GetCurve().GetField().MaxElementBitLength()) == keysize) { - return JNI_TRUE; - } - } - - std::vector<OID> e2n_oids = get_curve_oids<EC2N>(); - for (auto oid = e2n_oids.begin(); oid != e2n_oids.end(); ++oid) { - DL_GroupParameters_EC<EC2N> group(*oid); - if (((jint) group.GetCurve().FieldSize().ConvertToLong()) == keysize) { - return JNI_TRUE; - } - } - return JNI_FALSE; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Cryptopp_paramsSupported(JNIEnv *env, jobject self, jobject params){ - if (params == NULL) { - return JNI_FALSE; - } - - if (env->IsInstanceOf(params, ec_parameter_spec_class)) { - // Any custom params should be supported. - return JNI_TRUE; - } else if (env->IsInstanceOf(params, ecgen_parameter_spec_class)) { - // Compare with OIDs I guess? - jmethodID get_name = env->GetMethodID(ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (jstring) env->CallObjectMethod(params, get_name); - const char *utf_name = env->GetStringUTFChars(name, NULL); - std::string str_name(utf_name); - env->ReleaseStringUTFChars(name, utf_name); - - std::vector<OID> all_oids = get_all_curve_oids(); - for (auto oid = all_oids.begin(); oid != all_oids.end(); ++oid) { - std::string oid_s = oid_to_str(*oid); - if (str_name == oid_s) { - return JNI_TRUE; - } - } - } - return JNI_FALSE; -} - -static Integer integer_from_biginteger(JNIEnv *env, jobject bigint) { - jmethodID to_byte_array = env->GetMethodID(biginteger_class, "toByteArray", "()[B"); - - jbyteArray byte_array = (jbyteArray) env->CallObjectMethod(bigint, to_byte_array); - jsize byte_length = env->GetArrayLength(byte_array); - jbyte *byte_data = env->GetByteArrayElements(byte_array, NULL); - Integer result((byte *) byte_data, (size_t) byte_length); - env->ReleaseByteArrayElements(byte_array, byte_data, JNI_ABORT); - return result; -} - -static jobject biginteger_from_integer(JNIEnv *env, const Integer &integer) { - jbyteArray byte_array = (jbyteArray) env->NewByteArray(integer.MinEncodedSize()); - - jbyte *bigint_bytes = env->GetByteArrayElements(byte_array, NULL); - integer.Encode((byte *) bigint_bytes, integer.MinEncodedSize()); - env->ReleaseByteArrayElements(byte_array, bigint_bytes, 0); - - jmethodID biginteger_init = env->GetMethodID(biginteger_class, "<init>", "(I[B)V"); - return env->NewObject(biginteger_class, biginteger_init, (jint) 1, byte_array); -} - -static jobject biginteger_from_polmod2(JNIEnv *env, const PolynomialMod2 &polmod) { - jmethodID biginteger_init = env->GetMethodID(biginteger_class, "<init>", "(I[B)V"); - - jbyteArray mod_array = env->NewByteArray(polmod.MinEncodedSize()); - jbyte *mod_data = env->GetByteArrayElements(mod_array, NULL); - polmod.Encode((byte *) mod_data, polmod.MinEncodedSize()); - env->ReleaseByteArrayElements(mod_array, mod_data, 0); - - return env->NewObject(biginteger_class, biginteger_init, (jint) 1, mod_array); -} - -static std::unique_ptr<DL_GroupParameters_EC<ECP>> fp_group_from_params(JNIEnv *env, jobject params) { - if (env->IsInstanceOf(params, ec_parameter_spec_class)) { - jmethodID get_curve = env->GetMethodID(ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject elliptic_curve = env->CallObjectMethod(params, get_curve); - - jmethodID get_field = env->GetMethodID(elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = env->CallObjectMethod(elliptic_curve, get_field); - - if (!env->IsInstanceOf(field, fp_field_class)) { - return nullptr; - } - - jmethodID get_a = env->GetMethodID(elliptic_curve_class, "getA", "()Ljava/math/BigInteger;"); - jobject a = env->CallObjectMethod(elliptic_curve, get_a); - Integer ai = integer_from_biginteger(env, a); - - jmethodID get_b = env->GetMethodID(elliptic_curve_class, "getB", "()Ljava/math/BigInteger;"); - jobject b = env->CallObjectMethod(elliptic_curve, get_b); - Integer bi = integer_from_biginteger(env, b); - - jmethodID get_g = env->GetMethodID(ec_parameter_spec_class, "getGenerator", "()Ljava/security/spec/ECPoint;"); - jobject g = env->CallObjectMethod(params, get_g); - - jmethodID get_x = env->GetMethodID(point_class, "getAffineX", "()Ljava/math/BigInteger;"); - jobject gx = env->CallObjectMethod(g, get_x); - - jmethodID get_y = env->GetMethodID(point_class, "getAffineY", "()Ljava/math/BigInteger;"); - jobject gy = env->CallObjectMethod(g, get_y); - - jmethodID get_n = env->GetMethodID(ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;"); - jobject n = env->CallObjectMethod(params, get_n); - Integer ni = integer_from_biginteger(env, n); - - jmethodID get_h = env->GetMethodID(ec_parameter_spec_class, "getCofactor", "()I"); - jint h = env->CallIntMethod(params, get_h); - Integer hi(h); - - jmethodID get_p = env->GetMethodID(fp_field_class, "getP", "()Ljava/math/BigInteger;"); - jobject p = env->CallObjectMethod(field, get_p); - Integer pi = integer_from_biginteger(env, p); - - ECP curve(pi, ai, bi); - - Integer gxi = integer_from_biginteger(env, gx); - Integer gyi = integer_from_biginteger(env, gy); - ECP::Point g_point(gxi, gyi); - - return std::make_unique<DL_GroupParameters_EC<ECP>>(curve, g_point, ni, hi); - } else if (env->IsInstanceOf(params, ecgen_parameter_spec_class)) { - jmethodID get_name = env->GetMethodID(ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (jstring) env->CallObjectMethod(params, get_name); - const char *utf_name = env->GetStringUTFChars(name, NULL); - std::string str_name(utf_name); - env->ReleaseStringUTFChars(name, utf_name); - - std::vector<OID> ecp_oids = get_curve_oids<ECP>(); - for (auto oid = ecp_oids.begin(); oid != ecp_oids.end(); ++oid) { - std::string oid_s = oid_to_str(*oid); - if (str_name == oid_s) { - return std::make_unique<DL_GroupParameters_EC<ECP>>(*oid); - } - } - } - - return nullptr; -} - -static std::unique_ptr<DL_GroupParameters_EC<EC2N>> f2m_group_from_params(JNIEnv *env, jobject params) { - if (env->IsInstanceOf(params, ec_parameter_spec_class)) { - jmethodID get_curve = env->GetMethodID(ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject elliptic_curve = env->CallObjectMethod(params, get_curve); - - jmethodID get_field = env->GetMethodID(elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = env->CallObjectMethod(elliptic_curve, get_field); - - if (!env->IsInstanceOf(field, f2m_field_class)) { - return nullptr; - } - - jmethodID get_a = env->GetMethodID(elliptic_curve_class, "getA", "()Ljava/math/BigInteger;"); - jobject a = env->CallObjectMethod(elliptic_curve, get_a); - Integer ai = integer_from_biginteger(env, a); - - jmethodID get_b = env->GetMethodID(elliptic_curve_class, "getB", "()Ljava/math/BigInteger;"); - jobject b = env->CallObjectMethod(elliptic_curve, get_b); - Integer bi = integer_from_biginteger(env, b); - - jmethodID get_g = env->GetMethodID(ec_parameter_spec_class, "getGenerator", "()Ljava/security/spec/ECPoint;"); - jobject g = env->CallObjectMethod(params, get_g); - - jmethodID get_x = env->GetMethodID(point_class, "getAffineX", "()Ljava/math/BigInteger;"); - jobject gx = env->CallObjectMethod(g, get_x); - - jmethodID get_y = env->GetMethodID(point_class, "getAffineY", "()Ljava/math/BigInteger;"); - jobject gy = env->CallObjectMethod(g, get_y); - - jmethodID get_n = env->GetMethodID(ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;"); - jobject n = env->CallObjectMethod(params, get_n); - Integer ni = integer_from_biginteger(env, n); - - jmethodID get_h = env->GetMethodID(ec_parameter_spec_class, "getCofactor", "()I"); - jint h = env->CallIntMethod(params, get_h); - Integer hi(h); - - jmethodID get_midterms = env->GetMethodID(f2m_field_class, "getMidTermsOfReductionPolynomial", "()[I"); - jintArray midterms = (jintArray) env->CallObjectMethod(field, get_midterms); - jsize midterm_length = env->GetArrayLength(midterms); - jint *midterm_data = env->GetIntArrayElements(midterms, NULL); - - jmethodID get_m = env->GetMethodID(f2m_field_class, "getM", "()I"); - jint m = env->CallIntMethod(field, get_m); - - std::unique_ptr<GF2NP> base_field; - if (midterm_length == 1) { - //trinomial, use GF2NT - base_field = std::make_unique<GF2NT>((unsigned int) m, (unsigned int) midterm_data[0], 0); - } else { - //pentanomial, use GF2NPP - base_field = std::make_unique<GF2NPP>((unsigned int) m, (unsigned int) midterm_data[0], (unsigned int) midterm_data[1], (unsigned int) midterm_data[2], 0); - } - env->ReleaseIntArrayElements(midterms, midterm_data, JNI_ABORT); - - jmethodID to_byte_array = env->GetMethodID(biginteger_class, "toByteArray", "()[B"); - jbyteArray a_array = (jbyteArray) env->CallObjectMethod(a, to_byte_array); - jsize a_length = env->GetArrayLength(a_array); - jbyte *a_data = env->GetByteArrayElements(a_array, NULL); - - jbyteArray b_array = (jbyteArray) env->CallObjectMethod(b, to_byte_array); - jsize b_length = env->GetArrayLength(b_array); - jbyte *b_data = env->GetByteArrayElements(b_array, NULL); - - EC2N curve(*base_field, EC2N::FieldElement((byte *) a_data, (size_t) a_length), EC2N::FieldElement((byte *) b_data, (size_t) b_length)); - env->ReleaseByteArrayElements(a_array, a_data, JNI_ABORT); - env->ReleaseByteArrayElements(b_array, b_data, JNI_ABORT); - - jbyteArray gx_array = (jbyteArray) env->CallObjectMethod(gx, to_byte_array); - jsize gx_length = env->GetArrayLength(gx_array); - jbyte *gx_data = env->GetByteArrayElements(gx_array, NULL); - PolynomialMod2 gxm((byte *) gx_data, (size_t) gx_length); - env->ReleaseByteArrayElements(gx_array, gx_data, JNI_ABORT); - - jbyteArray gy_array = (jbyteArray) env->CallObjectMethod(gy, to_byte_array); - jsize gy_length = env->GetArrayLength(gy_array); - jbyte *gy_data = env->GetByteArrayElements(gy_array, NULL); - PolynomialMod2 gym((byte *) gy_data, (size_t) gy_length); - env->ReleaseByteArrayElements(gy_array, gy_data, JNI_ABORT); - - EC2N::Point g_point(gxm, gym); - - return std::make_unique<DL_GroupParameters_EC<EC2N>>(curve, g_point, ni, hi); - } else if (env->IsInstanceOf(params, ecgen_parameter_spec_class)) { - jmethodID get_name = env->GetMethodID(ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (jstring) env->CallObjectMethod(params, get_name); - const char *utf_name = env->GetStringUTFChars(name, NULL); - std::string str_name(utf_name); - env->ReleaseStringUTFChars(name, utf_name); - - std::vector<OID> e2n_oids = get_curve_oids<EC2N>(); - for (auto oid = e2n_oids.begin(); oid != e2n_oids.end(); ++oid) { - std::string oid_s = oid_to_str(*oid); - if (str_name == oid_s) { - return std::make_unique<DL_GroupParameters_EC<EC2N>>(*oid); - } - } - } - return nullptr; -} - - -template <class EC> jobject finish_params(JNIEnv *env, jobject field, jobject a, jobject b, jobject gx, jobject gy, DL_GroupParameters_EC<EC> group) { - jmethodID point_init = env->GetMethodID(point_class, "<init>", "(Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject g = env->NewObject(point_class, point_init, gx, gy); - - jmethodID elliptic_curve_init = env->GetMethodID(elliptic_curve_class, "<init>", "(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject elliptic_curve = env->NewObject(elliptic_curve_class, elliptic_curve_init, field, a, b); - - // Integer GetSubgroupOrder - // Integer GetCofactor - jobject order = biginteger_from_integer(env, group.GetSubgroupOrder()); - jint cofactor = (jint) group.GetCofactor().ConvertToLong(); - - jmethodID ec_parameter_spec_init = env->GetMethodID(ec_parameter_spec_class, "<init>", "(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V"); - return env->NewObject(ec_parameter_spec_class, ec_parameter_spec_init, elliptic_curve, g, order, cofactor); -} - -template <class EC> jobject params_from_group(JNIEnv *env, DL_GroupParameters_EC<EC> group) { - return NULL; -} - -template <> jobject params_from_group<ECP>(JNIEnv *env, DL_GroupParameters_EC<ECP> group) { - ECP curve = group.GetCurve(); - jmethodID fp_field_init = env->GetMethodID(fp_field_class, "<init>", "(Ljava/math/BigInteger;)V"); - ModularArithmetic mod = curve.GetField(); - jobject p = biginteger_from_integer(env, mod.GetModulus()); - jobject a = biginteger_from_integer(env, curve.GetA()); - jobject b = biginteger_from_integer(env, curve.GetB()); - - jobject field = env->NewObject(fp_field_class, fp_field_init, p); - - ECP::Point gp = group.GetBasePrecomputation().GetBase(group.GetGroupPrecomputation()); - jobject gx = biginteger_from_integer(env, gp.x); - jobject gy = biginteger_from_integer(env, gp.y); - return finish_params(env, field, a, b, gx, gy, group); -} - -template <> jobject params_from_group<EC2N>(JNIEnv *env, DL_GroupParameters_EC<EC2N> group) { - EC2N curve = group.GetCurve(); - PolynomialMod2 mod = curve.GetField().GetModulus(); - int m = mod.Degree(); - unsigned int coeff_count = mod.CoefficientCount(); - jintArray ks; - int to_find; - int found = 0; - if (coeff_count == 3) { - //trinomial - ks = env->NewIntArray(1); - to_find = 1; - } else if (coeff_count == 5) { - //pentanomial - ks = env->NewIntArray(3); - to_find = 3; - } else { - return NULL; - } - jint *ks_data = env->GetIntArrayElements(ks, NULL); - for (int i = m - 1; i > 0 && found < to_find; --i) { - if (mod.GetCoefficient(i) == 1) { - ks_data[found++] = i; - } - } - env->ReleaseIntArrayElements(ks, ks_data, 0); - - jmethodID f2m_field_init = env->GetMethodID(f2m_field_class, "<init>", "(I[I)V"); - jobject field = env->NewObject(f2m_field_class, f2m_field_init, (jint) m, ks); - - jobject a = biginteger_from_polmod2(env, curve.GetA()); - jobject b = biginteger_from_polmod2(env, curve.GetB()); - - EC2N::Point gp = group.GetBasePrecomputation().GetBase(group.GetGroupPrecomputation()); - jobject gx = biginteger_from_polmod2(env, gp.x); - jobject gy = biginteger_from_polmod2(env, gp.y); - return finish_params(env, field, a, b, gx, gy, group); -} - -template <class EC> jobject generate_from_group(JNIEnv *env, DL_GroupParameters_EC<EC> group, jobject params) { - typename ECDH<EC>::Domain ec_domain(group); - SecByteBlock priv(ec_domain.PrivateKeyLength()), pub(ec_domain.PublicKeyLength()); - - try { - native_timing_start(); - ec_domain.GenerateKeyPair(rng, priv, pub); - native_timing_stop(); - } catch (Exception & ex) { - throw_new(env, "java/security/GeneralSecurityException", ex.what()); - return NULL; - } - - jbyteArray pub_bytearray = env->NewByteArray(pub.SizeInBytes()); - jbyte *pub_bytes = env->GetByteArrayElements(pub_bytearray, NULL); - std::copy(pub.BytePtr(), pub.BytePtr()+pub.SizeInBytes(), pub_bytes); - env->ReleaseByteArrayElements(pub_bytearray, pub_bytes, 0); - - jobject ec_pub_param_spec = env->NewLocalRef(params); - jmethodID ec_pub_init = env->GetMethodID(pubkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject pubkey = env->NewObject(pubkey_class, ec_pub_init, pub_bytearray, ec_pub_param_spec); - - jbyteArray priv_bytearray = env->NewByteArray(priv.SizeInBytes()); - jbyte *priv_bytes = env->GetByteArrayElements(priv_bytearray, NULL); - std::copy(priv.BytePtr(), priv.BytePtr()+priv.SizeInBytes(), priv_bytes); - env->ReleaseByteArrayElements(priv_bytearray, priv_bytes, 0); - - jobject ec_priv_param_spec = env->NewLocalRef(params); - jmethodID ec_priv_init = env->GetMethodID(privkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject privkey = env->NewObject(privkey_class, ec_priv_init, priv_bytearray, ec_priv_param_spec); - - jmethodID keypair_init = env->GetMethodID(keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V"); - - return env->NewObject(keypair_class, keypair_init, pubkey, privkey); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Cryptopp_generate__ILjava_security_SecureRandom_2(JNIEnv *env, jobject self, jint keysize, jobject random){ - std::vector<OID> ecp_oids = get_curve_oids<ECP>(); - for (auto oid = ecp_oids.begin(); oid != ecp_oids.end(); ++oid) { - DL_GroupParameters_EC<ECP> group(*oid); - if (((jint) group.GetCurve().GetField().MaxElementBitLength()) == keysize) { - jobject params = params_from_group(env, group); - return generate_from_group<ECP>(env, group, params); - } - } - - std::vector<OID> e2n_oids = get_curve_oids<EC2N>(); - for (auto oid = e2n_oids.begin(); oid != e2n_oids.end(); ++oid) { - DL_GroupParameters_EC<EC2N> group(*oid); - if ((jint) group.GetCurve().FieldSize().ConvertToLong() == keysize) { - jobject params = params_from_group(env, group); - return generate_from_group<EC2N>(env, group, params); - } - } - return NULL; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Cryptopp_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(JNIEnv *env, jobject self, jobject params, jobject random) { - std::unique_ptr<DL_GroupParameters_EC<ECP>> ecp_group = fp_group_from_params(env, params); - if (ecp_group == nullptr) { - std::unique_ptr<DL_GroupParameters_EC<EC2N>> ec2n_group = f2m_group_from_params(env, params); - return generate_from_group<EC2N>(env, *ec2n_group, params); - } else { - return generate_from_group<ECP>(env, *ecp_group, params); - } - return NULL; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Cryptopp_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params) { - jsize privkey_length = env->GetArrayLength(privkey); - jbyte *privkey_data = env->GetByteArrayElements(privkey, NULL); - SecByteBlock private_key((byte *) privkey_data, privkey_length); - env->ReleaseByteArrayElements(privkey, privkey_data, JNI_ABORT); - - jsize pubkey_length = env->GetArrayLength(pubkey); - jbyte *pubkey_data = env->GetByteArrayElements(pubkey, NULL); - SecByteBlock public_key((byte *) pubkey_data, pubkey_length); - env->ReleaseByteArrayElements(pubkey, pubkey_data, JNI_ABORT); - - bool success; - std::unique_ptr<SecByteBlock> secret; - std::unique_ptr<DL_GroupParameters_EC<ECP>> ecp_group = fp_group_from_params(env, params); - if (ecp_group == nullptr) { - std::unique_ptr<DL_GroupParameters_EC<EC2N>> ec2n_group = f2m_group_from_params(env, params); - ECDH<EC2N>::Domain dh_agreement(*ec2n_group); - - try { - secret = std::make_unique<SecByteBlock>(dh_agreement.AgreedValueLength()); - native_timing_start(); - success = dh_agreement.Agree(*secret, private_key, public_key); - native_timing_stop(); - } catch (Exception & ex) { - throw_new(env, "java/security/GeneralSecurityException", ex.what()); - return NULL; - } - } else { - ECDH<ECP>::Domain dh_agreement(*ecp_group); - - try { - secret = std::make_unique<SecByteBlock>(dh_agreement.AgreedValueLength()); - native_timing_start(); - success = dh_agreement.Agree(*secret, private_key, public_key); - native_timing_stop(); - } catch (Exception & ex) { - throw_new(env, "java/security/GeneralSecurityException", ex.what()); - return NULL; - } - } - if (!success) { - throw_new(env, "java/security/GeneralSecurityException", "Agreement was unsuccessful."); - return NULL; - } - - jbyteArray result = env->NewByteArray(secret->size()); - jbyte *result_data = env->GetByteArrayElements(result, NULL); - std::copy(secret->begin(), secret->end(), result_data); - env->ReleaseByteArrayElements(result, result_data, 0); - - return result; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Cryptopp_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm){ - throw_new(env, "java/lang/UnsupportedOperationException", "Not supported."); - return NULL; -} - -template <class EC, class H> -jbyteArray sign_message(JNIEnv *env, DL_GroupParameters_EC<EC> group, jbyteArray data, const Integer & private_key_x) { - - typename ECDSA<EC, H>::PrivateKey pkey; - pkey.Initialize(group, private_key_x); - typename ECDSA<EC, H>::Signer signer(pkey); - - std::string signature(signer.MaxSignatureLength(), 0); - - jsize data_length = env->GetArrayLength(data); - jbyte *data_bytes = env->GetByteArrayElements(data, NULL); - native_timing_start(); - size_t len = signer.SignMessage(rng, (byte *)data_bytes, data_length, (byte *)signature.c_str()); - native_timing_stop(); - env->ReleaseByteArrayElements(data, data_bytes, JNI_ABORT); - signature.resize(len); - - byte sig[4096]; - size_t sig_len = DSAConvertSignatureFormat(sig, sizeof(sig), DSA_DER, (byte *)signature.c_str(), len, DSA_P1363); - - jbyteArray result = env->NewByteArray(sig_len); - jbyte *result_bytes = env->GetByteArrayElements(result, NULL); - std::copy(sig, sig+sig_len, result_bytes); - env->ReleaseByteArrayElements(result, result_bytes, 0); - - return result; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Cryptopp_sign(JNIEnv *env, jobject self, jbyteArray data, jbyteArray privkey, jobject params) { - jclass cryptopp_sig_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi$Cryptopp"); - jfieldID type_id = env->GetFieldID(cryptopp_sig_class, "type", "Ljava/lang/String;"); - jstring type = (jstring) env->GetObjectField(self, type_id); - const char *type_data = env->GetStringUTFChars(type, NULL); - std::string type_str(type_data); - env->ReleaseStringUTFChars(type, type_data); - - jsize privkey_length = env->GetArrayLength(privkey); - jbyte *privkey_data = env->GetByteArrayElements(privkey, NULL); - Integer private_key_x((byte *) privkey_data, (size_t) privkey_length); - env->ReleaseByteArrayElements(privkey, privkey_data, JNI_ABORT); - - jbyteArray result = NULL; - - std::unique_ptr<DL_GroupParameters_EC<ECP>> ecp_group = fp_group_from_params(env, params); - if (ecp_group == nullptr) { - std::unique_ptr<DL_GroupParameters_EC<EC2N>> ec2n_group = f2m_group_from_params(env, params); - if (type_str.find("SHA1") != std::string::npos) { - result = sign_message<EC2N, SHA1>(env, *ec2n_group, data, private_key_x); - } else if (type_str.find("SHA224") != std::string::npos) { - result = sign_message<EC2N, SHA224>(env, *ec2n_group, data, private_key_x); - } else if (type_str.find("SHA256") != std::string::npos) { - result = sign_message<EC2N, SHA256>(env, *ec2n_group, data, private_key_x); - } else if (type_str.find("SHA384") != std::string::npos) { - result = sign_message<EC2N, SHA384>(env, *ec2n_group, data, private_key_x); - } else if (type_str.find("SHA512") != std::string::npos) { - result = sign_message<EC2N, SHA512>(env, *ec2n_group, data, private_key_x); - } - } else { - if (type_str.find("SHA1") != std::string::npos) { - result = sign_message<ECP, SHA1>(env, *ecp_group, data, private_key_x); - } else if (type_str.find("SHA224") != std::string::npos) { - result = sign_message<ECP, SHA224>(env, *ecp_group, data, private_key_x); - } else if (type_str.find("SHA256") != std::string::npos) { - result = sign_message<ECP, SHA256>(env, *ecp_group, data, private_key_x); - } else if (type_str.find("SHA384") != std::string::npos) { - result = sign_message<ECP, SHA384>(env, *ecp_group, data, private_key_x); - } else if (type_str.find("SHA512") != std::string::npos) { - result = sign_message<ECP, SHA512>(env, *ecp_group, data, private_key_x); - } - } - - return result; -} - -template <class EC, class H> -jboolean verify_message(JNIEnv *env, DL_GroupParameters_EC<EC> group, jbyteArray data, jbyteArray signature, jbyteArray pubkey) { - typename EC::Point pkey_point; - jsize pubkey_length = env->GetArrayLength(pubkey); - jbyte *pubkey_data = env->GetByteArrayElements(pubkey, NULL); - group.GetCurve().DecodePoint(pkey_point, (byte *)pubkey_data, pubkey_length); - env->ReleaseByteArrayElements(pubkey, pubkey_data, JNI_ABORT); - - typename ECDSA<EC, H>::PublicKey pkey; - pkey.Initialize(group, pkey_point); - typename ECDSA<EC, H>::Verifier verifier(pkey); - - size_t bit_length = group.GetCurve().GetField().MaxElementBitLength(); - size_t bytes = (bit_length + 7)/8; - - jsize sig_length = env->GetArrayLength(signature); - jbyte *sig_bytes = env->GetByteArrayElements(signature, NULL); - - byte sig[bytes * 2]; - size_t sig_len = DSAConvertSignatureFormat(sig, bytes * 2, DSA_P1363, (byte *)sig_bytes, sig_length, DSA_DER); - env->ReleaseByteArrayElements(signature, sig_bytes, JNI_ABORT); - - jsize data_length = env->GetArrayLength(data); - jbyte *data_bytes = env->GetByteArrayElements(data, NULL); - native_timing_start(); - bool result = verifier.VerifyMessage((byte *)data_bytes, data_length, sig, sig_len); - native_timing_stop(); - env->ReleaseByteArrayElements(data, data_bytes, JNI_ABORT); - - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Cryptopp_verify(JNIEnv *env, jobject self, jbyteArray signature, jbyteArray data, jbyteArray pubkey, jobject params) { - jclass cryptopp_sig_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi$Cryptopp"); - jfieldID type_id = env->GetFieldID(cryptopp_sig_class, "type", "Ljava/lang/String;"); - jstring type = (jstring) env->GetObjectField(self, type_id); - const char *type_data = env->GetStringUTFChars(type, NULL); - std::string type_str(type_data); - env->ReleaseStringUTFChars(type, type_data); - - std::unique_ptr<DL_GroupParameters_EC<ECP>> ecp_group = fp_group_from_params(env, params); - if (ecp_group == nullptr) { - std::unique_ptr<DL_GroupParameters_EC<EC2N>> ec2n_group = f2m_group_from_params(env, params); - - if (type_str.find("SHA1") != std::string::npos) { - return verify_message<EC2N, SHA1>(env, *ec2n_group, data, signature, pubkey); - } else if (type_str.find("SHA224") != std::string::npos) { - return verify_message<EC2N, SHA224>(env, *ec2n_group, data, signature, pubkey); - } else if (type_str.find("SHA256") != std::string::npos) { - return verify_message<EC2N, SHA256>(env, *ec2n_group, data, signature, pubkey); - } else if (type_str.find("SHA384") != std::string::npos) { - return verify_message<EC2N, SHA384>(env, *ec2n_group, data, signature, pubkey); - } else if (type_str.find("SHA512") != std::string::npos) { - return verify_message<EC2N, SHA512>(env, *ec2n_group, data, signature, pubkey); - } - } else { - if (type_str.find("SHA1") != std::string::npos) { - return verify_message<ECP, SHA1>(env, *ecp_group, data, signature, pubkey); - } else if (type_str.find("SHA224") != std::string::npos) { - return verify_message<ECP, SHA224>(env, *ecp_group, data, signature, pubkey); - } else if (type_str.find("SHA256") != std::string::npos) { - return verify_message<ECP, SHA256>(env, *ecp_group, data, signature, pubkey); - } else if (type_str.find("SHA384") != std::string::npos) { - return verify_message<ECP, SHA384>(env, *ecp_group, data, signature, pubkey); - } else if (type_str.find("SHA512") != std::string::npos) { - return verify_message<ECP, SHA512>(env, *ecp_group, data, signature, pubkey); - } - } - // unreachable - return JNI_FALSE; -}
\ No newline at end of file diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/gcrypt.c b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/gcrypt.c deleted file mode 100644 index 5d29d2c..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/gcrypt.c +++ /dev/null @@ -1,623 +0,0 @@ -#include "native.h" -#include <stdio.h> -#include <ctype.h> -#include <stdbool.h> -#include <gcrypt.h> -#include "c_utils.h" -#include "c_timing.h" - -static jclass provider_class; - - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_GcryptLib_createProvider(JNIEnv *env, jobject this){ - /* Create the custom provider. */ - jclass local_provider_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeProvider$Gcrypt"); - provider_class = (*env)->NewGlobalRef(env, local_provider_class); - - jmethodID init = (*env)->GetMethodID(env, local_provider_class, "<init>", "(Ljava/lang/String;DLjava/lang/String;)V"); - - const char *running_with = gcry_check_version(GCRYPT_VERSION); - if (!running_with) { - return NULL; - } - char full_name[strlen("libgcrypt ") + strlen(running_with) + 1]; - strcpy(full_name, "libgcrypt "); - strcat(full_name, running_with); - jstring name = (*env)->NewStringUTF(env, full_name); - double version = strtod(running_with, NULL); - - return (*env)->NewObject(env, provider_class, init, name, version, name); -} - -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Gcrypt_setup(JNIEnv *env, jobject this) { - gcry_control(GCRYCTL_DISABLE_SECMEM, 0); - //gcry_control(GCRYCTL_SET_DEBUG_FLAGS, 1); - gcry_control(GCRYCTL_ENABLE_QUICK_RANDOM, 0); - gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); - - INIT_PROVIDER(env, provider_class); - - ADD_KPG(env, this, "EC", "Gcrypt"); - ADD_KA(env, this, "ECDH", "GcryptECDH"); - ADD_SIG(env, this, "NONEwithECDSA", "GcryptECDSAwithNONE"); - ADD_SIG(env, this, "SHA1withECDSA", "GcryptECDSAwithSHA1"); - ADD_SIG(env, this, "SHA224withECDSA", "GcryptECDSAwithSHA224"); - ADD_SIG(env, this, "SHA256withECDSA", "GcryptECDSAwithSHA256"); - ADD_SIG(env, this, "SHA384withECDSA", "GcryptECDSAwithSHA384"); - ADD_SIG(env, this, "SHA512withECDSA", "GcryptECDSAwithSHA512"); - ADD_SIG(env, this, "SHA1withECDDSA", "GcryptECDDSAwithSHA1"); - ADD_SIG(env, this, "SHA224withECDDSA", "GcryptECDDSAwithSHA224"); - ADD_SIG(env, this, "SHA256withECDDSA", "GcryptECDDSAwithSHA256"); - ADD_SIG(env, this, "SHA384withECDDSA", "GcryptECDDSAwithSHA384"); - ADD_SIG(env, this, "SHA512withECDDSA", "GcryptECDDSAwithSHA512"); - - init_classes(env, "Gcrypt"); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_GcryptLib_getCurves(JNIEnv *env, jobject this) { - jclass hash_set_class = (*env)->FindClass(env, "java/util/TreeSet"); - - jmethodID hash_set_ctr = (*env)->GetMethodID(env, hash_set_class, "<init>", "()V"); - jmethodID hash_set_add = (*env)->GetMethodID(env, hash_set_class, "add", "(Ljava/lang/Object;)Z"); - - jobject result = (*env)->NewObject(env, hash_set_class, hash_set_ctr); - - const char *name; - unsigned int nbits; - - for (size_t i = 0; (name = gcry_pk_get_curve(NULL, i, &nbits)); i++){ - jstring curve_name = (*env)->NewStringUTF(env, name); - (*env)->CallBooleanMethod(env, result, hash_set_add, curve_name); - } - - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Gcrypt_keysizeSupported(JNIEnv *env, jobject this, jint keysize) { - const char *name; - unsigned int nbits; - - for (size_t i = 0; (name = gcry_pk_get_curve(NULL, i, &nbits)); i++){ - if (nbits == keysize) { - return JNI_TRUE; - } - } - - return JNI_FALSE; -} - -/* -static void print_sexp(gcry_sexp_t sexp) { - size_t len = gcry_sexp_sprint(sexp, GCRYSEXP_FMT_ADVANCED, NULL, 0); - char string[len]; - gcry_sexp_sprint(sexp, GCRYSEXP_FMT_ADVANCED, string, len); - printf("%s\n", string); - fflush(stdout); -} - -static void print_chrray(unsigned char *arr, size_t len) { - for (size_t i = 0; i < len; ++i) { - printf("%02x,", ((unsigned char) arr[i] & 0xff)); - } - printf("\n"); -} -*/ - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Gcrypt_paramsSupported(JNIEnv *env, jobject this, jobject params) { - if (params == NULL) { - return JNI_FALSE; - } - - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - return JNI_FALSE; - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char *utf_name = (*env)->GetStringUTFChars(env, name, NULL); - gcry_sexp_t curve_sexp; - gcry_sexp_build(&curve_sexp, NULL, "(public-key (ecc (curve %s)))", utf_name); - unsigned int nbits; - const char *ret_name = gcry_pk_get_curve(curve_sexp, 0, &nbits); - (*env)->ReleaseStringUTFChars(env, name, utf_name); - gcry_sexp_release(curve_sexp); - return ret_name ? JNI_TRUE : JNI_FALSE; - } else { - return JNI_FALSE; - } -} - -static gcry_mpi_t bytearray_to_mpi(JNIEnv *env, jbyteArray array) { - if (!array) { - return NULL; - } - - gcry_mpi_t result; - - size_t length = (*env)->GetArrayLength(env, array); - jbyte data[length + 1]; - data[0] = 0; - (*env)->GetByteArrayRegion(env, array, 0, length, data + 1); - gcry_mpi_scan(&result, GCRYMPI_FMT_STD, data, length + 1, NULL); - return result; -} - -static jbyteArray mpi_to_bytearray0(JNIEnv *env, gcry_mpi_t mpi, size_t start, size_t len) { - if (!mpi) { - return NULL; - } - - size_t mpi_len = 0; - gcry_mpi_print(GCRYMPI_FMT_USG, NULL, 0, &mpi_len, mpi); - if (start >= mpi_len) { - return NULL; - } - if (start + len > mpi_len || len == 0) { - len = mpi_len - start; - } - unsigned char buff[mpi_len]; - gcry_mpi_print(GCRYMPI_FMT_USG, buff, mpi_len, NULL, mpi); - jbyteArray bytes = (*env)->NewByteArray(env, len); - jbyte *data = (*env)->GetByteArrayElements(env, bytes, NULL); - memcpy(data, buff + start, len); - (*env)->ReleaseByteArrayElements(env, bytes, data, 0); - return bytes; -} - -static jbyteArray mpi_to_bytearray(JNIEnv *env, gcry_mpi_t mpi) { - return mpi_to_bytearray0(env, mpi, 0, 0); -} - -static jobject mpi_to_biginteger(JNIEnv *env, gcry_mpi_t mpi) { - if (!mpi) { - return NULL; - } - - jmethodID biginteger_init = (*env)->GetMethodID(env, biginteger_class, "<init>", "(I[B)V"); - jbyteArray bytes = mpi_to_bytearray(env, mpi); - jobject result = (*env)->NewObject(env, biginteger_class, biginteger_init, 1, bytes); - return result; -} - -static gcry_mpi_t biginteger_to_mpi(JNIEnv *env, jobject bigint) { - if (!bigint) { - return NULL; - } - - jmethodID to_byte_array = (*env)->GetMethodID(env, biginteger_class, "toByteArray", "()[B"); - jbyteArray byte_array = (jbyteArray) (*env)->CallObjectMethod(env, bigint, to_byte_array); - return bytearray_to_mpi(env, byte_array); -} - -static jint mpi_to_jint(gcry_mpi_t mpi) { - jint result = 0; - unsigned long nbits = gcry_mpi_get_nbits(mpi); - int max_bits = sizeof(jint) * 8; - for (size_t i = 0; i < nbits && i < max_bits; ++i) { - if (gcry_mpi_test_bit(mpi, nbits - i - 1)) { - result = ((result << 1) | 1); - } else { - result = (result << 1); - } - } - return result; -} - -static jobject buff_to_ecpoint(JNIEnv *env, gcry_buffer_t buff) { - jint coord_size = (buff.len - 1) / 2; - jmethodID biginteger_init = (*env)->GetMethodID(env, biginteger_class, "<init>", "(I[B)V"); - - jbyteArray x_bytes = (*env)->NewByteArray(env, coord_size); - jbyte *x_data = (*env)->GetByteArrayElements(env, x_bytes, NULL); - memcpy(x_data, ((char *) buff.data) + 1, coord_size); - (*env)->ReleaseByteArrayElements(env, x_bytes, x_data, 0); - jobject xi = (*env)->NewObject(env, biginteger_class, biginteger_init, 1, x_bytes); - - jbyteArray y_bytes = (*env)->NewByteArray(env, coord_size); - jbyte *y_data = (*env)->GetByteArrayElements(env, y_bytes, NULL); - memcpy(y_data, ((char *) buff.data) + 1 + coord_size, coord_size); - (*env)->ReleaseByteArrayElements(env, y_bytes, y_data, 0); - jobject yi = (*env)->NewObject(env, biginteger_class, biginteger_init, 1, y_bytes); - - jmethodID point_init = (*env)->GetMethodID(env, point_class, "<init>", "(Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - return (*env)->NewObject(env, point_class, point_init, xi, yi); -} - -static jobject create_ec_param_spec(JNIEnv *env, gcry_sexp_t key) { - jobject result = NULL; - gcry_mpi_t p, a, b, n, h; - gcry_buffer_t g = {0}; - gcry_error_t err = gcry_sexp_extract_param(key, "ecc", "pab&g+nh", &p, &a, &b, &g, &n, &h, NULL); - if (gcry_err_code(err) != GPG_ERR_NO_ERROR) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error exporting domain parameters. Error: %ui", gcry_err_code(err)); - goto end; - } - - jobject pi = mpi_to_biginteger(env, p); - jmethodID fp_field_init = (*env)->GetMethodID(env, fp_field_class, "<init>", "(Ljava/math/BigInteger;)V"); - jobject field = (*env)->NewObject(env, fp_field_class, fp_field_init, pi); - - jobject ai = mpi_to_biginteger(env, a); - jobject bi = mpi_to_biginteger(env, b); - - jmethodID elliptic_curve_init = (*env)->GetMethodID(env, elliptic_curve_class, "<init>", "(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject elliptic_curve = (*env)->NewObject(env, elliptic_curve_class, elliptic_curve_init, field, ai, bi); - - jobject gen = buff_to_ecpoint(env, g); - - jobject order = mpi_to_biginteger(env, n); - jint cofactor = mpi_to_jint(h); - - jmethodID ec_parameter_spec_init = (*env)->GetMethodID(env, ec_parameter_spec_class, "<init>", "(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V"); - result = (*env)->NewObject(env, ec_parameter_spec_class, ec_parameter_spec_init, elliptic_curve, gen, order, cofactor); - -end: - gcry_mpi_release(p); - gcry_mpi_release(a); - gcry_mpi_release(b); - gcry_free(g.data); - gcry_mpi_release(n); - gcry_mpi_release(h); - return result; -} - -static jobject generate_from_sexp(JNIEnv *env, gcry_sexp_t gen_sexp) { - jobject result = NULL; - gcry_sexp_t key_sexp; - - native_timing_start(); - gcry_error_t err = gcry_pk_genkey(&key_sexp, gen_sexp); - native_timing_stop(); - - if (gcry_err_code(err) != GPG_ERR_NO_ERROR) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error generating key. Error: %ui", gcry_err_code(err)); - goto release_sexp; - } - gcry_sexp_t pkey = gcry_sexp_find_token(key_sexp, "public-key", 0); - gcry_sexp_t skey = gcry_sexp_find_token(key_sexp, "private-key", 0); - - jobject ec_param_spec = create_ec_param_spec(env, skey); - if (!ec_param_spec) { - goto release_keypair; - } - - gcry_buffer_t q = {0}; - gcry_mpi_t d; - err = gcry_sexp_extract_param(skey, "ecc", "&q+d", &q, &d, NULL); - - jbyteArray pub_bytes = (*env)->NewByteArray(env, q.size); - jbyte *key_pub = (*env)->GetByteArrayElements(env, pub_bytes, NULL); - memcpy(key_pub, q.data, q.size); - (*env)->ReleaseByteArrayElements(env, pub_bytes, key_pub, 0); - - size_t priv_len = 0; - gcry_mpi_print(GCRYMPI_FMT_USG, NULL, 0, &priv_len, d); - jbyteArray priv_bytes = (*env)->NewByteArray(env, priv_len); - jbyte *key_priv = (*env)->GetByteArrayElements(env, priv_bytes, NULL); - gcry_mpi_print(GCRYMPI_FMT_USG, (unsigned char *) key_priv, priv_len, NULL, d); - (*env)->ReleaseByteArrayElements(env, priv_bytes, key_priv, 0); - - jobject ec_pub_param_spec = (*env)->NewLocalRef(env, ec_param_spec); - jmethodID ec_pub_init = (*env)->GetMethodID(env, pubkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject pubkey = (*env)->NewObject(env, pubkey_class, ec_pub_init, pub_bytes, ec_pub_param_spec); - - jobject ec_priv_param_spec = (*env)->NewLocalRef(env, ec_param_spec); - jmethodID ec_priv_init = (*env)->GetMethodID(env, privkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject privkey = (*env)->NewObject(env, privkey_class, ec_priv_init, priv_bytes, ec_priv_param_spec); - - jmethodID keypair_init = (*env)->GetMethodID(env, keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V"); - result = (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey); - - gcry_mpi_release(d); - gcry_free(q.data); - -release_keypair: - gcry_sexp_release(pkey); - gcry_sexp_release(skey); -release_sexp: - gcry_sexp_release(key_sexp); - return result; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Gcrypt_generate__ILjava_security_SecureRandom_2(JNIEnv *env, jobject this, jint keysize, jobject random) { - gcry_sexp_t gen_sexp; - gcry_sexp_build(&gen_sexp, NULL, "(genkey (ecc (flags no-keytest param) (nbits %d)))", keysize); - - jobject result = generate_from_sexp(env, gen_sexp); - gcry_sexp_release(gen_sexp); - return result; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Gcrypt_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(JNIEnv *env, jobject this, jobject params, jobject random) { - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - return NULL; - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char *utf_name = (*env)->GetStringUTFChars(env, name, NULL); - gcry_sexp_t gen_sexp; - gcry_sexp_build(&gen_sexp, NULL, "(genkey (ecc (flags no-keytest param) (curve %s)))", utf_name); - (*env)->ReleaseStringUTFChars(env, name, utf_name); - jobject result = generate_from_sexp(env, gen_sexp); - gcry_sexp_release(gen_sexp); - return result; - } else { - return NULL; - } -} - -static gcry_sexp_t create_key(JNIEnv *env, jobject ec_param_spec, const char *key_fmt, gcry_mpi_t q, gcry_mpi_t d) { - gcry_mpi_t p, a, b, g, n, h; - - jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject elliptic_curve = (*env)->CallObjectMethod(env, ec_param_spec, get_curve); - - jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field); - - jmethodID get_bits = (*env)->GetMethodID(env, fp_field_class, "getFieldSize", "()I"); - jint bits = (*env)->CallIntMethod(env, field, get_bits); - jint bytes = (bits + 7) / 8; - - jmethodID get_a = (*env)->GetMethodID(env, elliptic_curve_class, "getA", "()Ljava/math/BigInteger;"); - jobject big_a = (*env)->CallObjectMethod(env, elliptic_curve, get_a); - a = biginteger_to_mpi(env, big_a); - - jmethodID get_b = (*env)->GetMethodID(env, elliptic_curve_class, "getB", "()Ljava/math/BigInteger;"); - jobject big_b = (*env)->CallObjectMethod(env, elliptic_curve, get_b); - b = biginteger_to_mpi(env, big_b); - - jmethodID get_p = (*env)->GetMethodID(env, fp_field_class, "getP", "()Ljava/math/BigInteger;"); - jobject big_p = (*env)->CallObjectMethod(env, field, get_p); - p = biginteger_to_mpi(env, big_p); - - jmethodID get_g = (*env)->GetMethodID(env, ec_parameter_spec_class, "getGenerator", "()Ljava/security/spec/ECPoint;"); - jobject g_point = (*env)->CallObjectMethod(env, ec_param_spec, get_g); - - jmethodID get_x = (*env)->GetMethodID(env, point_class, "getAffineX", "()Ljava/math/BigInteger;"); - jobject gx = (*env)->CallObjectMethod(env, g_point, get_x); - - jmethodID get_y = (*env)->GetMethodID(env, point_class, "getAffineY", "()Ljava/math/BigInteger;"); - jobject gy = (*env)->CallObjectMethod(env, g_point, get_y); - - jmethodID to_byte_array = (*env)->GetMethodID(env, biginteger_class, "toByteArray", "()[B"); - - jbyteArray gx_bytes = (jbyteArray) (*env)->CallObjectMethod(env, gx, to_byte_array); - size_t gx_len = (*env)->GetArrayLength(env, gx_bytes); - jbyteArray gy_bytes = (jbyteArray) (*env)->CallObjectMethod(env, gy, to_byte_array); - size_t gy_len = (*env)->GetArrayLength(env, gy_bytes); - unsigned char g_data[1 + 2 * bytes]; - g_data[0] = 0x04; - jbyte *gx_data = (*env)->GetByteArrayElements(env, gx_bytes, NULL); - memcpy(g_data + 1, gx_data + (gx_len - bytes), bytes); - (*env)->ReleaseByteArrayElements(env, gx_bytes, gx_data, JNI_ABORT); - jbyte *gy_data = (*env)->GetByteArrayElements(env, gy_bytes, NULL); - memcpy(g_data + 1 + bytes, gy_data + (gy_len - bytes), bytes); - (*env)->ReleaseByteArrayElements(env, gy_bytes, gy_data, JNI_ABORT); - - gcry_mpi_scan(&g, GCRYMPI_FMT_USG, g_data, 1 + 2 * bytes, NULL); - - jmethodID get_n = (*env)->GetMethodID(env, ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;"); - jobject big_n = (*env)->CallObjectMethod(env, ec_param_spec, get_n); - n = biginteger_to_mpi(env, big_n); - - jmethodID get_h = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCofactor", "()I"); - jint jh = (*env)->CallIntMethod(env, ec_param_spec, get_h); - h = gcry_mpi_set_ui(NULL, jh); - - gcry_sexp_t inner = NULL; - if (q && d) { - gcry_sexp_build(&inner, NULL, "(ecc (flags param) (p %m) (a %m) (b %m) (g %m) (n %m) (h %m) (q %M) (d %M))", p, a, b, g, n, h, q, d, NULL); - } else if (q && !d) { - gcry_sexp_build(&inner, NULL, "(ecc (flags param) (p %m) (a %m) (b %m) (g %m) (n %m) (h %m) (q %m))", p, a, b, g, n, h, q, NULL); - } else if (!q && d) { - gcry_sexp_build(&inner, NULL, "(ecc (flags param) (p %m) (a %m) (b %m) (g %m) (n %m) (h %m) (d %m))", p, a, b, g, n, h, d, NULL); - } - gcry_sexp_t result; - gcry_sexp_build(&result, NULL, key_fmt, inner, NULL); - gcry_sexp_release(inner); - return result; -} - -static gcry_sexp_t create_pubkey(JNIEnv *env, jobject ec_param_spec, jbyteArray pubkey) { - gcry_mpi_t q = bytearray_to_mpi(env, pubkey); - gcry_sexp_t result = create_key(env, ec_param_spec, "(public-key %S)", q, NULL); - gcry_mpi_release(q); - return result; -} - -static gcry_sexp_t create_privkey(JNIEnv *env, jobject ec_param_spec, jbyteArray pubkey, jbyteArray privkey) { - gcry_mpi_t q = bytearray_to_mpi(env, pubkey); - gcry_mpi_t d = bytearray_to_mpi(env, privkey); - gcry_sexp_t result = create_key(env, ec_param_spec, "(private-key %S)", q, d); - gcry_mpi_release(q); - gcry_mpi_release(d); - return result; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Gcrypt_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject this, jbyteArray pubkey, jbyteArray privkey, jobject params) { - jbyteArray result = NULL; - gcry_sexp_t pub = create_pubkey(env, params, pubkey); - gcry_mpi_t priv = bytearray_to_mpi(env, privkey); - - gcry_sexp_t enc_sexp; - gcry_sexp_build(&enc_sexp, NULL, "(data (flags raw) (value %M))", priv, NULL); - gcry_sexp_t res_sexp; - // TODO: figure out why ecc_encrypt_raw takes signed representation.. Nobody uses that., everybody uses unsigned reduced mod p. - - native_timing_start(); - gcry_error_t err = gcry_pk_encrypt(&res_sexp, enc_sexp, pub); - native_timing_stop(); - - if (gcry_err_code(err) != GPG_ERR_NO_ERROR) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error performing ECDH. Error: %ui", gcry_err_code(err)); - goto end; - } - - gcry_mpi_t derived; - err = gcry_sexp_extract_param(res_sexp, NULL, "s", &derived, NULL); - - size_t derived_bytes; - gcry_mpi_print(GCRYMPI_FMT_USG, NULL, 0, &derived_bytes, derived); - size_t coord_bytes = (derived_bytes - 1) / 2; - result = mpi_to_bytearray0(env, derived, 1, coord_bytes); - - gcry_mpi_release(derived); -end: - gcry_sexp_release(enc_sexp); - gcry_sexp_release(res_sexp); - gcry_sexp_release(pub); - gcry_mpi_release(priv); - return result; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Gcrypt_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2(JNIEnv *env, jobject this, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm) { - throw_new(env, "java/lang/UnsupportedOperationException", "Not supported."); - return NULL; -} - -static int starts_with(const char *whole, const char *prefix) { - return !strncmp(whole, prefix, strlen(prefix)); -} - -static int get_hash_algo(const char *sig_type) { - if (starts_with(sig_type, "SHA1")) { - return GCRY_MD_SHA1; - } else if (starts_with(sig_type, "SHA224")) { - return GCRY_MD_SHA224; - } else if (starts_with(sig_type, "SHA256")) { - return GCRY_MD_SHA256; - } else if (starts_with(sig_type, "SHA384")) { - return GCRY_MD_SHA384; - } else if (starts_with(sig_type, "SHA512")) { - return GCRY_MD_SHA512; - } else { - return GCRY_MD_NONE; - } -} - -static const char *get_sig_algo(const char *sig_type) { - const char *start = strstr(sig_type, "with") + strlen("with"); - if (starts_with(start, "ECDSA")) { - return NULL; - } else if (starts_with(start, "ECDDSA")) { - return "rfc6979"; - } else { - return NULL; - } -} - -static void get_sign_data_sexp(JNIEnv *env, gcry_sexp_t *result, jobject this, jbyteArray data) { - jclass sig_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi$Gcrypt"); - jfieldID type_id = (*env)->GetFieldID(env, sig_class, "type", "Ljava/lang/String;"); - jstring type = (jstring)(*env)->GetObjectField(env, this, type_id); - const char* type_data = (*env)->GetStringUTFChars(env, type, NULL); - int hash_algo = get_hash_algo(type_data); - const char *sig_algo = get_sig_algo(type_data); - const char *with = strstr(type_data, "with"); - char hash_name[with - type_data + 1]; - memcpy(hash_name, type_data, with - type_data); - for (size_t i = 0; i < with - type_data; ++i) { - hash_name[i] = tolower(hash_name[i]); - } - hash_name[with - type_data] = 0; - (*env)->ReleaseStringUTFChars(env, type, type_data); - - if (hash_algo == GCRY_MD_NONE) { - gcry_mpi_t data_mpi = bytearray_to_mpi(env, data); - gcry_sexp_build(result, NULL, "(data (flags raw param) (value %M))", data_mpi); - gcry_mpi_release(data_mpi); - } else { - unsigned int hash_len = gcry_md_get_algo_dlen(hash_algo); - size_t data_len = (*env)->GetArrayLength(env, data); - jbyte *data_bytes = (*env)->GetByteArrayElements(env, data, NULL); - unsigned char out_hash[hash_len]; - gcry_md_hash_buffer(hash_algo, out_hash, data_bytes, data_len); - (*env)->ReleaseByteArrayElements(env, data, data_bytes, JNI_ABORT); - gcry_mpi_t hash_mpi; - gcry_mpi_scan(&hash_mpi, GCRYMPI_FMT_USG, out_hash, hash_len, NULL); - if (!sig_algo) { - gcry_sexp_build(result, NULL, "(data (flags raw param) (value %M))", hash_mpi); - } else { - gcry_sexp_build(result, NULL, "(data (flags %s param) (hash %s %M))", sig_algo, hash_name, hash_mpi); - } - gcry_mpi_release(hash_mpi); - } -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Gcrypt_sign(JNIEnv *env, jobject this, jbyteArray data, jbyteArray privkey, jobject params) { - jbyteArray result = NULL; - gcry_sexp_t priv_sexp = create_privkey(env, params, NULL, privkey); - - gcry_sexp_t data_sexp; - get_sign_data_sexp(env, &data_sexp, this, data); - - gcry_sexp_t res_sexp; - native_timing_start(); - gcry_error_t err = gcry_pk_sign(&res_sexp, data_sexp, priv_sexp); - native_timing_stop(); - if (gcry_err_code(err) != GPG_ERR_NO_ERROR) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error performing ECDSA. Error: %ui", gcry_err_code(err)); - goto release_init; - } - - gcry_buffer_t r_buf = {0}; - gcry_buffer_t s_buf = {0}; - err = gcry_sexp_extract_param(res_sexp, "ecdsa", "&rs", &r_buf, &s_buf, NULL); - if (gcry_err_code(err) != GPG_ERR_NO_ERROR) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error extracting ECDSA output. Error: %ui", gcry_err_code(err)); - goto release_res; - } - result = asn1_der_encode(env, r_buf.data, r_buf.len, s_buf.data, s_buf.len); - - gcry_free(r_buf.data); - gcry_free(s_buf.data); -release_res: - gcry_sexp_release(res_sexp); -release_init: - gcry_sexp_release(priv_sexp); - gcry_sexp_release(data_sexp); - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Gcrypt_verify(JNIEnv *env, jobject this, jbyteArray sig, jbyteArray data, jbyteArray pubkey, jobject params) { - jboolean result = JNI_FALSE; - gcry_sexp_t pub_sexp = create_pubkey(env, params, pubkey); - - gcry_sexp_t data_sexp; - get_sign_data_sexp(env, &data_sexp, this, data); - - size_t r_len, s_len; - jbyte *r_data, *s_data; - bool decode = asn1_der_decode(env, sig, &r_data, &r_len, &s_data, &s_len); - if (!decode) { - throw_new(env, "java/security/GeneralSecurityException", "Error decoding sig."); - goto release_init; - } - - gcry_mpi_t r_mpi, s_mpi; - gcry_mpi_scan(&r_mpi, GCRYMPI_FMT_USG, r_data, r_len, NULL); - gcry_mpi_scan(&s_mpi, GCRYMPI_FMT_USG, s_data, s_len, NULL); - free(r_data); - free(s_data); - - gcry_sexp_t sig_sexp; - gcry_sexp_build(&sig_sexp, NULL, "(sig-val (ecdsa (r %M) (s %M)))", r_mpi, s_mpi); - - native_timing_start(); - gcry_error_t err = gcry_pk_verify(sig_sexp, data_sexp, pub_sexp); - native_timing_stop(); - - if (gcry_err_code(err) != GPG_ERR_NO_ERROR) { - if (gcry_err_code(err) != GPG_ERR_BAD_SIGNATURE) { - throw_new(env, "java/security/GeneralSecurityException", "Error verif sig."); - goto release_init; - } - } else { - result = JNI_TRUE; - } - -release_init: - gcry_sexp_release(pub_sexp); - gcry_sexp_release(data_sexp); - return result; -}
\ No newline at end of file diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/ippcp.c b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/ippcp.c deleted file mode 100644 index 98a4c36..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/ippcp.c +++ /dev/null @@ -1,698 +0,0 @@ -#include <stdint.h> -#include <stdlib.h> -#include <string.h> -#include "native.h" - -#include <ippcp.h> - -#include "c_timing.h" -#include "c_utils.h" - -#define _POSIX_C_SOURCE 200809L - -#include <stdio.h> -#include <time.h> - -#define USE_SPEEDUP 1 -#define VALIDATE_CURVE 1 -#define VALIDATE_POINT 1 - -static IppsPRNGState *prng_state; -static jclass provider_class; - -/* This needs to be specified in this way because ippcp does not offer functionality to retrieve - information about supported curves in any way. */ -typedef struct { - const char name[128]; - IppECCType id; - int size; - IppStatus (*context_size_func)(int *); - IppStatus (*init_func)(IppsECCPState *); - IppStatus (*set_func)(IppsECCPState *); - IppStatus (*precomp_func)(IppsECCPState *); -} ippcp_curve; - -static const ippcp_curve CURVES[] = { - {"secp112r1", IppECCPStd112r1, 112, NULL, NULL, NULL, NULL}, - {"secp112r2", IppECCPStd112r2, 112, NULL, NULL, NULL, NULL}, - {"secp128r1", IppECCPStd128r1, 128, ippsECCPGetSizeStd128r1, ippsECCPInitStd128r1, ippsECCPSetStd128r1, NULL}, - {"secp128r2", IppECCPStd128r2, 128, ippsECCPGetSizeStd128r2, ippsECCPInitStd128r2, ippsECCPSetStd128r2, NULL}, - {"secp160r1", IppECCPStd160r1, 160, NULL, NULL, NULL, NULL}, - {"secp160r2", IppECCPStd160r2, 160, NULL, NULL, NULL, NULL}, - {"secp192r1", IppECCPStd192r1, 192, ippsECCPGetSizeStd192r1, ippsECCPInitStd192r1, ippsECCPSetStd192r1, ippsECCPBindGxyTblStd192r1}, - {"secp224r1", IppECCPStd224r1, 224, ippsECCPGetSizeStd224r1, ippsECCPInitStd224r1, ippsECCPSetStd224r1, ippsECCPBindGxyTblStd224r1}, - {"secp256r1", IppECCPStd256r1, 256, ippsECCPGetSizeStd256r1, ippsECCPInitStd256r1, ippsECCPSetStd256r1, ippsECCPBindGxyTblStd256r1}, - {"secp384r1", IppECCPStd384r1, 384, ippsECCPGetSizeStd384r1, ippsECCPInitStd384r1, ippsECCPSetStd384r1, ippsECCPBindGxyTblStd384r1}, - {"secp521r1", IppECCPStd521r1, 521, ippsECCPGetSizeStd521r1, ippsECCPInitStd521r1, ippsECCPSetStd521r1, ippsECCPBindGxyTblStd521r1}}; - -static const int NUM_CURVES = sizeof(CURVES) / sizeof(ippcp_curve); - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_IppcpLib_createProvider(JNIEnv *env, jobject this) { - /* Create the custom provider. */ - jclass local_provider_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeProvider$Ippcp"); - provider_class = (*env)->NewGlobalRef(env, local_provider_class); - - jmethodID init = (*env)->GetMethodID(env, local_provider_class, "<init>", "(Ljava/lang/String;DLjava/lang/String;)V"); - - const IppLibraryVersion *lib = ippcpGetLibVersion(); - jstring name = (*env)->NewStringUTF(env, lib->Name); - double version = (double)lib->major + ((double)lib->minor / 10); - jstring info = (*env)->NewStringUTF(env, lib->Version); - - // printf("%s\n%s\n%d.%d.%d.%d\n", lib->Name, lib->Version, lib->major, lib->minor, lib->majorBuild, lib->build); - - return (*env)->NewObject(env, provider_class, init, name, version, info); -} - -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Ippcp_setup(JNIEnv *env, jobject this) { - INIT_PROVIDER(env, provider_class); - - ADD_KPG(env, this, "EC", "Ippcp"); - ADD_KA(env, this, "ECDH", "IppcpECDH"); - ADD_SIG(env, this, "NONEwithECDSA", "IppcpECDSAwithNONE"); - - /* Init the PRNG. */ - int prng_size; - ippsPRNGGetSize(&prng_size); - prng_state = malloc(prng_size); - ippsPRNGInit(160, prng_state); - /* We need to manually seed the PRNG, let's hope that everyone using ippcp does this. - Otherwise: nonce reuse in ECDSA, whoops! */ - int seed_len = 8; - Ipp32u seed[seed_len]; - IppStatus res = ippsTRNGenRDSEED(seed, sizeof(seed) * 8, NULL); - if (res != ippStsNoErr) { - res = ippsPRNGenRDRAND(seed, sizeof(seed) * 8, NULL); - } - if (res != ippStsNoErr) { - FILE *urandom = fopen("/dev/urandom", "rb"); - if (urandom) { - size_t read = 0; - while (read < sizeof(seed)) { - read += fread(((uint8_t *)&seed) + read, 1, sizeof(seed) - read, urandom); - } - fclose(urandom); - res = ippStsNoErr; - } - } - if (res != ippStsNoErr) { - struct timespec t; - if (!clock_gettime(CLOCK_REALTIME, &t)) { - memcpy(seed, &t.tv_nsec, sizeof(t.tv_nsec) > sizeof(seed) ? sizeof(seed) : sizeof(t.tv_nsec)); - } else { - time_t tim = time(NULL); - memcpy(seed, &tim, sizeof(time_t) > sizeof(seed) ? sizeof(seed) : sizeof(time_t)); - } - } - int bn_size; - ippsBigNumGetSize(seed_len, &bn_size); - uint8_t bn_buf[bn_size]; - IppsBigNumState *bn = (IppsBigNumState *)bn_buf; - ippsBigNumInit(seed_len, bn); - ippsSet_BN(IppsBigNumPOS, seed_len, seed, bn); - ippsPRNGSetSeed(bn, prng_state); - - init_classes(env, "Ippcp"); -} - -static IppStatus prng_wrapper(Ipp32u *pRand, int nBits, void *pCtx) { - native_timing_pause(); - IppStatus result = ippsPRNGen(pRand, nBits, pCtx); - native_timing_restart(); - return result; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_IppcpLib_getCurves(JNIEnv *env, jobject this) { - jclass hash_set_class = (*env)->FindClass(env, "java/util/TreeSet"); - - jmethodID hash_set_ctr = (*env)->GetMethodID(env, hash_set_class, "<init>", "()V"); - jmethodID hash_set_add = (*env)->GetMethodID(env, hash_set_class, "add", "(Ljava/lang/Object;)Z"); - - jobject result = (*env)->NewObject(env, hash_set_class, hash_set_ctr); - - for (size_t i = 0; i < NUM_CURVES; ++i) { - jstring curve_name = (*env)->NewStringUTF(env, CURVES[i].name); - (*env)->CallBooleanMethod(env, result, hash_set_add, curve_name); - } - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Ippcp_keysizeSupported(JNIEnv *env, - jobject this, - jint keysize) { - for (size_t i = 0; i < NUM_CURVES; ++i) { - if (CURVES[i].size == keysize) { - return JNI_TRUE; - } - } - return JNI_FALSE; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Ippcp_paramsSupported(JNIEnv *env, - jobject this, - jobject params) { - if (params == NULL) { - return JNI_FALSE; - } - - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject curve = (*env)->CallObjectMethod(env, params, get_curve); - - jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = (*env)->CallObjectMethod(env, curve, get_field); - if ((*env)->IsInstanceOf(env, field, f2m_field_class)) { - return JNI_FALSE; - } - return JNI_TRUE; - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char *utf_name = (*env)->GetStringUTFChars(env, name, NULL); - for (size_t i = 0; i < NUM_CURVES; ++i) { - if (strcasecmp(utf_name, CURVES[i].name) == 0) { - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return JNI_TRUE; - } - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return JNI_FALSE; - } else { - return JNI_FALSE; - } -} - - -static IppsECCPPointState *new_point(int size) { - int point_size; - ippsECCPPointGetSize(size, &point_size); - IppsECCPPointState *point = malloc(point_size); - ippsECCPPointInit(size, point); - return point; -} - -static IppsBigNumState *new_bn(int bits) { - int bn_size; - int len = ((bits + 7) / 8) / sizeof(Ipp32u); - ippsBigNumGetSize(len, &bn_size); - IppsBigNumState *bn = malloc(bn_size); - ippsBigNumInit(len, bn); - return bn; -} - -static void bn_get(IppsBigNumState *bn, uint8_t *buf, int lsb) { - int size; - ippsGetSize_BN(bn, &size); - size *= sizeof(Ipp32u); - uint8_t data[size]; - ippsGetOctString_BN(data, size, bn); - memcpy(buf, data + (size - lsb), lsb); -} - -static jobject bn_to_biginteger(JNIEnv *env, const IppsBigNumState *bn) { - jmethodID biginteger_init = (*env)->GetMethodID(env, biginteger_class, "<init>", "(I[B)V"); - int bn_size; - ippsGetSize_BN(bn, &bn_size); - bn_size *= sizeof(Ipp32u); - jbyteArray bytes = (*env)->NewByteArray(env, bn_size); - jbyte *data = (*env)->GetByteArrayElements(env, bytes, NULL); - ippsGetOctString_BN((Ipp8u *) data, bn_size, bn); - (*env)->ReleaseByteArrayElements(env, bytes, data, 0); - jobject result = (*env)->NewObject(env, biginteger_class, biginteger_init, 1, bytes); - return result; -} - -static IppsBigNumState *biginteger_to_bn(JNIEnv *env, jobject bigint) { - jmethodID to_byte_array = (*env)->GetMethodID(env, biginteger_class, "toByteArray", "()[B"); - - jbyteArray byte_array = (jbyteArray) (*env)->CallObjectMethod(env, bigint, to_byte_array); - jsize byte_length = (*env)->GetArrayLength(env, byte_array); - jbyte *byte_data = (*env)->GetByteArrayElements(env, byte_array, NULL); - IppsBigNumState *result = new_bn(byte_length * 8); - ippsSetOctString_BN((Ipp8u *) byte_data, byte_length, result); - (*env)->ReleaseByteArrayElements(env, byte_array, byte_data, JNI_ABORT); - return result; -} - -/* -static void biginteger_print(JNIEnv *env, jobject bigint) { - jmethodID to_string = (*env)->GetMethodID(env, biginteger_class, "toString", "(I)Ljava/lang/String;"); - jstring big_string = (*env)->CallObjectMethod(env, bigint, to_string, (jint) 16); - - jsize len = (*env)->GetStringUTFLength(env, big_string); - char raw_string[len + 1]; - raw_string[len] = 0; - (*env)->GetStringUTFRegion(env, big_string, 0, len, raw_string); - printf("%s\n", raw_string); - fflush(stdout); -} -*/ - -static IppsECCPState *create_curve(JNIEnv *env, jobject params, int *keysize) { - jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject curve = (*env)->CallObjectMethod(env, params, get_curve); - - jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = (*env)->CallObjectMethod(env, curve, get_field); - - jmethodID get_bits = (*env)->GetMethodID(env, fp_field_class, "getFieldSize", "()I"); - jint bits = (*env)->CallIntMethod(env, field, get_bits); - - jmethodID get_p = (*env)->GetMethodID(env, fp_field_class, "getP", "()Ljava/math/BigInteger;"); - jobject p = (*env)->CallObjectMethod(env, field, get_p); - IppsBigNumState *p_bn = biginteger_to_bn(env, p); - - jmethodID get_a = (*env)->GetMethodID(env, elliptic_curve_class, "getA", "()Ljava/math/BigInteger;"); - jobject a = (*env)->CallObjectMethod(env, curve, get_a); - IppsBigNumState *a_bn = biginteger_to_bn(env, a); - - jmethodID get_b = (*env)->GetMethodID(env, elliptic_curve_class, "getB", "()Ljava/math/BigInteger;"); - jobject b = (*env)->CallObjectMethod(env, curve, get_b); - IppsBigNumState *b_bn = biginteger_to_bn(env, b); - - jmethodID get_g = (*env)->GetMethodID(env, ec_parameter_spec_class, "getGenerator", "()Ljava/security/spec/ECPoint;"); - jobject g = (*env)->CallObjectMethod(env, params, get_g); - - jmethodID get_x = (*env)->GetMethodID(env, point_class, "getAffineX", "()Ljava/math/BigInteger;"); - jobject gx = (*env)->CallObjectMethod(env, g, get_x); - IppsBigNumState *gx_bn = biginteger_to_bn(env, gx); - - jmethodID get_y = (*env)->GetMethodID(env, point_class, "getAffineY", "()Ljava/math/BigInteger;"); - jobject gy = (*env)->CallObjectMethod(env, g, get_y); - IppsBigNumState *gy_bn = biginteger_to_bn(env, gy); - - jmethodID get_n = (*env)->GetMethodID(env, ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;"); - jobject n = (*env)->CallObjectMethod(env, params, get_n); - IppsBigNumState *n_bn = biginteger_to_bn(env, n); - - jmethodID get_h = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCofactor", "()I"); - jint h = (*env)->CallIntMethod(env, params, get_h); - - if (keysize) { - *keysize = bits; - } - - int size; - ippsECCPGetSize(bits, &size); - IppsECCPState *result = malloc(size); - ippsECCPInit(bits, result); - ippsECCPSet(p_bn, a_bn, b_bn, gx_bn, gy_bn, n_bn, h, result); - - return result; -} - -static jobject create_ec_param_spec(JNIEnv *env, int keysize, IppsECCPState *curve) { - IppsBigNumState *p_bn = new_bn(keysize); - IppsBigNumState *a_bn = new_bn(keysize); - IppsBigNumState *b_bn = new_bn(keysize); - int ord_bits; - ippsECCPGetOrderBitSize(&ord_bits, curve); - IppsBigNumState *gx_bn = new_bn(ord_bits); - IppsBigNumState *gy_bn = new_bn(ord_bits); - IppsBigNumState *order_bn = new_bn(ord_bits); - int cofactor; - - ippsECCPGet(p_bn, a_bn, b_bn, gx_bn, gy_bn, order_bn, &cofactor, curve); - - jobject p = bn_to_biginteger(env, p_bn); - jmethodID fp_field_init = (*env)->GetMethodID(env, fp_field_class, "<init>", "(Ljava/math/BigInteger;)V"); - jobject field = (*env)->NewObject(env, fp_field_class, fp_field_init, p); - free(p_bn); - - jobject a = bn_to_biginteger(env, a_bn); - jobject b = bn_to_biginteger(env, b_bn); - free(a_bn); - free(b_bn); - - jmethodID elliptic_curve_init = (*env)->GetMethodID(env, elliptic_curve_class, "<init>", "(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject elliptic_curve = (*env)->NewObject(env, elliptic_curve_class, elliptic_curve_init, field, a, b); - - jobject gx = bn_to_biginteger(env, gx_bn); - jobject gy = bn_to_biginteger(env, gy_bn); - jmethodID point_init = (*env)->GetMethodID(env, point_class, "<init>", "(Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject g = (*env)->NewObject(env, point_class, point_init, gx, gy); - free(gx_bn); - free(gy_bn); - - jobject n = bn_to_biginteger(env, order_bn); - free(order_bn); - - jmethodID ec_parameter_spec_init = (*env)->GetMethodID(env, ec_parameter_spec_class, "<init>", "(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V"); - return (*env)->NewObject(env, ec_parameter_spec_class, ec_parameter_spec_init, elliptic_curve, g, n, cofactor); -} - -static jobject generate_from_curve(JNIEnv *env, int keysize, IppsECCPState *curve) { - if (VALIDATE_CURVE) { - IppECResult validation; - ippsECCPValidate(50, &validation, curve, ippsPRNGen, prng_state); - if (validation != ippECValid) { - throw_new(env, "java/security/GeneralSecurityException", ippsECCGetResultString(validation)); - return NULL; - } - } - - IppsECCPPointState *point = new_point(keysize); - - int ord_bits; - ippsECCPGetOrderBitSize(&ord_bits, curve); - int ord_bytes = (ord_bits + 7) / 8; - IppsBigNumState *secret = new_bn(ord_bits); - - native_timing_start(); - IppStatus err = ippsECCPGenKeyPair(secret, point, curve, prng_wrapper, prng_state); - native_timing_stop(); - - if (err != ippStsNoErr) { - throw_new(env, "java/security/GeneralSecurityException", ippcpGetStatusString(err)); - free(point); - free(secret); - return NULL; - } - - int coord_bytes = (keysize + 7) / 8; - IppsBigNumState *x = new_bn(keysize); - IppsBigNumState *y = new_bn(keysize); - - ippsECCPGetPoint(x, y, point, curve); - - jbyteArray pub_bytes = (*env)->NewByteArray(env, 2 * coord_bytes + 1); - jbyte *pub_data = (*env)->GetByteArrayElements(env, pub_bytes, NULL); - pub_data[0] = 0x04; - bn_get(x, (uint8_t *) (pub_data + 1), coord_bytes); - bn_get(y, (uint8_t *) (pub_data + 1 + coord_bytes), coord_bytes); - (*env)->ReleaseByteArrayElements(env, pub_bytes, pub_data, 0); - - jbyteArray priv_bytes = (*env)->NewByteArray(env, ord_bytes); - jbyte *priv_data = (*env)->GetByteArrayElements(env, priv_bytes, NULL); - bn_get(secret, (uint8_t *) priv_data, ord_bytes); - (*env)->ReleaseByteArrayElements(env, priv_bytes, priv_data, 0); - - free(point); - free(secret); - free(x); - free(y); - - jobject ec_param_spec = create_ec_param_spec(env, keysize, curve); - - jobject ec_pub_param_spec = (*env)->NewLocalRef(env, ec_param_spec); - jmethodID ec_pub_init = (*env)->GetMethodID(env, pubkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject pubkey = (*env)->NewObject(env, pubkey_class, ec_pub_init, pub_bytes, ec_pub_param_spec); - - jobject ec_priv_param_spec = (*env)->NewLocalRef(env, ec_param_spec); - jmethodID ec_priv_init = (*env)->GetMethodID(env, privkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject privkey = (*env)->NewObject(env, privkey_class, ec_priv_init, priv_bytes, ec_priv_param_spec); - - jmethodID keypair_init = (*env)->GetMethodID(env, keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V"); - return (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey); -} - -static jobject generate_from_curve_info(JNIEnv *env, const ippcp_curve *curve_info) { - int context_size; - if (curve_info->context_size_func) { - curve_info->context_size_func(&context_size); - } else { - ippsECCPGetSize(curve_info->size, &context_size); - } - uint8_t curve_buf[context_size]; - IppsECCPState *curve = (IppsECCPState *)curve_buf; - if (curve_info->init_func) { - curve_info->init_func(curve); - } else { - ippsECCPInit(curve_info->size, curve); - } - if (curve_info->set_func) { - curve_info->set_func(curve); - } else { - ippsECCPSetStd(curve_info->id, curve); - } - if (USE_SPEEDUP && curve_info->precomp_func) { - curve_info->precomp_func(curve); - } - return generate_from_curve(env, curve_info->size, curve); -} - -JNIEXPORT jobject JNICALL -Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Ippcp_generate__ILjava_security_SecureRandom_2(JNIEnv *env, - jobject this, - jint keysize, - jobject random) { - for (size_t i = 0; i < NUM_CURVES; ++i) { - if (CURVES[i].size == keysize) { - return generate_from_curve_info(env, &CURVES[i]); - } - } - return NULL; -} - -JNIEXPORT jobject JNICALL -Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Ippcp_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2( - JNIEnv *env, jobject this, jobject params, jobject random) { - - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - int keysize; - IppsECCPState *curve = create_curve(env, params, &keysize); - jobject result = generate_from_curve(env, keysize, curve); - free(curve); - return result; - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char *utf_name = (*env)->GetStringUTFChars(env, name, NULL); - const ippcp_curve *curve_info; - for (size_t i = 0; i < NUM_CURVES; ++i) { - if (strcasecmp(utf_name, CURVES[i].name) == 0) { - curve_info = &CURVES[i]; - break; - } - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return generate_from_curve_info(env, curve_info); - } else { - return NULL; - } -} - -static IppsECCPPointState *bytearray_to_pubkey(JNIEnv *env, jbyteArray pubkey, jint keysize, IppsECCPState *curve) { - IppsBigNumState *x_bn = new_bn(keysize); - IppsBigNumState *y_bn = new_bn(keysize); - - jint coord_size = (keysize + 7) / 8; - jbyte *pub_data = (*env)->GetByteArrayElements(env, pubkey, NULL); - ippsSetOctString_BN((Ipp8u *) (pub_data + 1), coord_size, x_bn); - ippsSetOctString_BN((Ipp8u *) (pub_data + 1 + coord_size), coord_size, y_bn); - (*env)->ReleaseByteArrayElements(env, pubkey, pub_data, JNI_ABORT); - - IppsECCPPointState *pub = new_point(keysize); - ippsECCPSetPoint(x_bn, y_bn, pub, curve); - free(x_bn); - free(y_bn); - return pub; -} - -static IppsBigNumState *bytearray_to_privkey(JNIEnv *env, jbyteArray privkey, IppsECCPState *curve) { - int ord_bits; - ippsECCPGetOrderBitSize(&ord_bits, curve); - IppsBigNumState *priv_bn = new_bn(ord_bits); - jbyte *priv_data = (*env)->GetByteArrayElements(env, privkey, NULL); - ippsSetOctString_BN((Ipp8u *) priv_data, (*env)->GetArrayLength(env, privkey), priv_bn); - (*env)->ReleaseByteArrayElements(env, privkey, priv_data, JNI_ABORT); - return priv_bn; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Ippcp_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject this, jbyteArray pubkey, jbyteArray privkey, jobject params) { - jint coord_size = ((*env)->GetArrayLength(env, pubkey) - 1) / 2; - jint keysize; - IppsECCPState *curve = create_curve(env, params, &keysize); - - if (VALIDATE_CURVE) { - IppECResult validation; - ippsECCPValidate(50, &validation, curve, ippsPRNGen, prng_state); - if (validation != ippECValid) { - throw_new(env, "java/security/GeneralSecurityException", ippsECCGetResultString(validation)); - free(curve); - return NULL; - } - } - IppsECCPPointState *pub = bytearray_to_pubkey(env, pubkey, keysize, curve); - - if (VALIDATE_POINT) { - IppECResult validation; - ippsECCPCheckPoint(pub, &validation, curve); - if (validation != ippECValid) { - throw_new(env, "java/security/GeneralSecurityException", ippsECCGetResultString(validation)); - free(curve); - free(pub); - return NULL; - } - } - - IppsBigNumState *priv_bn = bytearray_to_privkey(env, privkey, curve); - - IppsBigNumState *share = new_bn(keysize); - - native_timing_start(); - IppStatus err = ippsECCPSharedSecretDH(priv_bn, pub, share, curve); - native_timing_stop(); - - free(priv_bn); - free(pub); - free(curve); - - if (err != ippStsNoErr) { - throw_new(env, "java/security/GeneralSecurityException", ippcpGetStatusString(err)); - return NULL; - } - - jbyteArray result = (*env)->NewByteArray(env, coord_size); - jbyte *data = (*env)->GetByteArrayElements(env, result, NULL); - bn_get(share, (uint8_t *) data, coord_size); - (*env)->ReleaseByteArrayElements(env, result, data, 0); - free(share); - return result; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Ippcp_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2(JNIEnv *env, jobject this, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm) { - throw_new(env, "java/lang/UnsupportedOperationException", "Not supported."); - return NULL; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Ippcp_sign(JNIEnv *env, jobject this, jbyteArray data, jbyteArray privkey, jobject params) { - jint keysize; - IppsECCPState *curve = create_curve(env, params, &keysize); - - if (VALIDATE_CURVE) { - IppECResult validation; - ippsECCPValidate(50, &validation, curve, ippsPRNGen, prng_state); - if (validation != ippECValid) { - throw_new(env, "java/security/GeneralSecurityException", ippsECCGetResultString(validation)); - free(curve); - return NULL; - } - } - IppsBigNumState *priv_bn = bytearray_to_privkey(env, privkey, curve); - - IppsECCPPointState *ephemeral_point = new_point(keysize); - int ord_bits; - ippsECCPGetOrderBitSize(&ord_bits, curve); - int ord_bytes = (ord_bits + 7) / 8; - IppsBigNumState *ephemeral_secret = new_bn(ord_bits); - IppsBigNumState *r = new_bn(ord_bits); - IppsBigNumState *s = new_bn(ord_bits); - - jint data_size = (*env)->GetArrayLength(env, data); - IppsBigNumState *data_bn = new_bn(data_size * 8); - jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL); - ippsSetOctString_BN((Ipp8u *) data_data, data_size, data_bn); - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - - jbyteArray result = NULL; - jbyte r_buf[ord_bytes]; - jbyte s_buf[ord_bytes]; - - native_timing_start(); - IppStatus err = ippsECCPGenKeyPair(ephemeral_secret, ephemeral_point, curve, prng_wrapper, prng_state); - if (err != ippStsNoErr) { - throw_new(env, "java/security/GeneralSecurityException", ippcpGetStatusString(err)); - goto error; - } - err = ippsECCPSetKeyPair(ephemeral_secret, ephemeral_point, ippFalse, curve); - if (err != ippStsNoErr) { - throw_new(env, "java/security/GeneralSecurityException", ippcpGetStatusString(err)); - goto error; - } - err = ippsECCPSignDSA(data_bn, priv_bn, r, s, curve); - if (err != ippStsNoErr) { - throw_new(env, "java/security/GeneralSecurityException", ippcpGetStatusString(err)); - goto error; - } - native_timing_stop(); - - bn_get(r, (uint8_t *) r_buf, ord_bytes); - bn_get(s, (uint8_t *) s_buf, ord_bytes); - - result = asn1_der_encode(env, r_buf, ord_bytes, s_buf, ord_bytes); - -error: - free(curve); - free(priv_bn); - free(ephemeral_point); - free(ephemeral_secret); - free(r); - free(s); - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Ippcp_verify(JNIEnv *env, jobject this, jbyteArray signature, jbyteArray data, jbyteArray pubkey, jobject params) { - jint keysize; - IppsECCPState *curve = create_curve(env, params, &keysize); - - if (VALIDATE_CURVE) { - IppECResult validation; - ippsECCPValidate(50, &validation, curve, ippsPRNGen, prng_state); - if (validation != ippECValid) { - throw_new(env, "java/security/GeneralSecurityException", ippsECCGetResultString(validation)); - free(curve); - return JNI_FALSE; - } - } - IppsECCPPointState *pub = bytearray_to_pubkey(env, pubkey, keysize, curve); - - if (VALIDATE_POINT) { - IppECResult validation; - ippsECCPCheckPoint(pub, &validation, curve); - if (validation != ippECValid) { - throw_new(env, "java/security/GeneralSecurityException", ippsECCGetResultString(validation)); - free(curve); - free(pub); - return JNI_FALSE; - } - } - - size_t r_len, s_len; - jbyte *r_data, *s_data; - bool decode = asn1_der_decode(env, signature, &r_data, &r_len, &s_data, &s_len); - if (!decode) { - throw_new(env, "java/security/GeneralSecurityException", "Error decoding sig."); - free(curve); - free(pub); - return JNI_FALSE; - } - - int ord_bits; - ippsECCPGetOrderBitSize(&ord_bits, curve); - - IppsBigNumState *r = new_bn(ord_bits); - ippsSetOctString_BN((Ipp8u *) r_data, r_len, r); - free(r_data); - IppsBigNumState *s = new_bn(ord_bits); - ippsSetOctString_BN((Ipp8u *) s_data, s_len, s); - free(s_data); - - jint data_size = (*env)->GetArrayLength(env, data); - IppsBigNumState *data_bn = new_bn(data_size * 8); - jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL); - ippsSetOctString_BN((Ipp8u *) data_data, data_size, data_bn); - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - - IppECResult result; - - native_timing_start(); - ippsECCPSetKeyPair(NULL, pub, ippTrue, curve); - IppStatus err = ippsECCPVerifyDSA(data_bn, r, s, &result, curve); - native_timing_stop(); - - free(curve); - free(pub); - free(r); - free(s); - - if (err == ippStsNoErr && result == ippECValid) { - return JNI_TRUE; - } - if (err != ippStsNoErr) { - throw_new(env, "java/security/GeneralSecurityException", ippcpGetStatusString(err)); - return JNI_FALSE; - } - - return JNI_FALSE; -}
\ No newline at end of file diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/libressl.c b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/libressl.c deleted file mode 100644 index 79227f8..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/libressl.c +++ /dev/null @@ -1,609 +0,0 @@ -#include "native.h" -#include <string.h> - -#include <openssl/conf.h> -#include <openssl/opensslv.h> -#include <openssl/objects.h> -#include <openssl/obj_mac.h> -#include <openssl/bn.h> -#include <openssl/evp.h> -#include <openssl/err.h> -#include <openssl/ec.h> -#include <openssl/ecdh.h> -#include <openssl/ecdsa.h> - -#include "c_utils.h" -#include "c_timing.h" - - -static jclass provider_class; - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_LibresslLib_createProvider(JNIEnv *env, jobject self) { - /* Create the custom provider. */ - jclass local_provider_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeProvider$Libressl"); - provider_class = (*env)->NewGlobalRef(env, local_provider_class); - - jmethodID init = (*env)->GetMethodID(env, local_provider_class, "<init>", "(Ljava/lang/String;DLjava/lang/String;)V"); - - jstring name = (*env)->NewStringUTF(env, LIBRESSL_VERSION_TEXT); - long ver_hi = (LIBRESSL_VERSION_NUMBER & 0xff000000L) >> 28; - long ver_mid = (LIBRESSL_VERSION_NUMBER & 0x00ff0000L) >> 20; - long ver_low = (LIBRESSL_VERSION_NUMBER & 0x0000ff00L) >> 12; - double version = (double)ver_hi + ((double)ver_mid/10) + ((double)ver_low/100); - - return (*env)->NewObject(env, provider_class, init, name, version, name); -} - -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Libressl_setup(JNIEnv *env, jobject self) { - OPENSSL_init_crypto(0, NULL); - - INIT_PROVIDER(env, provider_class); - - ADD_KPG(env, self, "EC", "Libressl"); - ADD_KA(env, self, "ECDH", "LibresslECDH"); - ADD_SIG(env, self, "NONEwithECDSA", "LibresslECDSAwithNONE"); - - init_classes(env, "Libressl"); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_LibresslLib_getCurves(JNIEnv *env, jobject self) { - jclass hash_set_class = (*env)->FindClass(env, "java/util/TreeSet"); - - jmethodID hash_set_ctr = (*env)->GetMethodID(env, hash_set_class, "<init>", "()V"); - jmethodID hash_set_add = (*env)->GetMethodID(env, hash_set_class, "add", "(Ljava/lang/Object;)Z"); - - jobject result = (*env)->NewObject(env, hash_set_class, hash_set_ctr); - - size_t ncurves = EC_get_builtin_curves(NULL, 0); - EC_builtin_curve curves[ncurves]; - EC_get_builtin_curves(curves, ncurves); - - for (size_t i = 0; i < ncurves; ++i) { - jstring curve_name = (*env)->NewStringUTF(env, OBJ_nid2sn(curves[i].nid)); - (*env)->CallBooleanMethod(env, result, hash_set_add, curve_name); - } - - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Libressl_keysizeSupported(JNIEnv *env, jobject self, jint keysize) { - size_t ncurves = EC_get_builtin_curves(NULL, 0); - EC_builtin_curve curves[ncurves]; - EC_get_builtin_curves(curves, ncurves); - - for (size_t i = 0; i < ncurves; ++i) { - EC_GROUP *curve = EC_GROUP_new_by_curve_name(curves[i].nid); - if (EC_GROUP_get_degree(curve) == keysize) { - EC_GROUP_free(curve); - return JNI_TRUE; - } - EC_GROUP_free(curve); - } - return JNI_FALSE; -} - -static jobject bignum_to_biginteger(JNIEnv *env, const BIGNUM *bn) { - jmethodID biginteger_init = (*env)->GetMethodID(env, biginteger_class, "<init>", "(I[B)V"); - int size = BN_num_bytes(bn); - jbyteArray bytes = (*env)->NewByteArray(env, size); - jbyte *data = (*env)->GetByteArrayElements(env, bytes, NULL); - BN_bn2bin(bn, (unsigned char *) data); - (*env)->ReleaseByteArrayElements(env, bytes, data, 0); - jobject result = (*env)->NewObject(env, biginteger_class, biginteger_init, 1, bytes); - return result; -} - -static BIGNUM *biginteger_to_bignum(JNIEnv *env, jobject bigint) { - jmethodID to_byte_array = (*env)->GetMethodID(env, biginteger_class, "toByteArray", "()[B"); - - jbyteArray byte_array = (jbyteArray) (*env)->CallObjectMethod(env, bigint, to_byte_array); - jsize byte_length = (*env)->GetArrayLength(env, byte_array); - jbyte *byte_data = (*env)->GetByteArrayElements(env, byte_array, NULL); - BIGNUM *result = BN_bin2bn((unsigned char *) byte_data, byte_length, NULL); - (*env)->ReleaseByteArrayElements(env, byte_array, byte_data, JNI_ABORT); - return result; -} - -static EC_GROUP *create_curve(JNIEnv *env, jobject params) { - jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject elliptic_curve = (*env)->CallObjectMethod(env, params, get_curve); - - jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field); - - jmethodID get_a = (*env)->GetMethodID(env, elliptic_curve_class, "getA", "()Ljava/math/BigInteger;"); - jobject a = (*env)->CallObjectMethod(env, elliptic_curve, get_a); - BIGNUM *a_bn = biginteger_to_bignum(env, a); - - jmethodID get_b = (*env)->GetMethodID(env, elliptic_curve_class, "getB", "()Ljava/math/BigInteger;"); - jobject b = (*env)->CallObjectMethod(env, elliptic_curve, get_b); - BIGNUM *b_bn = biginteger_to_bignum(env, b); - - jmethodID get_g = (*env)->GetMethodID(env, ec_parameter_spec_class, "getGenerator", "()Ljava/security/spec/ECPoint;"); - jobject g = (*env)->CallObjectMethod(env, params, get_g); - - jmethodID get_x = (*env)->GetMethodID(env, point_class, "getAffineX", "()Ljava/math/BigInteger;"); - jobject gx = (*env)->CallObjectMethod(env, g, get_x); - BIGNUM *gx_bn = biginteger_to_bignum(env, gx); - - jmethodID get_y = (*env)->GetMethodID(env, point_class, "getAffineY", "()Ljava/math/BigInteger;"); - jobject gy = (*env)->CallObjectMethod(env, g, get_y); - BIGNUM *gy_bn = biginteger_to_bignum(env, gy); - - EC_GROUP *result; - EC_POINT *g_point; - - if ((*env)->IsInstanceOf(env, field, fp_field_class)) { - jmethodID get_p = (*env)->GetMethodID(env, fp_field_class, "getP", "()Ljava/math/BigInteger;"); - jobject p = (*env)->CallObjectMethod(env, field, get_p); - - BIGNUM *p_bn = biginteger_to_bignum(env, p); - result = EC_GROUP_new_curve_GFp(p_bn, a_bn, b_bn, NULL); - BN_free(p_bn); - - if (!result) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating EC_GROUP, EC_GROUP_new_curve_GFp."); - BN_free(a_bn); BN_free(b_bn); BN_free(gx_bn); BN_free(gy_bn); - return NULL; - } - - g_point = EC_POINT_new(result); - if(!EC_POINT_set_affine_coordinates_GFp(result, g_point, gx_bn, gy_bn, NULL)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating EC_GROUP, EC_POINT_set_affine_coordinates_GFp."); - BN_free(a_bn); BN_free(b_bn); BN_free(gx_bn); BN_free(gy_bn); EC_POINT_free(g_point); EC_GROUP_free(result); - return NULL; - } - } else if ((*env)->IsInstanceOf(env, field, f2m_field_class)) { - jmethodID get_reduction_poly = (*env)->GetMethodID(env, f2m_field_class, "getReductionPolynomial", "()Ljava/math/BigInteger;"); - jobject red_poly = (*env)->CallObjectMethod(env, field, get_reduction_poly); - - BIGNUM *p_bn = biginteger_to_bignum(env, red_poly); - result = EC_GROUP_new_curve_GF2m(p_bn, a_bn, b_bn, NULL); - BN_free(p_bn); - if (!result) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating EC_GROUP, EC_GROUP_new_curve_GF2m."); - BN_free(a_bn); BN_free(b_bn); BN_free(gx_bn); BN_free(gy_bn); - return NULL; - } - - g_point = EC_POINT_new(result); - if(!EC_POINT_set_affine_coordinates_GF2m(result, g_point, gx_bn, gy_bn, NULL)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating EC_GROUP, EC_POINT_set_affine_coordinates_GF2m."); - BN_free(a_bn); BN_free(b_bn); BN_free(gx_bn); BN_free(gy_bn); EC_POINT_free(g_point); EC_GROUP_free(result); - return NULL; - } - } else { - return NULL; - } - - BN_free(a_bn); - BN_free(b_bn); - - jmethodID get_n = (*env)->GetMethodID(env, ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;"); - jobject n = (*env)->CallObjectMethod(env, params, get_n); - BIGNUM *n_bn = biginteger_to_bignum(env, n); - - jmethodID get_h = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCofactor", "()I"); - jint h = (*env)->CallIntMethod(env, params, get_h); - BIGNUM *h_bn = BN_new(); - BN_set_word(h_bn, h); - - if (!EC_GROUP_set_generator(result, g_point, n_bn, h_bn)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating EC_GROUP, EC_GROUP_set_generator."); - BN_free(n_bn); BN_free(h_bn); BN_free(gx_bn); BN_free(gy_bn); EC_POINT_free(g_point); EC_GROUP_free(result); - return NULL; - } - - EC_POINT_free(g_point); - BN_free(gx_bn); - BN_free(gy_bn); - BN_free(n_bn); - BN_free(h_bn); - - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Libressl_paramsSupported(JNIEnv *env, jobject self, jobject params){ - if (params == NULL) { - return JNI_FALSE; - } - - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - EC_GROUP *curve = create_curve(env, params); - jboolean result = (EC_GROUP_check(curve, NULL) == 1) ? JNI_TRUE : JNI_FALSE; - EC_GROUP_free(curve); - return result; - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char *utf_name = (*env)->GetStringUTFChars(env, name, NULL); - size_t ncurves = EC_get_builtin_curves(NULL, 0); - EC_builtin_curve curves[ncurves]; - EC_get_builtin_curves(curves, ncurves); - for (size_t i = 0; i < ncurves; ++i) { - if (strcasecmp(utf_name, OBJ_nid2sn(curves[i].nid)) == 0) { - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return JNI_TRUE; - } - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return JNI_FALSE; - } else { - return JNI_FALSE; - } -} - -static jobject create_ec_param_spec(JNIEnv *env, const EC_GROUP *curve) { - int field_type = EC_METHOD_get_field_type(EC_GROUP_method_of(curve)); - BIGNUM *a; - BIGNUM *b; - - BIGNUM *gx; - BIGNUM *gy; - jobject field; - - a = BN_new(); - b = BN_new(); - - if (field_type == NID_X9_62_prime_field) { - BIGNUM *p = BN_new(); - - if (!EC_GROUP_get_curve_GFp(curve, p, a, b, NULL)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_GROUP_get_curve_GFp."); - BN_free(p); BN_free(a); BN_free(b); - return NULL; - } - - jobject p_int = bignum_to_biginteger(env, p); - - jmethodID fp_field_init = (*env)->GetMethodID(env, fp_field_class, "<init>", "(Ljava/math/BigInteger;)V"); - field = (*env)->NewObject(env, fp_field_class, fp_field_init, p_int); - - BN_free(p); - - gx = BN_new(); - gy = BN_new(); - if (!EC_POINT_get_affine_coordinates_GFp(curve, EC_GROUP_get0_generator(curve), gx, gy, NULL)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_POINT_get_affine_coordinates_GFp."); - BN_free(a); BN_free(b); BN_free(gx); BN_free(gy); - return NULL; - } - } else if (field_type == NID_X9_62_characteristic_two_field) { - if (!EC_GROUP_get_curve_GF2m(curve, NULL, a, b, NULL)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_GROUP_get_curve_GF2m."); - BN_free(a); BN_free(b); - return NULL; - } - - int basis_type = EC_GROUP_get_basis_type(curve); - jintArray ks; - jint *ks_data; - if (basis_type == NID_X9_62_tpBasis) { - ks = (*env)->NewIntArray(env, 1); - ks_data = (*env)->GetIntArrayElements(env, ks, NULL); - if (!EC_GROUP_get_trinomial_basis(curve, (unsigned int *) &ks_data[0])) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_GROUP_get_trinomial_basis."); - BN_free(a); BN_free(b); - (*env)->ReleaseIntArrayElements(env, ks, ks_data, JNI_ABORT); - return NULL; - } - } else if (basis_type == NID_X9_62_ppBasis) { - ks = (*env)->NewIntArray(env, 3); - ks_data = (*env)->GetIntArrayElements(env, ks, NULL); - if (!EC_GROUP_get_pentanomial_basis(curve, (unsigned int *) &ks_data[0], (unsigned int *) &ks_data[1], (unsigned int *) &ks_data[2])) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_GROUP_get_pentanomial_basis."); - BN_free(a); BN_free(b); - (*env)->ReleaseIntArrayElements(env, ks, ks_data, JNI_ABORT); - return NULL; - } - } else { - return NULL; - } - (*env)->ReleaseIntArrayElements(env, ks, ks_data, 0); - - jint m = EC_GROUP_get_degree(curve); - - jmethodID f2m_field_init = (*env)->GetMethodID(env, f2m_field_class, "<init>", "(I[I)V"); - field = (*env)->NewObject(env, f2m_field_class, f2m_field_init, m, ks); - - gx = BN_new(); - gy = BN_new(); - if (!EC_POINT_get_affine_coordinates_GF2m(curve, EC_GROUP_get0_generator(curve), gx, gy, NULL)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_POINT_get_affine_coordinates_GF2m."); - BN_free(a); BN_free(b); BN_free(gx); BN_free(gy); - return NULL; - } - } else { - return NULL; - } - - jobject a_int = bignum_to_biginteger(env, a); - jobject b_int = bignum_to_biginteger(env, b); - - jmethodID elliptic_curve_init = (*env)->GetMethodID(env, elliptic_curve_class, "<init>", "(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject elliptic_curve = (*env)->NewObject(env, elliptic_curve_class, elliptic_curve_init, field, a_int, b_int); - - BN_free(a); - BN_free(b); - - jobject gx_int = bignum_to_biginteger(env, gx); - jobject gy_int = bignum_to_biginteger(env, gy); - - BN_free(gx); - BN_free(gy); - - BN_CTX *ctx = BN_CTX_new(); - if (!ctx) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", - "Could not create bignum context."); - return NULL; - } - - BN_CTX_start(ctx); - - BIGNUM *order = BN_CTX_get(ctx); - if (!order || !EC_GROUP_get_order(curve, order, ctx)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", - "Could not obtain curve order."); - BN_CTX_end(ctx); - BN_CTX_free(ctx); - return NULL; - } - - jobject order_obj = bignum_to_biginteger(env, order); - BN_CTX_end(ctx); - BN_CTX_free(ctx); - - BIGNUM *h = BN_new(); - EC_GROUP_get_cofactor(curve, h, NULL); - jint cofactor = BN_get_word(h); - BN_free(h); - - jmethodID point_init = (*env)->GetMethodID(env, point_class, "<init>", "(Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject g = (*env)->NewObject(env, point_class, point_init, gx_int, gy_int); - - jmethodID ec_parameter_spec_init = (*env)->GetMethodID(env, ec_parameter_spec_class, "<init>", "(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V"); - return (*env)->NewObject(env, ec_parameter_spec_class, ec_parameter_spec_init, elliptic_curve, g, order_obj, cofactor); -} - -static jobject generate_from_curve(JNIEnv *env, const EC_GROUP *curve) { - jint keysize = EC_GROUP_get_degree(curve); - unsigned long key_bytes = (keysize + 7) / 8; - - EC_KEY *key = EC_KEY_new(); - EC_KEY_set_group(key, curve); - - native_timing_start(); - int err = EC_KEY_generate_key(key); - native_timing_stop(); - - if (!err) { - throw_new(env, "java/security/GeneralSecurityException", "Error generating key, EC_KEY_generate_key."); - EC_KEY_free(key); - return NULL; - } - - jbyteArray priv_bytes = (*env)->NewByteArray(env, key_bytes); - jbyte *key_priv = (*env)->GetByteArrayElements(env, priv_bytes, NULL); - int priv_len = BN_num_bytes(EC_KEY_get0_private_key(key)); - memset(key_priv, 0, key_bytes); - BN_bn2bin(EC_KEY_get0_private_key(key), (unsigned char *) key_priv + (key_bytes - priv_len)); - (*env)->ReleaseByteArrayElements(env, priv_bytes, key_priv, 0); - - unsigned long key_len = 2*key_bytes + 1; - jbyteArray pub_bytes = (*env)->NewByteArray(env, key_len); - jbyte *key_pub = (*env)->GetByteArrayElements(env, pub_bytes, NULL); - EC_POINT_point2oct(curve, EC_KEY_get0_public_key(key), POINT_CONVERSION_UNCOMPRESSED, (unsigned char *) key_pub, key_len, NULL); - (*env)->ReleaseByteArrayElements(env, pub_bytes, key_pub, 0); - - EC_KEY_free(key); - - jobject ec_param_spec = create_ec_param_spec(env, curve); - - jobject ec_pub_param_spec = (*env)->NewLocalRef(env, ec_param_spec); - jmethodID ec_pub_init = (*env)->GetMethodID(env, pubkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject pubkey = (*env)->NewObject(env, pubkey_class, ec_pub_init, pub_bytes, ec_pub_param_spec); - - jobject ec_priv_param_spec = (*env)->NewLocalRef(env, ec_param_spec); - jmethodID ec_priv_init = (*env)->GetMethodID(env, privkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject privkey = (*env)->NewObject(env, privkey_class, ec_priv_init, priv_bytes, ec_priv_param_spec); - - jmethodID keypair_init = (*env)->GetMethodID(env, keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V"); - return (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Libressl_generate__ILjava_security_SecureRandom_2(JNIEnv *env, jobject self, jint keysize, jobject random) { - size_t ncurves = EC_get_builtin_curves(NULL, 0); - EC_builtin_curve curves[ncurves]; - EC_get_builtin_curves(curves, ncurves); - - EC_GROUP *curve = NULL; - for (size_t i = 0; i < ncurves; ++i) { - curve = EC_GROUP_new_by_curve_name(curves[i].nid); - if (EC_GROUP_get_degree(curve) == keysize) { - break; - } - EC_GROUP_free(curve); - } - - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve for given bitsize not found."); - return NULL; - } - - jobject result = generate_from_curve(env, curve); - EC_GROUP_free(curve); - return result; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Libressl_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(JNIEnv *env, jobject self, jobject params, jobject random) { - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - EC_GROUP *curve = create_curve(env, params); - jobject result = generate_from_curve(env, curve); - EC_GROUP_free(curve); - return result; - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char* utf_name = (*env)->GetStringUTFChars(env, name, NULL); - size_t ncurves = EC_get_builtin_curves(NULL, 0); - EC_builtin_curve curves[ncurves]; - EC_get_builtin_curves(curves, ncurves); - EC_GROUP *curve = NULL; - for (size_t i = 0; i < ncurves; ++i) { - if (strcasecmp(utf_name, OBJ_nid2sn(curves[i].nid)) == 0) { - curve = EC_GROUP_new_by_curve_name(curves[i].nid); - break; - } - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve for given bitsize not found."); - return NULL; - } - jobject result = generate_from_curve(env, curve); - EC_GROUP_free(curve); - return result; - } else { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found."); - return NULL; - } -} - -EC_KEY *barray_to_pubkey(JNIEnv *env, const EC_GROUP *curve, jbyteArray pub) { - EC_KEY *result = EC_KEY_new(); - EC_KEY_set_group(result, curve); - jsize pub_len = (*env)->GetArrayLength(env, pub); - jbyte *pub_data = (*env)->GetByteArrayElements(env, pub, NULL); - EC_POINT *pub_point = EC_POINT_new(curve); - EC_POINT_oct2point(curve, pub_point, (unsigned char *) pub_data, pub_len, NULL); - (*env)->ReleaseByteArrayElements(env, pub, pub_data, JNI_ABORT); - EC_KEY_set_public_key(result, pub_point); - EC_POINT_free(pub_point); - return result; -} - -EC_KEY *barray_to_privkey(JNIEnv *env, const EC_GROUP *curve, jbyteArray priv) { - EC_KEY *result = EC_KEY_new(); - EC_KEY_set_group(result, curve); - jsize priv_len = (*env)->GetArrayLength(env, priv); - jbyte *priv_data = (*env)->GetByteArrayElements(env, priv, NULL); - BIGNUM *s = BN_bin2bn((unsigned char *) priv_data, priv_len, NULL); - (*env)->ReleaseByteArrayElements(env, priv, priv_data, JNI_ABORT); - EC_KEY_set_private_key(result, s); - BN_free(s); - return result; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Libressl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params) { - EC_GROUP *curve = create_curve(env, params); - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found."); - return NULL; - } - - EC_KEY *pub = barray_to_pubkey(env, curve, pubkey); - EC_KEY *priv = barray_to_privkey(env, curve, privkey); - - int field_size = EC_GROUP_get_degree(curve); - size_t secret_len = (field_size + 7)/8; - - //TODO: Do more KeyAgreements here, but will have to do the hash-fun manually, - // probably using the ECDH_KDF_X9_62 by wrapping it and dynamically choosing the EVP_MD. from the type string. - jbyteArray result = (*env)->NewByteArray(env, secret_len); - jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL); - - native_timing_start(); - int err = ECDH_compute_key(result_data, secret_len, EC_KEY_get0_public_key(pub), priv, NULL); - native_timing_stop(); - - if (err <= 0) { - throw_new(env, "java/security/GeneralSecurityException", "Error computing ECDH, ECDH_compute_key."); - EC_KEY_free(pub); EC_KEY_free(priv); EC_GROUP_free(curve); - (*env)->ReleaseByteArrayElements(env, result, result_data, JNI_ABORT); - return NULL; - } - (*env)->ReleaseByteArrayElements(env, result, result_data, 0); - - EC_KEY_free(pub); - EC_KEY_free(priv); - EC_GROUP_free(curve); - return result; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Libressl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm) { - throw_new(env, "java/lang/UnsupportedOperationException", "Not supported."); - return NULL; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Libressl_sign(JNIEnv *env, jobject self, jbyteArray data, jbyteArray privkey, jobject params) { - EC_GROUP *curve = create_curve(env, params); - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found."); - return NULL; - } - - EC_KEY *priv = barray_to_privkey(env, curve, privkey); - - jsize data_size = (*env)->GetArrayLength(env, data); - jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL); - // TODO: Do more Signatures here, maybe use the EVP interface to get to the hashes easier and not hash manually? - - native_timing_start(); - ECDSA_SIG *signature = ECDSA_do_sign((unsigned char *) data_data, data_size, priv); - native_timing_stop(); - - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - if (!signature) { - throw_new(env, "java/security/GeneralSecurityException", "Error signing, ECDSA_do_sign."); - EC_KEY_free(priv); EC_GROUP_free(curve); - return NULL; - } - - jsize sig_len = i2d_ECDSA_SIG(signature, NULL); - jbyteArray result = (*env)->NewByteArray(env, sig_len); - jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL); - jbyte *result_data_ptr = result_data; - i2d_ECDSA_SIG(signature, (unsigned char **)&result_data_ptr); - (*env)->ReleaseByteArrayElements(env, result, result_data, 0); - - ECDSA_SIG_free(signature); - EC_KEY_free(priv); - EC_GROUP_free(curve); - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Libressl_verify(JNIEnv *env, jobject self, jbyteArray signature, jbyteArray data, jbyteArray pubkey, jobject params) { - EC_GROUP *curve = create_curve(env, params); - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found."); - return JNI_FALSE; - } - - EC_KEY *pub = barray_to_pubkey(env, curve, pubkey); - - jsize sig_len = (*env)->GetArrayLength(env, signature); - jbyte *sig_data = (*env)->GetByteArrayElements(env, signature, NULL); - jbyte *sig_data_ptr = sig_data; - ECDSA_SIG *sig_obj = d2i_ECDSA_SIG(NULL, (const unsigned char **)&sig_data_ptr, sig_len); - (*env)->ReleaseByteArrayElements(env, signature, sig_data, JNI_ABORT); - - jsize data_size = (*env)->GetArrayLength(env, data); - jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL); - - native_timing_start(); - int result = ECDSA_do_verify((unsigned char *) data_data, data_size, sig_obj, pub); - native_timing_stop(); - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - - if (result < 0) { - throw_new(env, "java/security/GeneralSecurityException", "Error verifying, ECDSA_do_verify."); - EC_KEY_free(pub); EC_GROUP_free(curve); ECDSA_SIG_free(sig_obj); - return JNI_FALSE; - } - - ECDSA_SIG_free(sig_obj); - EC_KEY_free(pub); - EC_GROUP_free(curve); - return (result == 1) ? JNI_TRUE : JNI_FALSE; -} diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/matrixssl.c b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/matrixssl.c deleted file mode 100644 index 8324dd4..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/matrixssl.c +++ /dev/null @@ -1,397 +0,0 @@ -#include "native.h" -#include <string.h> -#include <stdio.h> - -#include <cryptoApi.h> -#include <coreApi.h> - -#include "c_utils.h" -#include "c_timing.h" - -static jclass provider_class; - - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MatrixsslLib_createProvider(JNIEnv *env, jobject this) { - /* Create the custom provider. */ - jclass local_provider_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeProvider$Matrixssl"); - provider_class = (*env)->NewGlobalRef(env, local_provider_class); - - jmethodID init = (*env)->GetMethodID(env, local_provider_class, "<init>", "(Ljava/lang/String;DLjava/lang/String;)V"); - - jstring name = (*env)->NewStringUTF(env, "MatrixSSL"); - double version = 4.1; - - return (*env)->NewObject(env, provider_class, init, name, version, name); -} - -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Matrixssl_setup(JNIEnv *env, jobject this) { - INIT_PROVIDER(env, provider_class); - - ADD_KPG(env, this, "EC", "Matrixssl"); - ADD_KA(env, this, "ECDH", "MatrixsslECDH"); - ADD_SIG(env, this, "NONEwithECDSA", "MatrixsslECDSAwithNONE"); - - psCoreOpen(PSCORE_CONFIG); - psOpenPrng(); - - init_classes(env, "Matrixssl"); -} - - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MatrixsslLib_getCurves(JNIEnv *env, jobject this) { - jclass hash_set_class = (*env)->FindClass(env, "java/util/TreeSet"); - - jmethodID hash_set_ctr = (*env)->GetMethodID(env, hash_set_class, "<init>", "()V"); - jmethodID hash_set_add = (*env)->GetMethodID(env, hash_set_class, "add", "(Ljava/lang/Object;)Z"); - - jobject result = (*env)->NewObject(env, hash_set_class, hash_set_ctr); - size_t i = 0; - while (eccCurves[i].size > 0) { - jstring curve_name = (*env)->NewStringUTF(env, eccCurves[i].name); - (*env)->CallBooleanMethod(env, result, hash_set_add, curve_name); - i++; - } - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Matrixssl_keysizeSupported(JNIEnv *env, jobject this, jint keysize) { - size_t i = 0; - while (eccCurves[i].size > 0) { - if (eccCurves[i].size * 8 == keysize) { - return JNI_TRUE; - } - i++; - } - return JNI_FALSE; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Matrixssl_paramsSupported(JNIEnv *env, jobject this, jobject params) { - if (params == NULL) { - return JNI_FALSE; - } - - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject curve = (*env)->CallObjectMethod(env, params, get_curve); - - jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = (*env)->CallObjectMethod(env, curve, get_field); - if ((*env)->IsInstanceOf(env, field, f2m_field_class)) { - return JNI_FALSE; - } - return JNI_TRUE; - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char *utf_name = (*env)->GetStringUTFChars(env, name, NULL); - size_t i = 0; - while (eccCurves[i].size > 0) { - if (strcasecmp(utf_name, eccCurves[i].name) == 0) { - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return JNI_TRUE; - } - i++; - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return JNI_FALSE; - } else { - return JNI_FALSE; - } -} - - -static jobject create_ec_param_spec(JNIEnv *env, const psEccCurve_t *curve) { - jmethodID biginteger_init = (*env)->GetMethodID(env, biginteger_class, "<init>", "(Ljava/lang/String;I)V"); - - jstring p_string = (*env)->NewStringUTF(env, curve->prime); - jobject p = (*env)->NewObject(env, biginteger_class, biginteger_init, p_string, (jint) 16); - - jmethodID fp_field_init = (*env)->GetMethodID(env, fp_field_class, "<init>", "(Ljava/math/BigInteger;)V"); - jobject field = (*env)->NewObject(env, fp_field_class, fp_field_init, p); - - jstring a_string = (*env)->NewStringUTF(env, curve->A); - jobject a = (*env)->NewObject(env, biginteger_class, biginteger_init, a_string, (jint) 16); - jstring b_string = (*env)->NewStringUTF(env, curve->B); - jobject b = (*env)->NewObject(env, biginteger_class, biginteger_init, b_string, (jint) 16); - - jmethodID elliptic_curve_init = (*env)->GetMethodID(env, elliptic_curve_class, "<init>", "(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject elliptic_curve = (*env)->NewObject(env, elliptic_curve_class, elliptic_curve_init, field, a, b); - - jstring gx_string = (*env)->NewStringUTF(env, curve->Gx); - jstring gy_string = (*env)->NewStringUTF(env, curve->Gy); - jobject gx = (*env)->NewObject(env, biginteger_class, biginteger_init, gx_string, (jint) 16); - jobject gy = (*env)->NewObject(env, biginteger_class, biginteger_init, gy_string, (jint) 16); - - jmethodID point_init = (*env)->GetMethodID(env, point_class, "<init>", "(Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject g = (*env)->NewObject(env, point_class, point_init, gx, gy); - - jstring n_string = (*env)->NewStringUTF(env, curve->order); - jobject n = (*env)->NewObject(env, biginteger_class, biginteger_init, n_string, (jint) 16); - - jmethodID ec_parameter_spec_init = (*env)->GetMethodID(env, ec_parameter_spec_class, "<init>", "(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V"); - return (*env)->NewObject(env, ec_parameter_spec_class, ec_parameter_spec_init, elliptic_curve, g, n, (jint) 1); -} - -static psEccCurve_t *create_curve(JNIEnv *env, jobject params) { - psEccCurve_t *curve = calloc(sizeof(psEccCurve_t), 1); - - jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject elliptic_curve = (*env)->CallObjectMethod(env, params, get_curve); - - jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field); - - jmethodID get_bits = (*env)->GetMethodID(env, fp_field_class, "getFieldSize", "()I"); - jint bits = (*env)->CallIntMethod(env, field, get_bits); - jint bytes = (bits + 7) / 8; - curve->size = bytes; - - jmethodID get_p = (*env)->GetMethodID(env, fp_field_class, "getP", "()Ljava/math/BigInteger;"); - jobject p = (*env)->CallObjectMethod(env, field, get_p); - - jmethodID get_a = (*env)->GetMethodID(env, elliptic_curve_class, "getA", "()Ljava/math/BigInteger;"); - jobject a = (*env)->CallObjectMethod(env, elliptic_curve, get_a); - - jmethodID get_b = (*env)->GetMethodID(env, elliptic_curve_class, "getB", "()Ljava/math/BigInteger;"); - jobject b = (*env)->CallObjectMethod(env, elliptic_curve, get_b); - - jmethodID get_g = (*env)->GetMethodID(env, ec_parameter_spec_class, "getGenerator", "()Ljava/security/spec/ECPoint;"); - jobject g = (*env)->CallObjectMethod(env, params, get_g); - - jmethodID get_x = (*env)->GetMethodID(env, point_class, "getAffineX", "()Ljava/math/BigInteger;"); - jobject gx = (*env)->CallObjectMethod(env, g, get_x); - - jmethodID get_y = (*env)->GetMethodID(env, point_class, "getAffineY", "()Ljava/math/BigInteger;"); - jobject gy = (*env)->CallObjectMethod(env, g, get_y); - - jmethodID get_n = (*env)->GetMethodID(env, ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;"); - jobject n = (*env)->CallObjectMethod(env, params, get_n); - - //jmethodID get_h = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCofactor", "()I"); - //jint h = (*env)->CallIntMethod(env, params, get_h); - - jmethodID get_bitlength = (*env)->GetMethodID(env, biginteger_class, "bitLength", "()I"); - jint ord_bits = (*env)->CallIntMethod(env, n, get_bitlength); - jint ord_bytes = (ord_bits + 7) / 8; - - curve->prime = biginteger_to_hex(env, p, bytes); - curve->A = biginteger_to_hex(env, a, bytes); - curve->B = biginteger_to_hex(env, b, bytes); - curve->Gx = biginteger_to_hex(env, gx, bytes); - curve->Gy = biginteger_to_hex(env, gy, bytes); - curve->order = biginteger_to_hex(env, n, ord_bytes); - return curve; -} - -static void free_curve(psEccCurve_t *curve) { - free((char *)curve->prime); - free((char *)curve->A); - free((char *)curve->B); - free((char *)curve->order); - free((char *)curve->Gx); - free((char *)curve->Gy); -} - -static jobject generate_from_curve(JNIEnv *env, const psEccCurve_t *curve) { - psEccKey_t *key; - int32_t err = psEccNewKey(NULL, &key, curve); - err = psEccInitKey(NULL, key, curve); - - native_timing_start(); - err = psEccGenKey(NULL, key, curve, NULL); - native_timing_stop(); - - if (err < 0) { - throw_new(env, "java/security/GeneralSecurityException", "Couldn't generate key."); - psEccClearKey(key); - psEccDeleteKey(&key); - return NULL; - } - - jbyteArray priv = (*env)->NewByteArray(env, pstm_unsigned_bin_size(&key->k)); - jbyte *priv_data = (*env)->GetByteArrayElements(env, priv, NULL); - pstm_to_unsigned_bin(NULL, &key->k, (unsigned char *) priv_data); - (*env)->ReleaseByteArrayElements(env, priv, priv_data, 0); - - jint xlen = pstm_unsigned_bin_size(&key->pubkey.x); - jint ylen = pstm_unsigned_bin_size(&key->pubkey.y); - jbyteArray pub = (*env)->NewByteArray(env, 1 + xlen + ylen); - jbyte *pub_data = (*env)->GetByteArrayElements(env, pub, NULL); - pub_data[0] = 0x04; - pstm_to_unsigned_bin(NULL, &key->pubkey.x, (unsigned char *) (pub_data + 1)); - pstm_to_unsigned_bin(NULL, &key->pubkey.y, (unsigned char *) (pub_data + 1 + xlen)); - (*env)->ReleaseByteArrayElements(env, pub, pub_data, 0); - - jobject ec_param_spec = create_ec_param_spec(env, curve); - - jobject ec_pub_param_spec = (*env)->NewLocalRef(env, ec_param_spec); - jmethodID ec_pub_init = (*env)->GetMethodID(env, pubkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject pubkey = (*env)->NewObject(env, pubkey_class, ec_pub_init, pub, ec_pub_param_spec); - - jobject ec_priv_param_spec = (*env)->NewLocalRef(env, ec_param_spec); - jmethodID ec_priv_init = (*env)->GetMethodID(env, privkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject privkey = (*env)->NewObject(env, privkey_class, ec_priv_init, priv, ec_priv_param_spec); - - jmethodID keypair_init = (*env)->GetMethodID(env, keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V"); - - psEccDeleteKey(&key); - - return (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Matrixssl_generate__ILjava_security_SecureRandom_2(JNIEnv *env, jobject this, jint keysize, jobject random) { - size_t i = 0; - while (eccCurves[i].size > 0) { - if (eccCurves[i].size * 8 == keysize) { - return generate_from_curve(env, &eccCurves[i]); - } - i++; - } - return NULL; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Matrixssl_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(JNIEnv *env, jobject this, jobject params, jobject random) { - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - psEccCurve_t *curve = create_curve(env, params); - jobject result = generate_from_curve(env, curve); - free_curve(curve); - return result; - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char* utf_name = (*env)->GetStringUTFChars(env, name, NULL); - size_t i = 0; - while (eccCurves[i].size > 0) { - if (strcasecmp(utf_name, eccCurves[i].name) == 0) { - break; - } - i++; - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return generate_from_curve(env, &eccCurves[i]); - } else { - return NULL; - } -} - -static psEccKey_t *bytearray_to_privkey(JNIEnv *env, jbyteArray privkey, const psEccCurve_t *curve) { - psEccKey_t *result; - psEccNewKey(NULL, &result, curve); - psEccInitKey(NULL, result, curve); - - pstm_init_for_read_unsigned_bin(NULL, &result->k, curve->size); - jint len = (*env)->GetArrayLength(env, privkey); - jbyte *priv_data = (*env)->GetByteArrayElements(env, privkey, NULL); - pstm_read_unsigned_bin(&result->k, (unsigned char *) priv_data, len); - (*env)->ReleaseByteArrayElements(env, privkey, priv_data, JNI_ABORT); - result->type = PS_PRIVKEY; - - return result; -} - -static psEccKey_t *bytearray_to_pubkey(JNIEnv *env, jbyteArray pubkey, const psEccCurve_t *curve) { - psEccKey_t *result; - psEccNewKey(NULL, &result, curve); - psEccInitKey(NULL, result, curve); - - pstm_init_for_read_unsigned_bin(NULL, &result->pubkey.x, curve->size); - pstm_init_for_read_unsigned_bin(NULL, &result->pubkey.y, curve->size); - pstm_init_for_read_unsigned_bin(NULL, &result->pubkey.z, curve->size); - jbyte *pubkey_data = (*env)->GetByteArrayElements(env, pubkey, NULL); - pstm_read_unsigned_bin(&result->pubkey.x, (unsigned char *) (pubkey_data + 1), curve->size); - pstm_read_unsigned_bin(&result->pubkey.y, (unsigned char *) (pubkey_data + 1 + curve->size), curve->size); - (*env)->ReleaseByteArrayElements(env, pubkey, pubkey_data, JNI_ABORT); - pstm_set(&result->pubkey.z, 1); - result->type = PS_PUBKEY; - - return result; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Matrixssl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject this, jbyteArray pubkey, jbyteArray privkey, jobject params) { - psEccCurve_t *curve = create_curve(env, params); - - psEccKey_t *priv = bytearray_to_privkey(env, privkey, curve); - psEccKey_t *pub = bytearray_to_pubkey(env, pubkey, curve); - - jbyteArray result = (*env)->NewByteArray(env, curve->size); - jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL); - psSize_t outlen = curve->size; - - native_timing_start(); - int32_t err = psEccGenSharedSecret(NULL, priv, pub, (unsigned char *) result_data, &outlen, NULL); - native_timing_stop(); - (*env)->ReleaseByteArrayElements(env, result, result_data, 0); - - psEccDeleteKey(&priv); - psEccDeleteKey(&pub); - free_curve(curve); - - if (err < 0) { - throw_new(env, "java/security/GeneralSecurityException", "Couldn't derive secret."); - return NULL; - } - - return result; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Matrixssl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2(JNIEnv *env, jobject this, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm) { - throw_new(env, "java/lang/UnsupportedOperationException", "Not supported."); - return NULL; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Matrixssl_sign(JNIEnv *env, jobject this, jbyteArray data, jbyteArray privkey, jobject params) { - psEccCurve_t *curve = create_curve(env, params); - - psEccKey_t *priv = bytearray_to_privkey(env, privkey, curve); - - psSize_t siglen = 512; - uint8_t sig[siglen]; - - jint data_len = (*env)->GetArrayLength(env, data); - jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL); - native_timing_start(); - int32_t err = psEccDsaSign(NULL, priv, (unsigned char *) data_data, data_len, sig, &siglen, 0, NULL); - native_timing_stop(); - - psEccDeleteKey(&priv); - free_curve(curve); - - if (err < 0) { - throw_new(env, "java/security/GeneralSecurityException", "Couldn't sign data."); - return NULL; - } - - jbyteArray result = (*env)->NewByteArray(env, siglen); - jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL); - memcpy(result_data, sig, siglen); - (*env)->ReleaseByteArrayElements(env, result, result_data, 0); - - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Matrixssl_verify(JNIEnv *env, jobject this, jbyteArray signature, jbyteArray data, jbyteArray pubkey, jobject params) { - psEccCurve_t *curve = create_curve(env, params); - psEccKey_t *pub = bytearray_to_pubkey(env, pubkey, curve); - - jint data_len = (*env)->GetArrayLength(env, data); - jint sig_len = (*env)->GetArrayLength(env, signature); - jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL); - jbyte *sig_data = (*env)->GetByteArrayElements(env, signature, NULL); - - int32_t result; - native_timing_start(); - int32_t err = psEccDsaVerify(NULL, pub, (unsigned char *) data_data, data_len, (unsigned char *) sig_data, sig_len, &result, NULL); - native_timing_stop(); - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - (*env)->ReleaseByteArrayElements(env, signature, sig_data, JNI_ABORT); - - free_curve(curve); - psEccDeleteKey(&pub); - - if (err < 0) { - throw_new(env, "java/security/GeneralSecurityException", "Couldn't verify signature."); - return JNI_FALSE; - } - - return result < 0 ? JNI_FALSE : JNI_TRUE; -}
\ No newline at end of file diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/mbedtls.c b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/mbedtls.c deleted file mode 100644 index 2cff6ff..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/mbedtls.c +++ /dev/null @@ -1,544 +0,0 @@ -#include "native.h" -#include <string.h> - -#include <mbedtls/ecdsa.h> -#include <mbedtls/ecdh.h> -#include <mbedtls/ecp.h> -#include <mbedtls/version.h> -#include <mbedtls/entropy.h> -#include <mbedtls/ctr_drbg.h> -#include <stdio.h> - -#include "c_utils.h" -#include "c_timing.h" - -static mbedtls_ctr_drbg_context ctr_drbg; -static mbedtls_entropy_context entropy; -static jclass provider_class; - - -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"); - provider_class = (*env)->NewGlobalRef(env, local_provider_class); - - jmethodID init = (*env)->GetMethodID(env, local_provider_class, "<init>", "(Ljava/lang/String;DLjava/lang/String;)V"); - - jstring name = (*env)->NewStringUTF(env, MBEDTLS_VERSION_STRING_FULL); - double version = MBEDTLS_VERSION_MAJOR + (MBEDTLS_VERSION_MINOR/10) + (MBEDTLS_VERSION_PATCH/100); - - return (*env)->NewObject(env, provider_class, init, name, version, name); -} - -static int dev_urandom(void *data, unsigned char *output, size_t len, size_t *olen) { - FILE *file; - size_t ret, left = len; - unsigned char *p = output; - ((void) data); - - *olen = 0; - - file = fopen( "/dev/urandom", "rb" ); - if (file == NULL) { - return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; - } - - while (left > 0) { - ret = fread(p, 1, left, file); - if (ret == 0 && ferror(file)) { - fclose(file); - return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; - } - - p += ret; - left -= ret; - } - fclose(file); - *olen = len; - - return 0; -} - -static int ctr_drbg_wrapper(void *ctx, unsigned char *buf, size_t len) { - native_timing_pause(); - int result = mbedtls_ctr_drbg_random(ctx, buf, len); - native_timing_restart(); - return result; -} - -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024MbedTLS_setup(JNIEnv *env, jobject this) { - INIT_PROVIDER(env, provider_class); - - ADD_KPG(env, this, "EC", "MbedTLS"); - ADD_KA(env, this, "ECDH", "MbedTLSECDH"); - ADD_SIG(env, this, "NONEwithECDSA", "MbedTLSECDSAwithNONE"); - - mbedtls_ctr_drbg_init(&ctr_drbg); - mbedtls_entropy_init(&entropy); - mbedtls_entropy_add_source(&entropy, dev_urandom, NULL, 32, MBEDTLS_ENTROPY_SOURCE_STRONG); - mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0); - - init_classes(env, "MbedTLS"); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MbedTLSLib_getCurves(JNIEnv *env, jobject this) { - jclass hash_set_class = (*env)->FindClass(env, "java/util/TreeSet"); - - jmethodID hash_set_ctr = (*env)->GetMethodID(env, hash_set_class, "<init>", "()V"); - jmethodID hash_set_add = (*env)->GetMethodID(env, hash_set_class, "add", "(Ljava/lang/Object;)Z"); - - 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_info++) { - - jstring curve_name = (*env)->NewStringUTF(env, curve_info->name); - (*env)->CallBooleanMethod(env, result, hash_set_add, curve_name); - } - return result; -} - -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_info++) { - if (keysize == curve_info->bit_size) { - return JNI_TRUE; - } - } - return JNI_FALSE; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024MbedTLS_paramsSupported(JNIEnv *env, jobject this, jobject params) { - if (params == NULL) { - return JNI_FALSE; - } - - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject curve = (*env)->CallObjectMethod(env, params, get_curve); - - jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = (*env)->CallObjectMethod(env, curve, get_field); - if ((*env)->IsInstanceOf(env, field, f2m_field_class)) { - return JNI_FALSE; - } - return JNI_TRUE; - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - 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_info++) { - if (strcasecmp(utf_name, curve_info->name) == 0) { - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return JNI_TRUE; - } - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return JNI_FALSE; - } else { - return JNI_FALSE; - } -} - -const char *err_to_string(int error) { - switch (error) { - case MBEDTLS_ERR_ECP_BAD_INPUT_DATA: - return "Bad input parameters to function."; - case MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL: - return "The buffer is too small to write to."; - case MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE: - return "The requested feature is not available, for example, the requested curve is not supported."; - case MBEDTLS_ERR_ECP_VERIFY_FAILED: - return "The signature is not valid."; - case MBEDTLS_ERR_ECP_ALLOC_FAILED: - return "Memory allocation failed."; - case MBEDTLS_ERR_ECP_RANDOM_FAILED: - return "Generation of random value, such as ephemeral key, failed."; - case MBEDTLS_ERR_ECP_INVALID_KEY: - return "Invalid private or public key."; - case MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH: - return "The buffer contains a valid signature followed by more data."; - case MBEDTLS_ERR_MPI_FILE_IO_ERROR: - return "An error occurred while reading from or writing to a file."; - case MBEDTLS_ERR_MPI_BAD_INPUT_DATA: - return "Bad input parameters to function."; - case MBEDTLS_ERR_MPI_INVALID_CHARACTER: - return "There is an invalid character in the digit string."; - case MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL: - return "The buffer is too small to write to."; - case MBEDTLS_ERR_MPI_NEGATIVE_VALUE: - return "The input arguments are negative or result in illegal output."; - case MBEDTLS_ERR_MPI_DIVISION_BY_ZERO: - return "The input argument for division is zero, which is not allowed."; - case MBEDTLS_ERR_MPI_NOT_ACCEPTABLE: - return "The input arguments are not acceptable."; - case MBEDTLS_ERR_MPI_ALLOC_FAILED: - return "Memory allocation failed."; - default: - return "UNKNOWN."; - } -} - -static jobject biginteger_from_mpi(JNIEnv *env, const mbedtls_mpi *mpi) { - jmethodID biginteger_init = (*env)->GetMethodID(env, biginteger_class, "<init>", "(I[B)V"); - size_t size = mbedtls_mpi_size(mpi); - jbyteArray bytes = (*env)->NewByteArray(env, size); - jbyte *data = (*env)->GetByteArrayElements(env, bytes, NULL); - mbedtls_mpi_write_binary(mpi, (unsigned char *) data, size); - (*env)->ReleaseByteArrayElements(env, bytes, data, 0); - jobject result = (*env)->NewObject(env, biginteger_class, biginteger_init, 1, bytes); - return result; -} - -static void mpi_from_biginteger(JNIEnv* env, jobject biginteger, mbedtls_mpi *mpi) { - jmethodID to_byte_array = (*env)->GetMethodID(env, biginteger_class, "toByteArray", "()[B"); - - jbyteArray byte_array = (jbyteArray) (*env)->CallObjectMethod(env, biginteger, to_byte_array); - jsize byte_length = (*env)->GetArrayLength(env, byte_array); - jbyte *byte_data = (*env)->GetByteArrayElements(env, byte_array, NULL); - mbedtls_mpi_read_binary(mpi, (unsigned char *) byte_data, byte_length); - (*env)->ReleaseByteArrayElements(env, byte_array, byte_data, JNI_ABORT); -} - -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"); - jobject field = (*env)->NewObject(env, fp_field_class, fp_field_init, p); - - jobject a; - if (group->A.p == NULL) { - jmethodID biginteger_subtract = (*env)->GetMethodID(env, biginteger_class, "subtract", "(Ljava/math/BigInteger;)Ljava/math/BigInteger;"); - jmethodID biginteger_valueof = (*env)->GetStaticMethodID(env, biginteger_class, "valueOf", "(J)Ljava/math/BigInteger;"); - jobject three = (*env)->CallStaticObjectMethod(env, biginteger_class, biginteger_valueof, (jlong) 3); - a = (*env)->CallObjectMethod(env, p, biginteger_subtract, three); - } else { - a = biginteger_from_mpi(env, &group->A); - } - jobject b = biginteger_from_mpi(env, &group->B); - - jmethodID elliptic_curve_init = (*env)->GetMethodID(env, elliptic_curve_class, "<init>", "(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject elliptic_curve = (*env)->NewObject(env, elliptic_curve_class, elliptic_curve_init, field, a, b); - - jobject gx = biginteger_from_mpi(env, &group->G.X); - jobject gy = biginteger_from_mpi(env, &group->G.Y); - jmethodID point_init = (*env)->GetMethodID(env, point_class, "<init>", "(Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject g = (*env)->NewObject(env, point_class, point_init, gx, gy); - - jobject n = biginteger_from_mpi(env, &group->N); - jint h = 1; - - jmethodID ec_parameter_spec_init = (*env)->GetMethodID(env, ec_parameter_spec_class, "<init>", "(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V"); - return (*env)->NewObject(env, ec_parameter_spec_class, ec_parameter_spec_init, elliptic_curve, g, n, h); -} - -static void create_curve(JNIEnv *env, jobject params, mbedtls_ecp_group *group) { - mbedtls_ecp_group_init(group); - group->id = 0; - - jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject curve = (*env)->CallObjectMethod(env, params, get_curve); - - jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = (*env)->CallObjectMethod(env, curve, get_field); - - jmethodID get_p = (*env)->GetMethodID(env, fp_field_class, "getP", "()Ljava/math/BigInteger;"); - jobject p = (*env)->CallObjectMethod(env, field, get_p); - mpi_from_biginteger(env, p, &group->P); - - jmethodID get_a = (*env)->GetMethodID(env, elliptic_curve_class, "getA", "()Ljava/math/BigInteger;"); - jobject a = (*env)->CallObjectMethod(env, curve, get_a); - mpi_from_biginteger(env, a, &group->A); - - jmethodID get_b = (*env)->GetMethodID(env, elliptic_curve_class, "getB", "()Ljava/math/BigInteger;"); - jobject b = (*env)->CallObjectMethod(env, curve, get_b); - mpi_from_biginteger(env, b, &group->B); - - jmethodID get_g = (*env)->GetMethodID(env, ec_parameter_spec_class, "getGenerator", "()Ljava/security/spec/ECPoint;"); - jobject g = (*env)->CallObjectMethod(env, params, get_g); - - jmethodID get_x = (*env)->GetMethodID(env, point_class, "getAffineX", "()Ljava/math/BigInteger;"); - jobject gx = (*env)->CallObjectMethod(env, g, get_x); - mpi_from_biginteger(env, gx, &group->G.X); - - jmethodID get_y = (*env)->GetMethodID(env, point_class, "getAffineY", "()Ljava/math/BigInteger;"); - jobject gy = (*env)->CallObjectMethod(env, g, get_y); - mpi_from_biginteger(env, gy, &group->G.Y); - - mbedtls_mpi_lset(&group->G.Z, 1); - - jmethodID get_n = (*env)->GetMethodID(env, ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;"); - jobject n = (*env)->CallObjectMethod(env, params, get_n); - mpi_from_biginteger(env, n, &group->N); - group->pbits = group->nbits = mbedtls_mpi_bitlen(&group->P); - group->h = 0; -} - -static jobject generate_from_curve(JNIEnv *env, mbedtls_ecp_group *group) { - mbedtls_mpi d; - mbedtls_mpi_init(&d); - - mbedtls_ecp_point Q; - mbedtls_ecp_point_init(&Q); - - if (ctr_drbg.reseed_counter >= ctr_drbg.reseed_interval) { - // Reseed manually, outside of the timing window, to not disturb the timing data. - // They are somewhat disturbed anyway, but we cannot really get rid of that easily. - // We also help it by using a wrapper and pausing for random gen. - mbedtls_ctr_drbg_reseed(&ctr_drbg, NULL, 0); - } - - native_timing_start(); - int error = mbedtls_ecp_gen_keypair(group, &d, &Q, ctr_drbg_wrapper, &ctr_drbg); - native_timing_stop(); - - if (error) { - throw_new(env, "java/security/GeneralSecurityException", err_to_string(error)); - mbedtls_mpi_free(&d); - mbedtls_ecp_point_free(&Q); - return NULL; - } - - jint keysize = (jint) mbedtls_mpi_bitlen(&group->N); - unsigned long key_bytes = (keysize + 7) / 8; - jbyteArray priv_bytes = (*env)->NewByteArray(env, key_bytes); - jbyte *key_priv = (*env)->GetByteArrayElements(env, priv_bytes, NULL); - mbedtls_mpi_write_binary(&d, (unsigned char *) key_priv, key_bytes); - (*env)->ReleaseByteArrayElements(env, priv_bytes, key_priv, 0); - - unsigned long key_len = 2*key_bytes + 1; - jbyteArray pub_bytes = (*env)->NewByteArray(env, key_len); - jbyte *key_pub = (*env)->GetByteArrayElements(env, pub_bytes, NULL); - size_t out_key_len = 0; - mbedtls_ecp_point_write_binary(group, &Q, MBEDTLS_ECP_PF_UNCOMPRESSED, &out_key_len, (unsigned char *) key_pub, key_len); - (*env)->ReleaseByteArrayElements(env, pub_bytes, key_pub, 0); - - jobject ec_param_spec = create_ec_param_spec(env, group); - - mbedtls_mpi_free(&d); - mbedtls_ecp_point_free(&Q); - - jobject ec_pub_param_spec = (*env)->NewLocalRef(env, ec_param_spec); - jmethodID ec_pub_init = (*env)->GetMethodID(env, pubkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject pubkey = (*env)->NewObject(env, pubkey_class, ec_pub_init, pub_bytes, ec_pub_param_spec); - - jobject ec_priv_param_spec = (*env)->NewLocalRef(env, ec_param_spec); - jmethodID ec_priv_init = (*env)->GetMethodID(env, privkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject privkey = (*env)->NewObject(env, privkey_class, ec_priv_init, priv_bytes, ec_priv_param_spec); - - jmethodID keypair_init = (*env)->GetMethodID(env, keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V"); - return (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey); -} - -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); - jobject result = generate_from_curve(env, &group); - mbedtls_ecp_group_free(&group); - return result; -} - -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_info++) { - if (keysize == curve_info->bit_size) { - curve = curve_info; - break; - } - } - - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve for given bitsize not found."); - return NULL; - } - - return generate_from_curve_info(env, curve); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024MbedTLS_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(JNIEnv *env, jobject this, jobject params, jobject random) { - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - mbedtls_ecp_group curve; - create_curve(env, params, &curve); - jobject result = generate_from_curve(env, &curve); - mbedtls_ecp_group_free(&curve); - return result; - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - 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_info++) { - if (strcasecmp(utf_name, curve_info->name) == 0) { - (*env)->ReleaseStringUTFChars(env, name, utf_name); - curve = curve_info; - break; - } - } - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve for given bitsize not found."); - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return NULL; - } - return generate_from_curve_info(env, curve); - } else { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found."); - return NULL; - } -} - -static void create_pubkey(JNIEnv *env, jbyteArray pubkey, mbedtls_ecp_group *curve, mbedtls_ecp_point *pub) { - mbedtls_ecp_point_init(pub); - jsize pub_size = (*env)->GetArrayLength(env, pubkey); - jbyte *key_pub = (*env)->GetByteArrayElements(env, pubkey, NULL); - mbedtls_ecp_point_read_binary(curve, pub, (unsigned char *) key_pub, pub_size); - (*env)->ReleaseByteArrayElements(env, pubkey, key_pub, JNI_ABORT); -} - -static void create_privkey(JNIEnv *env, jbyteArray privkey, mbedtls_mpi *priv) { - mbedtls_mpi_init(priv); - jsize priv_size = (*env)->GetArrayLength(env, privkey); - jbyte *key_priv = (*env)->GetByteArrayElements(env, privkey, NULL); - mbedtls_mpi_read_binary(priv, (unsigned char *) key_priv, priv_size); - (*env)->ReleaseByteArrayElements(env, privkey, key_priv, JNI_ABORT); -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024MbedTLS_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject this, jbyteArray pubkey, jbyteArray privkey, jobject params) { - mbedtls_ecp_group curve; - create_curve(env, params, &curve); - - mbedtls_ecp_point pub; - create_pubkey(env, pubkey, &curve, &pub); - - mbedtls_mpi priv; - create_privkey(env, privkey, &priv); - - mbedtls_mpi result; - mbedtls_mpi_init(&result); - - native_timing_start(); - int error = mbedtls_ecdh_compute_shared(&curve, &result, &pub, &priv, ctr_drbg_wrapper, &ctr_drbg); - native_timing_stop(); - - if (error) { - throw_new(env, "java/security/GeneralSecurityException", err_to_string(error)); - mbedtls_mpi_free(&result); - mbedtls_mpi_free(&priv); - mbedtls_ecp_point_free(&pub); - mbedtls_ecp_group_free(&curve); - return NULL; - } - - jint keysize = (jint) mbedtls_mpi_bitlen(&curve.N); - unsigned long key_bytes = (keysize + 7) / 8; - jbyteArray result_bytes = (*env)->NewByteArray(env, key_bytes); - jbyte *result_data = (*env)->GetByteArrayElements(env, result_bytes, NULL); - mbedtls_mpi_write_binary(&result, (unsigned char *) result_data, key_bytes); - (*env)->ReleaseByteArrayElements(env, result_bytes, result_data, 0); - - mbedtls_mpi_free(&result); - mbedtls_mpi_free(&priv); - mbedtls_ecp_point_free(&pub); - mbedtls_ecp_group_free(&curve); - - return result_bytes; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024MbedTLS_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2(JNIEnv *env, jobject this, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algo) { - throw_new(env, "java/lang/UnsupportedOperationException", "Not supported."); - return NULL; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024MbedTLS_sign(JNIEnv *env, jobject this, jbyteArray data, jbyteArray privkey, jobject params) { - mbedtls_ecp_group curve; - create_curve(env, params, &curve); - - mbedtls_mpi priv; - create_privkey(env, privkey, &priv); - - mbedtls_mpi r; - mbedtls_mpi_init(&r); - mbedtls_mpi s; - mbedtls_mpi_init(&s); - - jsize data_size = (*env)->GetArrayLength(env, data); - jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL); - - native_timing_start(); - int error = mbedtls_ecdsa_sign(&curve, &r, &s, &priv, (unsigned char *) data_data, data_size, ctr_drbg_wrapper, &ctr_drbg); - native_timing_stop(); - - mbedtls_mpi_free(&priv); - mbedtls_ecp_group_free(&curve); - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - if (error) { - throw_new(env, "java/security/GeneralSecurityException", err_to_string(error)); - mbedtls_mpi_free(&r); - mbedtls_mpi_free(&s); - return NULL; - } - - jsize rlen = (mbedtls_mpi_bitlen(&r) + 7) / 8; - jbyte r_bytes[rlen]; - mbedtls_mpi_write_binary(&r, (unsigned char *) r_bytes, rlen); - jsize slen = (mbedtls_mpi_bitlen(&s) + 7) / 8; - jbyte s_bytes[slen]; - mbedtls_mpi_write_binary(&s, (unsigned char *) s_bytes, slen); - - mbedtls_mpi_free(&r); - mbedtls_mpi_free(&s); - return asn1_der_encode(env, r_bytes, rlen, s_bytes, slen); -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024MbedTLS_verify(JNIEnv *env, jobject this, jbyteArray signature, jbyteArray data, jbyteArray pubkey, jobject params) { - mbedtls_ecp_group curve; - create_curve(env, params, &curve); - - mbedtls_ecp_point pub; - create_pubkey(env, pubkey, &curve, &pub); - jbyte *r_bytes; - size_t rlen; - jbyte *s_bytes; - size_t slen; - bool decode = asn1_der_decode(env, signature, &r_bytes, &rlen, &s_bytes, &slen); - if (!decode) { - throw_new(env, "java/security/GeneralSecurityException", "Error decoding sig."); - mbedtls_ecp_point_free(&pub); - mbedtls_ecp_group_free(&curve); - return JNI_FALSE; - } - - mbedtls_mpi r; - mbedtls_mpi_init(&r); - mbedtls_mpi_read_binary(&r, (unsigned char *) r_bytes, rlen); - mbedtls_mpi s; - mbedtls_mpi_init(&s); - mbedtls_mpi_read_binary(&s, (unsigned char *) s_bytes, slen); - free(r_bytes); - free(s_bytes); - - jsize data_size = (*env)->GetArrayLength(env, data); - jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL); - - native_timing_start(); - int error = mbedtls_ecdsa_verify(&curve, (unsigned char *) data_data, data_size, &pub, &r, &s); - native_timing_stop(); - - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - if (error) { - if (error != MBEDTLS_ERR_ECP_VERIFY_FAILED) { - throw_new(env, "java/security/GeneralSecurityException", err_to_string(error)); - } - mbedtls_ecp_point_free(&pub); - mbedtls_ecp_group_free(&curve); - return JNI_FALSE; - } - - return JNI_TRUE; -}
\ No newline at end of file diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/mscng.c b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/mscng.c deleted file mode 100644 index bb27887..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/mscng.c +++ /dev/null @@ -1,1273 +0,0 @@ -#include <windows.h> -#include <bcrypt.h> -#include "native.h" - -#include "c_timing.h" -#include "c_utils.h" - -// BCRYPT and NT things. -#define NT_SUCCESS(status) (((NTSTATUS)(status)) >= 0) -#define NT_FAILURE(status) !NT_SUCCESS(status) - -#define STATUS_SUCCESS 0x00000000 -#define STATUS_INVALID_SIGNATURE 0xC000A000 - -typedef struct { - ULONG dwVersion; // Version of the structure - ECC_CURVE_TYPE_ENUM dwCurveType; // Supported curve types. - ECC_CURVE_ALG_ID_ENUM dwCurveGenerationAlgId; // For X.592 verification purposes, if we include Seed we will need to include the algorithm ID. - ULONG cbFieldLength; // Byte length of the fields P, A, B, X, Y. - ULONG cbSubgroupOrder; // Byte length of the subgroup. - ULONG cbCofactor; // Byte length of cofactor of G in E. - ULONG cbSeed; // Byte length of the seed used to generate the curve. -} BCRYPT_ECC_PARAMETER_HEADER; - -// Provider things -static jclass provider_class; - -#define KEYFLAG_IMPLICIT 0 // Mscng native key, over named curve -#define KEYFLAG_EXPLICIT 1 // Mscng native key, over explicit ecc parameters -#define KEYFLAG_NIST 2 // Mscng native key, over NIST parameters, custom ECDH/ECDSA_P* algo -#define KEYFLAG_OTHER 3 // Other key, explicit ecc parameters - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MscngLib_createProvider(JNIEnv *env, jobject self) { - jclass local_provider_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeProvider$Mscng"); - provider_class = (*env)->NewGlobalRef(env, local_provider_class); - - jmethodID init = (*env)->GetMethodID(env, local_provider_class, "<init>", "(Ljava/lang/String;DLjava/lang/String;)V"); - - jstring name = (*env)->NewStringUTF(env, "Microsoft CNG"); - double version = 1.0; - - return (*env)->NewObject(env, provider_class, init, name, version, name); -} - -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Mscng_setup(JNIEnv *env, jobject self) { - INIT_PROVIDER(env, provider_class); - - ADD_KPG(env, self, "ECDH", "MscngECDH"); - ADD_KPG(env, self, "ECDSA", "MscngECDSA"); - - ADD_KA(env, self, "ECDHwithSHA1KDF(CNG)", "MscngECDHwithSHA1KDF"); - ADD_KA(env, self, "ECDHwithSHA256KDF(CNG)", "MscngECDHwithSHA256KDF"); - ADD_KA(env, self, "ECDHwithSHA384KDF(CNG)", "MscngECDHwithSHA384KDF"); - ADD_KA(env, self, "ECDHwithSHA512KDF(CNG)", "MscngECDHwithSHA512KDF"); - - ADD_SIG(env, self, "SHA1withECDSA", "MscngECDSAwithSHA1"); - ADD_SIG(env, self, "SHA256withECDSA", "MscngECDSAwithSHA256"); - ADD_SIG(env, self, "SHA384withECDSA", "MscngECDSAwithSHA384"); - ADD_SIG(env, self, "SHA512withECDSA", "MscngECDSAwithSHA112"); - - init_classes(env, "Mscng"); -} - -typedef struct { - LPCSTR name; - ULONG bits; -} named_curve_t; - -static named_curve_t named_curves[] = { - {"curve25519", 256}, {"brainpoolP160r1", 160}, {"brainpoolP160t1", 160}, {"brainpoolP192r1", 192}, {"brainpoolP192t1", 192}, - {"brainpoolP224r1", 224}, {"brainpoolP224t1", 224}, {"brainpoolP256r1", 256}, {"brainpoolP256t1", 256}, {"brainpoolP320r1", 320}, - {"brainpoolP320t1", 320}, {"brainpoolP384r1", 384}, {"brainpoolP384t1", 384}, {"brainpoolP512r1", 512}, {"brainpoolP512t1", 512}, - {"ec192wapi", 192}, {"nistP192", 192}, {"nistP224", 224}, {"nistP256", 256}, {"nistP384", 384}, - {"nistP521", 521}, {"numsP256t1", 256}, {"numsP384t1", 384}, {"numsP512t1", 512}, {"secP160k1", 160}, - {"secP160r1", 160}, {"secP160r2", 160}, {"secP192k1", 192}, {"secP192r1", 192}, {"secP224k1", 224}, - {"secP224r1", 224}, {"secP256k1", 256}, {"secP256r1", 256}, {"secP384r1", 384}, {"secP521r1", 521}, - {"wtls12", 224}, {"wtls7", 160}, {"wtls9", 160}, {"x962P192v1", 192}, {"x962P192v2", 192}, - {"x962P192v3", 192}, {"x962P239v1", 239}, {"x962P239v2", 239}, {"x962P239v3", 239}, {"x962P256v1", 256}}; - -static const named_curve_t *lookup_curve(const char *name) { - for (size_t i = 0; i < sizeof(named_curves) / sizeof(named_curve_t); ++i) { - if (strcmp(name, named_curves[i].name) == 0) { - return &named_curves[i]; - } - } - return NULL; -} - -static ULONG utf_16to8(NPSTR *out_buf, LPCWSTR in_str) { - INT result = WideCharToMultiByte(CP_UTF8, 0, in_str, -1, NULL, 0, NULL, NULL); - *out_buf = calloc(result, 1); - return WideCharToMultiByte(CP_UTF8, 0, in_str, -1, *out_buf, result, NULL, NULL); -} - -static ULONG utf_8to16(NWPSTR *out_buf, LPCSTR in_str) { - INT result = MultiByteToWideChar(CP_UTF8, 0, in_str, -1, NULL, 0); - *out_buf = calloc(result * sizeof(WCHAR), 1); - return MultiByteToWideChar(CP_UTF8, 0, in_str, -1, *out_buf, result); -} - -/** - * Convert Java String to UTF-16 NWPSTR null-terminated. - * Returns: Length of NWPSTR in bytes! - */ -static ULONG utf_strto16(NWPSTR *out_buf, JNIEnv *env, jobject str) { - jsize len = (*env)->GetStringLength(env, str); - *out_buf = calloc(len * sizeof(jchar) + 1, 1); - const jchar *chars = (*env)->GetStringChars(env, str, NULL); - memcpy(*out_buf, chars, len * sizeof(jchar)); - (*env)->ReleaseStringChars(env, str, chars); - return len * sizeof(jchar); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MscngLib_getCurves(JNIEnv *env, jobject self) { - jclass hash_set_class = (*env)->FindClass(env, "java/util/TreeSet"); - - jmethodID hash_set_ctr = (*env)->GetMethodID(env, hash_set_class, "<init>", "()V"); - jmethodID hash_set_add = (*env)->GetMethodID(env, hash_set_class, "add", "(Ljava/lang/Object;)Z"); - - jobject result = (*env)->NewObject(env, hash_set_class, hash_set_ctr); - - NTSTATUS status; - BCRYPT_ALG_HANDLE handle; - - if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(&handle, BCRYPT_ECDH_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0))) { - wprintf(L"**** Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status); - return result; - } - - ULONG bufSize; - if (NT_FAILURE(status = BCryptGetProperty(handle, BCRYPT_ECC_CURVE_NAME_LIST, NULL, 0, &bufSize, 0))) { - wprintf(L"**** Error 0x%x returned by BCryptGetProperty(length only)\n", status); - BCryptCloseAlgorithmProvider(handle, 0); - return result; - } - - BCRYPT_ECC_CURVE_NAMES *curves = (BCRYPT_ECC_CURVE_NAMES *)calloc(bufSize, 1); - if (NT_FAILURE(status = BCryptGetProperty(handle, BCRYPT_ECC_CURVE_NAME_LIST, (PBYTE)curves, bufSize, &bufSize, 0))) { - wprintf(L"**** Error 0x%x returned by BCryptGetProperty(whole)\n", status); - BCryptCloseAlgorithmProvider(handle, 0); - free(curves); - return result; - } - - for (size_t i = 0; i < curves->dwEccCurveNames; ++i) { - NPSTR curve_name; - ULONG len = utf_16to8(&curve_name, curves->pEccCurveNames[i]); - jstring c_name = (*env)->NewStringUTF(env, curve_name); - (*env)->CallBooleanMethod(env, result, hash_set_add, c_name); - free(curve_name); - } - - free(curves); - - BCryptCloseAlgorithmProvider(handle, 0); - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Mscng_keysizeSupported(JNIEnv *env, - jobject self, - jint keysize) { - switch (keysize) { - case 256: - case 384: - case 521: - return JNI_TRUE; - default: - return JNI_FALSE; - } -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Mscng_paramsSupported(JNIEnv *env, - jobject self, - jobject params) { - if (params == NULL) { - return JNI_FALSE; - } - - if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char *utf_name = (*env)->GetStringUTFChars(env, name, NULL); - const named_curve_t *curve = lookup_curve(utf_name); - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return curve == NULL ? JNI_FALSE : JNI_TRUE; - } else if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject curve = (*env)->CallObjectMethod(env, params, get_curve); - - jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = (*env)->CallObjectMethod(env, curve, get_field); - - if ((*env)->IsInstanceOf(env, field, fp_field_class)) { - return JNI_TRUE; - } else { - return JNI_FALSE; - } - } else { - return JNI_FALSE; - } -} - -static jobject bytes_to_biginteger(JNIEnv *env, PBYTE bytes, int len) { - jmethodID biginteger_init = (*env)->GetMethodID(env, biginteger_class, "<init>", "(I[B)V"); - jbyteArray byte_array = (*env)->NewByteArray(env, len); - jbyte *data = (*env)->GetByteArrayElements(env, byte_array, NULL); - memcpy(data, bytes, len); - (*env)->ReleaseByteArrayElements(env, byte_array, data, 0); - jobject result = (*env)->NewObject(env, biginteger_class, biginteger_init, 1, byte_array); - return result; -} - -static void biginteger_to_bytes(JNIEnv *env, jobject bigint, PBYTE bytes, ULONG len) { - jmethodID to_byte_array = (*env)->GetMethodID(env, biginteger_class, "toByteArray", "()[B"); - - jbyteArray byte_array = (jbyteArray)(*env)->CallObjectMethod(env, bigint, to_byte_array); - jsize byte_length = (*env)->GetArrayLength(env, byte_array); - jbyte *byte_data = (*env)->GetByteArrayElements(env, byte_array, NULL); - memcpy(bytes, &byte_data[byte_length - len], len); - (*env)->ReleaseByteArrayElements(env, byte_array, byte_data, JNI_ABORT); -} - -static jobject create_ec_param_spec(JNIEnv *env, PBYTE eccParams, PULONG paramLength) { - // - // BCRYPT_ECCFULLKEY_BLOB header - // P[cbFieldLength] Prime specifying the base field. - // A[cbFieldLength] Coefficient A of the equation y^2 = x^3 + A*x + B mod p - // B[cbFieldLength] Coefficient B of the equation y^2 = x^3 + A*x + B mod p - // Gx[cbFieldLength] X-coordinate of the base point. - // Gy[cbFieldLength] Y-coordinate of the base point. - // n[cbSubgroupOrder] Order of the group generated by G = (x,y) - // h[cbCofactor] Cofactor of G in E. - // S[cbSeed] Seed of the curve. - - BCRYPT_ECCFULLKEY_BLOB *header = (BCRYPT_ECCFULLKEY_BLOB *)eccParams; - PBYTE paramsStart = &eccParams[sizeof(BCRYPT_ECCFULLKEY_BLOB)]; - - // cbFieldLength - PBYTE P = paramsStart; - PBYTE A = P + header->cbFieldLength; - PBYTE B = A + header->cbFieldLength; - PBYTE GX = B + header->cbFieldLength; - PBYTE GY = GX + header->cbFieldLength; - - // cbSubgroupOrder - PBYTE N = GY + header->cbFieldLength; - - // cbCofactor - PBYTE H = N + header->cbSubgroupOrder; - - // cbSeed - PBYTE S = H + header->cbCofactor; - - *paramLength = - sizeof(BCRYPT_ECCFULLKEY_BLOB) + 5 * header->cbFieldLength + header->cbSubgroupOrder + header->cbCofactor + header->cbSeed; - - jobject p_int = bytes_to_biginteger(env, P, header->cbFieldLength); - - jmethodID fp_field_init = (*env)->GetMethodID(env, fp_field_class, "<init>", "(Ljava/math/BigInteger;)V"); - jobject field = (*env)->NewObject(env, fp_field_class, fp_field_init, p_int); - - jobject a_int = bytes_to_biginteger(env, A, header->cbFieldLength); - jobject b_int = bytes_to_biginteger(env, B, header->cbFieldLength); - - jmethodID elliptic_curve_init = (*env)->GetMethodID(env, elliptic_curve_class, "<init>", - "(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject elliptic_curve = (*env)->NewObject(env, elliptic_curve_class, elliptic_curve_init, field, a_int, b_int); - - jobject gx_int = bytes_to_biginteger(env, GX, header->cbFieldLength); - jobject gy_int = bytes_to_biginteger(env, GY, header->cbFieldLength); - - jmethodID point_init = (*env)->GetMethodID(env, point_class, "<init>", "(Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject g = (*env)->NewObject(env, point_class, point_init, gx_int, gy_int); - - jobject n_int = bytes_to_biginteger(env, N, header->cbSubgroupOrder); - - jobject h_int = bytes_to_biginteger(env, H, header->cbCofactor); - jmethodID bigint_to_int = (*env)->GetMethodID(env, biginteger_class, "intValue", "()I"); - jint cof = (*env)->CallIntMethod(env, h_int, bigint_to_int); - - jmethodID ec_parameter_spec_init = (*env)->GetMethodID( - env, ec_parameter_spec_class, "<init>", "(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V"); - return (*env)->NewObject(env, ec_parameter_spec_class, ec_parameter_spec_init, elliptic_curve, g, n_int, cof); -} - -static ULONG create_curve(JNIEnv *env, jobject params, PBYTE *curve) { - jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject elliptic_curve = (*env)->CallObjectMethod(env, params, get_curve); - - jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field); - - jmethodID get_bits = (*env)->GetMethodID(env, fp_field_class, "getFieldSize", "()I"); - jint bits = (*env)->CallIntMethod(env, field, get_bits); - jint bytes = (bits + 7) / 8; - - jmethodID get_a = (*env)->GetMethodID(env, elliptic_curve_class, "getA", "()Ljava/math/BigInteger;"); - jobject a = (*env)->CallObjectMethod(env, elliptic_curve, get_a); - - jmethodID get_b = (*env)->GetMethodID(env, elliptic_curve_class, "getB", "()Ljava/math/BigInteger;"); - jobject b = (*env)->CallObjectMethod(env, elliptic_curve, get_b); - - jmethodID get_p = (*env)->GetMethodID(env, fp_field_class, "getP", "()Ljava/math/BigInteger;"); - jobject p = (*env)->CallObjectMethod(env, field, get_p); - - jmethodID get_g = (*env)->GetMethodID(env, ec_parameter_spec_class, "getGenerator", "()Ljava/security/spec/ECPoint;"); - jobject g = (*env)->CallObjectMethod(env, params, get_g); - - jmethodID get_x = (*env)->GetMethodID(env, point_class, "getAffineX", "()Ljava/math/BigInteger;"); - jobject gx = (*env)->CallObjectMethod(env, g, get_x); - - jmethodID get_y = (*env)->GetMethodID(env, point_class, "getAffineY", "()Ljava/math/BigInteger;"); - jobject gy = (*env)->CallObjectMethod(env, g, get_y); - - jmethodID get_n = (*env)->GetMethodID(env, ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;"); - jobject n = (*env)->CallObjectMethod(env, params, get_n); - - jmethodID get_h = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCofactor", "()I"); - jint h = (*env)->CallIntMethod(env, params, get_h); - - jmethodID get_bitlength = (*env)->GetMethodID(env, biginteger_class, "bitLength", "()I"); - jint order_bits = (*env)->CallIntMethod(env, n, get_bitlength); - jint order_bytes = (order_bits + 7) / 8; - - // header_size + 5*bytes + order_bytes + cof_size + 0 - ULONG bufSize = sizeof(BCRYPT_ECC_PARAMETER_HEADER) + 5 * bytes + order_bytes + 1 + 0; - *curve = calloc(bufSize, 1); - BCRYPT_ECC_PARAMETER_HEADER *header = (BCRYPT_ECC_PARAMETER_HEADER *)*curve; - header->dwVersion = 1; - header->dwCurveType = 1; // 1 -> Prime short Weierstrass, 2 -> Prime Twisted Edwards, 3 -> Montgomery - header->dwCurveGenerationAlgId = 0; - header->cbFieldLength = bytes; - header->cbSubgroupOrder = order_bytes; - header->cbCofactor = 1; - header->cbSeed = 0; - - PBYTE paramsStart = &(*curve)[sizeof(BCRYPT_ECC_PARAMETER_HEADER)]; - - biginteger_to_bytes(env, p, paramsStart, bytes); - biginteger_to_bytes(env, a, paramsStart + bytes, bytes); - biginteger_to_bytes(env, b, paramsStart + 2 * bytes, bytes); - biginteger_to_bytes(env, gx, paramsStart + 3 * bytes, bytes); - biginteger_to_bytes(env, gy, paramsStart + 4 * bytes, bytes); - biginteger_to_bytes(env, n, paramsStart + 5 * bytes, order_bytes); - PBYTE cof_ptr = (PBYTE)(paramsStart + 5 * bytes + order_bytes); - *cof_ptr = (BYTE)h; - return bufSize; -} - -static ULONG init_algo(JNIEnv *env, BCRYPT_ALG_HANDLE *handle, jint *keyflag, NWPSTR *curve_name, LPCWSTR algo, jobject params) { - NTSTATUS status; - if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(handle, algo, MS_PRIMITIVE_PROVIDER, 0))) { - wprintf(L"**** Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status); - return 0; - } - ULONG result = 0; - if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - jint utf_length = (*env)->GetStringUTFLength(env, name); - PUCHAR chars = calloc(utf_length + 1, 1); - (*env)->GetStringUTFRegion(env, name, 0, utf_length, chars); - const named_curve_t *curve = lookup_curve(chars); - ULONG ret = utf_8to16(curve_name, chars); - if (NT_FAILURE(status = BCryptSetProperty(*handle, BCRYPT_ECC_CURVE_NAME, (PUCHAR)*curve_name, ret * sizeof(WCHAR), 0))) { - wprintf(L"**** Error 0x%x returned by BCryptSetProperty\n", status); - return 0; - } - free(chars); - result = curve->bits; - *keyflag = KEYFLAG_IMPLICIT; - } else if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - PBYTE curve; - ULONG curveLen = create_curve(env, params, &curve); - if (NT_FAILURE(status = BCryptSetProperty(*handle, BCRYPT_ECC_PARAMETERS, curve, curveLen, 0))) { - wprintf(L"**** Error 0x%x returned by BCryptSetProperty\n", status); - return 0; - } - free(curve); - - jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject elliptic_curve = (*env)->CallObjectMethod(env, params, get_curve); - - jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field); - - jmethodID get_bits = (*env)->GetMethodID(env, fp_field_class, "getFieldSize", "()I"); - jint bits = (*env)->CallIntMethod(env, field, get_bits); - result = bits; - *keyflag = KEYFLAG_EXPLICIT; - *curve_name = NULL; - } - return result; -} - -static jobject key_to_privkey(JNIEnv *env, BCRYPT_KEY_HANDLE key, jint flag, LPCWSTR curve) { - NTSTATUS status; - ULONG bufSize = 0; - if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCFULLPRIVATE_BLOB, NULL, 0, &bufSize, 0))) { - wprintf(L"**** Error 0x%x returned by BCryptExportKey(full, length only)\n", status); - return NULL; - } - if (bufSize == 0) { - printf("buf 0\n"); - return NULL; - } - - PBYTE fullBuf = calloc(bufSize, 1); - if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCFULLPRIVATE_BLOB, fullBuf, bufSize, &bufSize, 0))) { - wprintf(L"**** Error 0x%x returned by BCryptExportKey(full, whole)\n", status); - free(fullBuf); - return NULL; - } - - ULONG paramLength; - jobject ec_priv_param_spec = create_ec_param_spec(env, fullBuf, ¶mLength); - - // fullBuf looks like: - // BCRYPT_ECCFULLKEY_BLOB header - // P[cbFieldLength] Prime specifying the base field. - // A[cbFieldLength] Coefficient A of the equation y^2 = x^3 + A*x + B mod p - // B[cbFieldLength] Coefficient B of the equation y^2 = x^3 + A*x + B mod p - // Gx[cbFieldLength] X-coordinate of the base point. - // Gy[cbFieldLength] Y-coordinate of the base point. - // n[cbSubgroupOrder] Order of the group generated by G = (x,y) - // h[cbCofactor] Cofactor of G in E. - // S[cbSeed] Seed of the curve. - // Qx[cbFieldLength] X-coordinate of the public point. - // Qy[cbFieldLength] Y-coordinate of the public point. - // d[cbSubgroupOrder] Private key. - BCRYPT_ECCFULLKEY_BLOB *privHeader = (BCRYPT_ECCFULLKEY_BLOB *)fullBuf; - PBYTE priv_x = &fullBuf[paramLength]; - PBYTE priv_y = priv_x + privHeader->cbFieldLength; - PBYTE priv = priv_y + privHeader->cbFieldLength; - - jbyteArray meta_bytes = NULL; - jbyteArray header_bytes = NULL; - switch (flag) { - case 0: { - // meta = curve - jint meta_len = (wcslen(curve) + 1) * sizeof(WCHAR); - meta_bytes = (*env)->NewByteArray(env, meta_len); - jbyte *meta_data = (*env)->GetByteArrayElements(env, meta_bytes, NULL); - memcpy(meta_data, curve, meta_len); - (*env)->ReleaseByteArrayElements(env, meta_bytes, meta_data, 0); - } - case 1: - case 2: { - // meta = null - // header = full - header_bytes = (*env)->NewByteArray(env, paramLength); - jbyte *header_data = (*env)->GetByteArrayElements(env, header_bytes, NULL); - memcpy(header_data, fullBuf, paramLength); - (*env)->ReleaseByteArrayElements(env, header_bytes, header_data, 0); - break; - } - default: - // header = small - if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCPRIVATE_BLOB, NULL, 0, &bufSize, 0))) { - wprintf(L"**** Error 0x%x returned by BCryptExportKey(small, length only)\n", status); - free(fullBuf); - return NULL; - } - if (bufSize == 0) { - printf("buf 0\n"); - free(fullBuf); - return NULL; - } - PBYTE smallBuf = calloc(bufSize, 1); - if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCPRIVATE_BLOB, smallBuf, bufSize, &bufSize, 0))) { - wprintf(L"**** Error 0x%x returned by BCryptExportKey(small, whole)\n", status); - free(fullBuf); - free(smallBuf); - return NULL; - } - // smallBuf looks like: - // BCRYPT_ECCKEY_BLOB header - // Qx[cbFieldLength] X-coordinate of the public point. - // Qy[cbFieldLength] Y-coordinate of the public point. - // d[cbSubgroupOrder] Private key. - header_bytes = (*env)->NewByteArray(env, sizeof(BCRYPT_ECCKEY_BLOB)); - jbyte *header_data = (*env)->GetByteArrayElements(env, header_bytes, NULL); - memcpy(header_data, smallBuf, sizeof(BCRYPT_ECCKEY_BLOB)); - (*env)->ReleaseByteArrayElements(env, header_bytes, header_data, 0); - free(smallBuf); - break; - } - - jbyteArray x_bytes = (*env)->NewByteArray(env, privHeader->cbFieldLength); - jbyte *x_data = (*env)->GetByteArrayElements(env, x_bytes, NULL); - memcpy(x_data, priv_x, privHeader->cbFieldLength); - (*env)->ReleaseByteArrayElements(env, x_bytes, x_data, 0); - - jbyteArray y_bytes = (*env)->NewByteArray(env, privHeader->cbFieldLength); - jbyte *y_data = (*env)->GetByteArrayElements(env, y_bytes, NULL); - memcpy(y_data, priv_y, privHeader->cbFieldLength); - (*env)->ReleaseByteArrayElements(env, y_bytes, y_data, 0); - - jbyteArray priv_bytes = (*env)->NewByteArray(env, privHeader->cbSubgroupOrder); - jbyte *key_priv = (*env)->GetByteArrayElements(env, priv_bytes, NULL); - memcpy(key_priv, priv, privHeader->cbSubgroupOrder); - (*env)->ReleaseByteArrayElements(env, priv_bytes, key_priv, 0); - - free(fullBuf); - - jmethodID ec_priv_init = (*env)->GetMethodID(env, privkey_class, "<init>", "(I[B[B[B[B[BLjava/security/spec/ECParameterSpec;)V"); - return (*env)->NewObject(env, privkey_class, ec_priv_init, flag, meta_bytes, header_bytes, x_bytes, y_bytes, priv_bytes, - ec_priv_param_spec); -} - -static jobject key_to_pubkey(JNIEnv *env, BCRYPT_KEY_HANDLE key, jint flag, LPCWSTR curve) { - NTSTATUS status; - ULONG bufSize = 0; - if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCFULLPUBLIC_BLOB, NULL, 0, &bufSize, 0))) { - wprintf(L"**** Error 0x%x returned by BCryptExportKey(full, length only)\n", status); - return NULL; - } - if (bufSize == 0) { - printf("err0\n"); - return NULL; - } - - PBYTE fullBuf = calloc(bufSize, 1); - if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCFULLPUBLIC_BLOB, fullBuf, bufSize, &bufSize, 0))) { - wprintf(L"**** Error 0x%x returned by BCryptExportKey(full, whole)\n", status); - return NULL; - } - - ULONG paramLength; - jobject ec_pub_param_spec = create_ec_param_spec(env, fullBuf, ¶mLength); - - // fullBuf looks like: - // BCRYPT_ECCFULLKEY_BLOB header - // P[cbFieldLength] Prime specifying the base field. - // A[cbFieldLength] Coefficient A of the equation y^2 = x^3 + A*x + B mod p - // B[cbFieldLength] Coefficient B of the equation y^2 = x^3 + A*x + B mod p - // Gx[cbFieldLength] X-coordinate of the base point. - // Gy[cbFieldLength] Y-coordinate of the base point. - // n[cbSubgroupOrder] Order of the group generated by G = (x,y) - // h[cbCofactor] Cofactor of G in E. - // S[cbSeed] Seed of the curve. - // Qx[cbFieldLength] X-coordinate of the public point. - // Qy[cbFieldLength] Y-coordinate of the public point. - BCRYPT_ECCFULLKEY_BLOB *pubHeader = (BCRYPT_ECCFULLKEY_BLOB *)fullBuf; - PBYTE pub_x = &fullBuf[paramLength]; - PBYTE pub_y = pub_x + pubHeader->cbFieldLength; - - jbyteArray meta_bytes = NULL; - jbyteArray header_bytes = NULL; - switch (flag) { - case 0: { - // meta = curve - jint meta_len = (wcslen(curve) + 1) * sizeof(WCHAR); - meta_bytes = (*env)->NewByteArray(env, meta_len); - jbyte *meta_data = (*env)->GetByteArrayElements(env, meta_bytes, NULL); - memcpy(meta_data, curve, meta_len); - (*env)->ReleaseByteArrayElements(env, meta_bytes, meta_data, 0); - } - case 1: - case 2: { - header_bytes = (*env)->NewByteArray(env, paramLength); - jbyte *header_data = (*env)->GetByteArrayElements(env, header_bytes, NULL); - memcpy(header_data, pubHeader, paramLength); - (*env)->ReleaseByteArrayElements(env, header_bytes, header_data, 0); - break; - } - default: - // header = small - if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCPUBLIC_BLOB, NULL, 0, &bufSize, 0))) { - wprintf(L"**** Error 0x%x returned by BCryptExportKey(small, length only)\n", status); - free(fullBuf); - return NULL; - } - if (bufSize == 0) { - printf("buf 0\n"); - free(fullBuf); - return NULL; - } - PBYTE smallBuf = calloc(bufSize, 1); - if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCPUBLIC_BLOB, smallBuf, bufSize, &bufSize, 0))) { - wprintf(L"**** Error 0x%x returned by BCryptExportKey(small, whole)\n", status); - free(fullBuf); - free(smallBuf); - return NULL; - } - // smallBuf looks like: - // BCRYPT_ECCKEY_BLOB header - // Qx[cbFieldLength] X-coordinate of the public point. - // Qy[cbFieldLength] Y-coordinate of the public point. - header_bytes = (*env)->NewByteArray(env, sizeof(BCRYPT_ECCKEY_BLOB)); - jbyte *header_data = (*env)->GetByteArrayElements(env, header_bytes, NULL); - memcpy(header_data, smallBuf, sizeof(BCRYPT_ECCKEY_BLOB)); - (*env)->ReleaseByteArrayElements(env, header_bytes, header_data, 0); - free(smallBuf); - break; - } - - jbyteArray x_bytes = (*env)->NewByteArray(env, pubHeader->cbFieldLength); - jbyte *x_data = (*env)->GetByteArrayElements(env, x_bytes, NULL); - memcpy(x_data, pub_x, pubHeader->cbFieldLength); - (*env)->ReleaseByteArrayElements(env, x_bytes, x_data, 0); - - jbyteArray y_bytes = (*env)->NewByteArray(env, pubHeader->cbFieldLength); - jbyte *y_data = (*env)->GetByteArrayElements(env, y_bytes, NULL); - memcpy(y_data, pub_y, pubHeader->cbFieldLength); - (*env)->ReleaseByteArrayElements(env, y_bytes, y_data, 0); - - free(fullBuf); - - jmethodID ec_pub_init = (*env)->GetMethodID(env, pubkey_class, "<init>", "(I[B[B[B[BLjava/security/spec/ECParameterSpec;)V"); - return (*env)->NewObject(env, pubkey_class, ec_pub_init, flag, meta_bytes, header_bytes, x_bytes, y_bytes, ec_pub_param_spec); -} - -JNIEXPORT jobject JNICALL -Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Mscng_generate__ILjava_security_SecureRandom_2(JNIEnv *env, - jobject self, - jint keysize, - jobject random) { - NTSTATUS status; - BCRYPT_ALG_HANDLE handle = NULL; - - jclass mscng_kpg_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi$Mscng"); - jfieldID type_id = (*env)->GetFieldID(env, mscng_kpg_class, "type", "Ljava/lang/String;"); - jstring type = (jstring)(*env)->GetObjectField(env, self, type_id); - const char *type_data = (*env)->GetStringUTFChars(env, type, NULL); - LPCWSTR algo; - if (strcmp(type_data, "ECDH") == 0) { - switch (keysize) { - case 256: - algo = BCRYPT_ECDH_P256_ALGORITHM; - break; - case 384: - algo = BCRYPT_ECDH_P384_ALGORITHM; - break; - case 521: - algo = BCRYPT_ECDH_P521_ALGORITHM; - break; - default: - // unreachable - return NULL; - } - } else if (strcmp(type_data, "ECDSA") == 0) { - switch (keysize) { - case 256: - algo = BCRYPT_ECDSA_P256_ALGORITHM; - break; - case 384: - algo = BCRYPT_ECDSA_P384_ALGORITHM; - break; - case 521: - algo = BCRYPT_ECDSA_P521_ALGORITHM; - break; - default: - // unreachable - return NULL; - } - } else { - // unreachable - return NULL; - } - (*env)->ReleaseStringUTFChars(env, type, type_data); - - if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(&handle, algo, MS_PRIMITIVE_PROVIDER, 0))) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptOpenAlgorithmProvider", status); - return NULL; - } - - BCRYPT_KEY_HANDLE key = NULL; - - native_timing_start(); - status = BCryptGenerateKeyPair(handle, &key, keysize, 0); - native_timing_pause(); - - if (NT_FAILURE(status)) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptGenerateKeyPair\n", status); - BCryptCloseAlgorithmProvider(handle, 0); - return NULL; - } - - native_timing_restart(); - status = BCryptFinalizeKeyPair(key, 0); - native_timing_stop(); - - if (NT_FAILURE(status)) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptFinalizeKeyPair\n", status); - BCryptCloseAlgorithmProvider(handle, 0); - return NULL; - } - - jobject privkey = key_to_privkey(env, key, KEYFLAG_NIST, NULL); - jobject pubkey = key_to_pubkey(env, key, KEYFLAG_NIST, NULL); - - jmethodID keypair_init = (*env)->GetMethodID(env, keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V"); - - BCryptDestroyKey(key); - BCryptCloseAlgorithmProvider(handle, 0); - return (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey); -} - -JNIEXPORT jobject JNICALL -Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Mscng_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2( - JNIEnv *env, jobject self, jobject params, jobject random) { - NTSTATUS status; - BCRYPT_ALG_HANDLE handle = NULL; - BCRYPT_KEY_HANDLE key = NULL; - - jclass mscng_kpg_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi$Mscng"); - jfieldID type_id = (*env)->GetFieldID(env, mscng_kpg_class, "type", "Ljava/lang/String;"); - jstring type = (jstring)(*env)->GetObjectField(env, self, type_id); - const char *type_data = (*env)->GetStringUTFChars(env, type, NULL); - LPCWSTR algo; - if (strcmp(type_data, "ECDH") == 0) { - algo = BCRYPT_ECDH_ALGORITHM; - } else if (strcmp(type_data, "ECDSA") == 0) { - algo = BCRYPT_ECDSA_ALGORITHM; - } else { - // unreachable - return NULL; - } - (*env)->ReleaseStringUTFChars(env, type, type_data); - - jint keyflag; - NWPSTR curveName; - ULONG bits = init_algo(env, &handle, &keyflag, &curveName, algo, params); - if (bits == 0) { - throw_new(env, "java/security/GeneralSecurityException", "Couldn't initialize algo."); - return NULL; - } - - native_timing_start(); - status = BCryptGenerateKeyPair(handle, &key, bits, 0); - native_timing_pause(); - - if (NT_FAILURE(status)) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptGenerateKeyPair\n", status); - BCryptCloseAlgorithmProvider(handle, 0); - return NULL; - } - - native_timing_restart(); - status = BCryptFinalizeKeyPair(key, 0); - native_timing_stop(); - - if (NT_FAILURE(status)) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptFinalizeKeyPair\n", status); - BCryptCloseAlgorithmProvider(handle, 0); - return NULL; - } - - jobject privkey = key_to_privkey(env, key, keyflag, curveName); - jobject pubkey = key_to_pubkey(env, key, keyflag, curveName); - - if (curveName) { - free(curveName); - } - - jmethodID keypair_init = (*env)->GetMethodID(env, keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V"); - - BCryptDestroyKey(key); - BCryptCloseAlgorithmProvider(handle, 0); - return (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey); -} - -static NTSTATUS init_use_algo(JNIEnv *env, BCRYPT_ALG_HANDLE *handle, LPCWSTR type, jint keyflag, jbyteArray meta, jobject params) { - LPCWSTR ecdh_algos[] = {BCRYPT_ECDH_ALGORITHM, BCRYPT_ECDH_P256_ALGORITHM, BCRYPT_ECDH_P384_ALGORITHM, BCRYPT_ECDH_P521_ALGORITHM}; - LPCWSTR ecdsa_algos[] = {BCRYPT_ECDSA_ALGORITHM, BCRYPT_ECDSA_P256_ALGORITHM, BCRYPT_ECDSA_P384_ALGORITHM, BCRYPT_ECDSA_P521_ALGORITHM}; - - LPCWSTR *algos; - LPCWSTR algo; - if (lstrcmpW(type, BCRYPT_ECDH_ALGORITHM) == 0) { - algos = ecdh_algos; - } else if (lstrcmpW(type, BCRYPT_ECDSA_ALGORITHM) == 0) { - algos = ecdsa_algos; - } else { - // unreachable - return STATUS_INVALID_PARAMETER; - } - - switch (keyflag) { - case KEYFLAG_IMPLICIT: - case KEYFLAG_EXPLICIT: - case KEYFLAG_OTHER: - algo = algos[0]; - break; - case KEYFLAG_NIST: { - jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject elliptic_curve = (*env)->CallObjectMethod(env, params, get_curve); - - jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field); - - jmethodID get_bits = (*env)->GetMethodID(env, fp_field_class, "getFieldSize", "()I"); - jint bits = (*env)->CallIntMethod(env, field, get_bits); - switch (bits) { - case 256: - algo = algos[1]; - break; - case 384: - algo = algos[2]; - break; - case 521: - algo = algos[3]; - break; - default: - return STATUS_INVALID_PARAMETER; - } - break; - } - } - NTSTATUS status; - - if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(handle, algo, MS_PRIMITIVE_PROVIDER, 0))) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status); - return status; - } - - switch (keyflag) { - case KEYFLAG_IMPLICIT: { - jint meta_len = (*env)->GetArrayLength(env, meta); - jbyte *meta_data = (*env)->GetByteArrayElements(env, meta, NULL); - // if (NT_FAILURE(status = BCryptSetProperty(*handle, BCRYPT_ECC_CURVE_NAME, meta_data, meta_len, 0))) { - // throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptSetProperty(curve name)\n", - //status); - // (*env)->ReleaseByteArrayElements(env, meta, meta_data, JNI_ABORT); - // return status; - //} - (*env)->ReleaseByteArrayElements(env, meta, meta_data, JNI_ABORT); - break; - } - case KEYFLAG_EXPLICIT: - case KEYFLAG_OTHER: { - PBYTE curve; - ULONG curve_len = create_curve(env, params, &curve); - if (NT_FAILURE(status = BCryptSetProperty(*handle, BCRYPT_ECC_PARAMETERS, curve, curve_len, 0))) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptSetProperty(parameters)\n", - status); - free(curve); - return status; - } - free(curve); - break; - } - } - return STATUS_SUCCESS; -} - -static jint get_keyflag(JNIEnv *env, jobject key) { - if ((*env)->IsInstanceOf(env, key, pubkey_class) || (*env)->IsInstanceOf(env, key, privkey_class)) { - jclass key_class = (*env)->GetObjectClass(env, key); - jmethodID get_flag = (*env)->GetMethodID(env, key_class, "getFlag", "()I"); - return (*env)->CallIntMethod(env, key, get_flag); - } else { - return KEYFLAG_OTHER; - } -} - -static jbyteArray get_meta(JNIEnv *env, jobject key) { - if ((*env)->IsInstanceOf(env, key, pubkey_class) || (*env)->IsInstanceOf(env, key, privkey_class)) { - jclass key_class = (*env)->GetObjectClass(env, key); - jmethodID get_meta = (*env)->GetMethodID(env, key_class, "getMeta", "()[B"); - return (jbyteArray)(*env)->CallObjectMethod(env, key, get_meta); - } else { - return NULL; - } -} - -JNIEXPORT jbyteArray JNICALL -Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Mscng_generateSecret__Ljava_security_interfaces_ECPublicKey_2Ljava_security_interfaces_ECPrivateKey_2Ljava_security_spec_AlgorithmParameterSpec_2( - JNIEnv *env, jobject self, jobject pubkey, jobject privkey, jobject params) { - NTSTATUS status; - - jclass mscng_ka_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi$Mscng"); - jfieldID type_id = (*env)->GetFieldID(env, mscng_ka_class, "type", "Ljava/lang/String;"); - jstring type = (jstring)(*env)->GetObjectField(env, self, type_id); - const char *type_data = (*env)->GetStringUTFChars(env, type, NULL); - LPCWSTR kdf_algo; - if (strcmp(type_data, "ECDHwithSHA1KDF(CNG)") == 0) { - kdf_algo = BCRYPT_SHA1_ALGORITHM; - } else if (strcmp(type_data, "ECDHwithSHA256KDF(CNG)") == 0) { - kdf_algo = BCRYPT_SHA256_ALGORITHM; - } else if (strcmp(type_data, "ECDHwithSHA384KDF(CNG)") == 0) { - kdf_algo = BCRYPT_SHA384_ALGORITHM; - } else if (strcmp(type_data, "ECDHwithSHA512KDF(CNG)") == 0) { - kdf_algo = BCRYPT_SHA512_ALGORITHM; - } else { - // unreachable - return NULL; - } - (*env)->ReleaseStringUTFChars(env, type, type_data); - - BCRYPT_ALG_HANDLE kaHandle = NULL; - - jint pub_flag = get_keyflag(env, pubkey); - if (pub_flag == KEYFLAG_OTHER) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Cannot import non-native public key."); - return NULL; - } - jbyteArray meta = get_meta(env, pubkey); - - if (NT_FAILURE(status = init_use_algo(env, &kaHandle, BCRYPT_ECDH_ALGORITHM, pub_flag, meta, params))) { - return NULL; - } - - BCRYPT_KEY_HANDLE pkey = NULL; - BCRYPT_KEY_HANDLE skey = NULL; - - jmethodID get_data_priv = (*env)->GetMethodID(env, pubkey_class, "getData", "()[B"); - jbyteArray pubkey_barray = (jbyteArray)(*env)->CallObjectMethod(env, pubkey, get_data_priv); - - jint pub_length = (*env)->GetArrayLength(env, pubkey_barray); - jbyte *pub_data = (*env)->GetByteArrayElements(env, pubkey_barray, NULL); - if (NT_FAILURE(status = BCryptImportKeyPair(kaHandle, NULL, BCRYPT_ECCFULLPUBLIC_BLOB, &pkey, pub_data, pub_length, 0))) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptImportKeyPair(pub)\n", status); - BCryptCloseAlgorithmProvider(kaHandle, 0); - (*env)->ReleaseByteArrayElements(env, pubkey_barray, pub_data, JNI_ABORT); - return NULL; - } - (*env)->ReleaseByteArrayElements(env, pubkey_barray, pub_data, JNI_ABORT); - - jint priv_flag = get_keyflag(env, privkey); - if (priv_flag == KEYFLAG_OTHER) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Cannot import non-native private key."); - return NULL; - } - - jmethodID get_data_pub = (*env)->GetMethodID(env, privkey_class, "getData", "()[B"); - jbyteArray privkey_barray = (jbyteArray)(*env)->CallObjectMethod(env, privkey, get_data_pub); - - jint priv_length = (*env)->GetArrayLength(env, privkey_barray); - jbyte *priv_data = (*env)->GetByteArrayElements(env, privkey_barray, NULL); - if (NT_FAILURE(status = BCryptImportKeyPair(kaHandle, NULL, BCRYPT_ECCFULLPRIVATE_BLOB, &skey, priv_data, priv_length, 0))) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptImportKeyPair(priv)\n", status); - BCryptCloseAlgorithmProvider(kaHandle, 0); - BCryptDestroyKey(pkey); - (*env)->ReleaseByteArrayElements(env, privkey_barray, priv_data, JNI_ABORT); - return NULL; - } - (*env)->ReleaseByteArrayElements(env, privkey_barray, priv_data, JNI_ABORT); - - BCRYPT_SECRET_HANDLE ka = NULL; - - native_timing_start(); - status = BCryptSecretAgreement(skey, pkey, &ka, 0); - native_timing_stop(); - - if (NT_FAILURE(status)) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptSecretAgreement\n", status); - BCryptCloseAlgorithmProvider(kaHandle, 0); - BCryptDestroyKey(pkey); - BCryptDestroyKey(skey); - return NULL; - } - - BCryptBufferDesc paramList = {0}; - BCryptBuffer kdfParams[1] = {0}; - kdfParams[0].BufferType = KDF_HASH_ALGORITHM; - kdfParams[0].cbBuffer = (DWORD)((wcslen(kdf_algo) + 1) * sizeof(WCHAR)); - kdfParams[0].pvBuffer = (PVOID)kdf_algo; - paramList.cBuffers = 1; - paramList.pBuffers = kdfParams; - paramList.ulVersion = BCRYPTBUFFER_VERSION; - - ULONG bufSize = 0; - if (NT_FAILURE(status = BCryptDeriveKey(ka, BCRYPT_KDF_HASH, ¶mList, NULL, 0, &bufSize, 0))) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptDeriveKey(length only)\n", status); - return NULL; - } - - PBYTE derived = calloc(bufSize, 1); - if (NT_FAILURE(status = BCryptDeriveKey(ka, BCRYPT_KDF_HASH, ¶mList, derived, bufSize, &bufSize, 0))) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptDeriveKey(whole)\n", status); - return NULL; - } - - jbyteArray result = (*env)->NewByteArray(env, bufSize); - jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL); - memcpy(result_data, derived, bufSize); - (*env)->ReleaseByteArrayElements(env, result, result_data, 0); - - free(derived); - BCryptDestroyKey(pkey); - BCryptDestroyKey(skey); - BCryptDestroySecret(ka); - BCryptCloseAlgorithmProvider(kaHandle, 0); - return result; -} - -JNIEXPORT jobject JNICALL -Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Mscng_generateSecret__Ljava_security_interfaces_ECPublicKey_2Ljava_security_interfaces_ECPrivateKey_2Ljava_security_spec_AlgorithmParameterSpec_2Ljava_lang_String_2( - JNIEnv *env, jobject self, jobject pubkey, jobject privkey, jobject params, jstring algorithm) { - throw_new(env, "java/lang/UnsupportedOperationException", "Not supported."); - return NULL; -} - -static LPCWSTR get_sighash_algo(JNIEnv *env, jobject self) { - jclass mscng_sig_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi$Mscng"); - jfieldID type_id = (*env)->GetFieldID(env, mscng_sig_class, "type", "Ljava/lang/String;"); - jstring type = (jstring)(*env)->GetObjectField(env, self, type_id); - const char *type_data = (*env)->GetStringUTFChars(env, type, NULL); - LPCWSTR hash_algo; - if (strcmp(type_data, "SHA1withECDSA") == 0) { - hash_algo = BCRYPT_SHA1_ALGORITHM; - } else if (strcmp(type_data, "SHA256withECDSA") == 0) { - hash_algo = BCRYPT_SHA256_ALGORITHM; - } else if (strcmp(type_data, "SHA384withECDSA") == 0) { - hash_algo = BCRYPT_SHA384_ALGORITHM; - } else if (strcmp(type_data, "SHA512withECDSA") == 0) { - hash_algo = BCRYPT_SHA512_ALGORITHM; - } else { - // unreachable - return NULL; - } - (*env)->ReleaseStringUTFChars(env, type, type_data); - return hash_algo; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Mscng_sign(JNIEnv *env, jobject self, - jbyteArray data, jobject privkey, - jobject params) { - NTSTATUS status; - LPCWSTR hash_algo = get_sighash_algo(env, self); - - BCRYPT_ALG_HANDLE sigHandle = NULL; - - jint keyflag = get_keyflag(env, privkey); - if (keyflag == KEYFLAG_OTHER) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Cannot import non-native private key."); - return NULL; - } - jbyteArray meta = get_meta(env, privkey); - - if (NT_FAILURE(status = init_use_algo(env, &sigHandle, BCRYPT_ECDSA_ALGORITHM, keyflag, meta, params))) { - return NULL; - } - - if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(&sigHandle, BCRYPT_ECDSA_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0))) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status); - return NULL; - } - - BCRYPT_ALG_HANDLE hashHandle = NULL; - - if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(&hashHandle, hash_algo, NULL, 0))) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status); - BCryptCloseAlgorithmProvider(sigHandle, 0); - return NULL; - } - - DWORD dummy = 0; - DWORD hash_len = 0; - if (NT_FAILURE(status = BCryptGetProperty(hashHandle, BCRYPT_HASH_LENGTH, (PBYTE)&hash_len, sizeof(DWORD), &dummy, 0))) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptGetProperty(hash len)\n", status); - BCryptCloseAlgorithmProvider(sigHandle, 0); - BCryptCloseAlgorithmProvider(hashHandle, 0); - return NULL; - } - - PBYTE hash = calloc(hash_len, 1); - - jint data_len = (*env)->GetArrayLength(env, data); - jbyte *data_bytes = (*env)->GetByteArrayElements(env, data, NULL); - native_timing_start(); - status = BCryptHash(hashHandle, NULL, 0, data_bytes, data_len, hash, hash_len); - native_timing_pause(); - - if (NT_FAILURE(status)) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptHash\n", status); - BCryptCloseAlgorithmProvider(sigHandle, 0); - BCryptCloseAlgorithmProvider(hashHandle, 0); - free(hash); - (*env)->ReleaseByteArrayElements(env, data, data_bytes, JNI_ABORT); - return NULL; - } - (*env)->ReleaseByteArrayElements(env, data, data_bytes, JNI_ABORT); - - BCRYPT_KEY_HANDLE skey = NULL; - - jmethodID get_data = (*env)->GetMethodID(env, privkey_class, "getData", "()[B"); - jbyteArray privkey_barray = (jbyteArray)(*env)->CallObjectMethod(env, privkey, get_data); - - jint priv_length = (*env)->GetArrayLength(env, privkey_barray); - jbyte *priv_data = (*env)->GetByteArrayElements(env, privkey_barray, NULL); - if (NT_FAILURE(status = BCryptImportKeyPair(sigHandle, NULL, BCRYPT_ECCFULLPRIVATE_BLOB, &skey, priv_data, priv_length, 0))) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptImportKeyPair\n", status); - BCryptCloseAlgorithmProvider(sigHandle, 0); - BCryptCloseAlgorithmProvider(hashHandle, 0); - free(hash); - (*env)->ReleaseByteArrayElements(env, privkey_barray, priv_data, JNI_ABORT); - return NULL; - } - (*env)->ReleaseByteArrayElements(env, privkey_barray, priv_data, JNI_ABORT); - - DWORD sig_len = 0; - native_timing_restart(); - status = BCryptSignHash(skey, NULL, hash, hash_len, NULL, 0, &sig_len, 0); - native_timing_pause(); - - if (NT_FAILURE(status)) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptSignHash(len only)\n", status); - BCryptCloseAlgorithmProvider(sigHandle, 0); - BCryptCloseAlgorithmProvider(hashHandle, 0); - free(hash); - return NULL; - } - - PBYTE sig_buf = calloc(sig_len, 1); - - native_timing_restart(); - status = BCryptSignHash(skey, NULL, hash, hash_len, sig_buf, sig_len, &sig_len, 0); - native_timing_stop(); - - if (NT_FAILURE(status)) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptSignHash(do)\n", status); - BCryptCloseAlgorithmProvider(sigHandle, 0); - BCryptCloseAlgorithmProvider(hashHandle, 0); - free(hash); - free(sig_buf); - return NULL; - } - - DWORD half_len = sig_len / 2; - jobject sig = asn1_der_encode(env, sig_buf, half_len, sig_buf + half_len, half_len); - - free(hash); - free(sig_buf); - BCryptDestroyKey(skey); - BCryptCloseAlgorithmProvider(hashHandle, 0); - BCryptCloseAlgorithmProvider(sigHandle, 0); - - return sig; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Mscng_verify(JNIEnv *env, jobject self, - jbyteArray sig, jbyteArray data, - jobject pubkey, jobject params) { - NTSTATUS status; - LPCWSTR hash_algo = get_sighash_algo(env, self); - - BCRYPT_ALG_HANDLE sigHandle = NULL; - - jint keyflag = get_keyflag(env, pubkey); - if (keyflag == KEYFLAG_OTHER) { // TODO: This is not necessary - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Cannot import non-native public key."); - return JNI_FALSE; - } - jbyteArray meta = get_meta(env, pubkey); - - if (NT_FAILURE(status = init_use_algo(env, &sigHandle, BCRYPT_ECDSA_ALGORITHM, keyflag, meta, params))) { - return JNI_FALSE; - } - - BCRYPT_ALG_HANDLE hashHandle = NULL; - - if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(&hashHandle, hash_algo, NULL, 0))) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status); - BCryptCloseAlgorithmProvider(sigHandle, 0); - return JNI_FALSE; - } - - DWORD dummy = 0; - DWORD hash_len = 0; - if (NT_FAILURE(status = BCryptGetProperty(hashHandle, BCRYPT_HASH_LENGTH, (PBYTE)&hash_len, sizeof(DWORD), &dummy, 0))) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptGetProperty(hash len)\n", status); - BCryptCloseAlgorithmProvider(sigHandle, 0); - BCryptCloseAlgorithmProvider(hashHandle, 0); - return JNI_FALSE; - } - - PBYTE hash = calloc(hash_len, 1); - - jint data_len = (*env)->GetArrayLength(env, data); - jbyte *data_bytes = (*env)->GetByteArrayElements(env, data, NULL); - native_timing_start(); - status = BCryptHash(hashHandle, NULL, 0, data_bytes, data_len, hash, hash_len); - native_timing_pause(); - - if (NT_FAILURE(status)) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptHash\n", status); - BCryptCloseAlgorithmProvider(sigHandle, 0); - BCryptCloseAlgorithmProvider(hashHandle, 0); - free(hash); - (*env)->ReleaseByteArrayElements(env, data, data_bytes, JNI_ABORT); - return JNI_FALSE; - } - (*env)->ReleaseByteArrayElements(env, data, data_bytes, JNI_ABORT); - - BCRYPT_KEY_HANDLE pkey = NULL; - - jmethodID get_data = (*env)->GetMethodID(env, pubkey_class, "getData", "()[B"); - jbyteArray pubkey_barray = (jbyteArray)(*env)->CallObjectMethod(env, pubkey, get_data); - - jint pub_length = (*env)->GetArrayLength(env, pubkey_barray); - jbyte *pub_data = (*env)->GetByteArrayElements(env, pubkey_barray, NULL); - if (NT_FAILURE(status = BCryptImportKeyPair(sigHandle, NULL, BCRYPT_ECCFULLPUBLIC_BLOB, &pkey, pub_data, pub_length, 0))) { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptImportKeyPair\n", status); - BCryptCloseAlgorithmProvider(sigHandle, 0); - BCryptCloseAlgorithmProvider(hashHandle, 0); - free(hash); - (*env)->ReleaseByteArrayElements(env, pubkey_barray, pub_data, JNI_ABORT); - return JNI_FALSE; - } - (*env)->ReleaseByteArrayElements(env, pubkey_barray, pub_data, JNI_ABORT); - - jmethodID get_n = (*env)->GetMethodID(env, ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;"); - jobject n = (*env)->CallObjectMethod(env, params, get_n); - jmethodID get_bitlength = (*env)->GetMethodID(env, biginteger_class, "bitLength", "()I"); - jint ord_bits = (*env)->CallIntMethod(env, n, get_bitlength); - jint ord_bytes = (ord_bits + 7) / 8; - - jint sig_len = (*env)->GetArrayLength(env, sig); - jbyte *sig_data = (*env)->GetByteArrayElements(env, sig, NULL); - jbyte *r; - size_t rlen; - jbyte *s; - size_t slen; - bool decode = asn1_der_decode(env, sig, &r, &rlen, &s, &slen); - (*env)->ReleaseByteArrayElements(env, sig, sig_data, JNI_ABORT); - - if (!decode) { - throw_new(env, "java/security/GeneralSecurityException", "Error decoding sig."); - BCryptDestroyKey(pkey); - BCryptCloseAlgorithmProvider(sigHandle, 0); - BCryptCloseAlgorithmProvider(hashHandle, 0); - free(hash); - return JNI_FALSE; - } - - jbyte *r_cpy = r; - jbyte *s_cpy = s; - if (rlen > ord_bytes) { - r_cpy += ord_bytes - rlen; - } - if (slen > ord_bytes) { - s_cpy += ord_bytes - slen; - } - if (rlen < ord_bytes) { - r_cpy = _alloca(ord_bytes); - memset(r_cpy, 0, ord_bytes); - memcpy(r_cpy, r + (ord_bytes - rlen), ord_bytes); - } - if (slen < ord_bytes) { - s_cpy = _alloca(ord_bytes); - memset(s_cpy, 0, ord_bytes); - memcpy(s_cpy, s + (ord_bytes - slen), ord_bytes); - } - rlen = ord_bytes; - slen = ord_bytes; - - UCHAR *sig_full = calloc(rlen + slen, 1); - memcpy(sig_full, r_cpy, rlen); - memcpy(sig_full + rlen, s_cpy, slen); - free(r); - free(s); - - native_timing_restart(); - NTSTATUS result = BCryptVerifySignature(pkey, NULL, hash, hash_len, sig_full, rlen + slen, 0); - native_timing_stop(); - - free(hash); - free(sig_full); - BCryptDestroyKey(pkey); - BCryptCloseAlgorithmProvider(hashHandle, 0); - BCryptCloseAlgorithmProvider(sigHandle, 0); - - if (result == STATUS_SUCCESS) { - return JNI_TRUE; - } else if (result == STATUS_INVALID_SIGNATURE) { - return JNI_FALSE; - } else { - throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptVerifySignature\n", status); - return JNI_FALSE; - } -}
\ No newline at end of file diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/native.h b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/native.h deleted file mode 100644 index 8f5b521..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/native.h +++ /dev/null @@ -1,2044 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include <jni.h> -/* Header for class cz_crcs_ectester_standalone_libs_NativeECLibrary */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_NativeECLibrary -#define _Included_cz_crcs_ectester_standalone_libs_NativeECLibrary -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_NativeECLibrary - * Method: getNativeTimingSupport - * Signature: ()Ljava/util/Set; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_NativeECLibrary_getNativeTimingSupport - (JNIEnv *, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_NativeECLibrary - * Method: setNativeTimingType - * Signature: (Ljava/lang/String;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_NativeECLibrary_setNativeTimingType - (JNIEnv *, jobject, jstring); - -/* - * Class: cz_crcs_ectester_standalone_libs_NativeECLibrary - * Method: getNativeTimingResolution - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_cz_crcs_ectester_standalone_libs_NativeECLibrary_getNativeTimingResolution - (JNIEnv *, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_NativeECLibrary - * Method: getNativeTimingUnit - * Signature: ()Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_cz_crcs_ectester_standalone_libs_NativeECLibrary_getNativeTimingUnit - (JNIEnv *, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_NativeECLibrary - * Method: getLastNativeTiming - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_cz_crcs_ectester_standalone_libs_NativeECLibrary_getLastNativeTiming - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_TomcryptLib */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_TomcryptLib -#define _Included_cz_crcs_ectester_standalone_libs_TomcryptLib -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_TomcryptLib - * Method: createProvider - * Signature: ()Ljava/security/Provider; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_TomcryptLib_createProvider - (JNIEnv *, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_TomcryptLib - * Method: getCurves - * Signature: ()Ljava/util/Set; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_TomcryptLib_getCurves - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt_serialVersionUID 1421746759512286392LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt_MAX_ARRAY_SIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt_MAX_ARRAY_SIZE 2147483639L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt_KEYS -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt_KEYS 0L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt_VALUES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt_VALUES 1L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt_ENTRIES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt_ENTRIES 2L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt_serialVersionUID 4112578634029874840LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt_serialVersionUID -4298000515446427739LL -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeProvider_TomCrypt - * Method: setup - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024TomCrypt_setup - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_TomCrypt */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_TomCrypt -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_TomCrypt -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_TomCrypt_DEFAULT_KEYSIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_TomCrypt_DEFAULT_KEYSIZE 256L -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_TomCrypt - * Method: keysizeSupported - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024TomCrypt_keysizeSupported - (JNIEnv *, jobject, jint); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_TomCrypt - * Method: paramsSupported - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024TomCrypt_paramsSupported - (JNIEnv *, jobject, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_TomCrypt - * Method: generate - * Signature: (ILjava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024TomCrypt_generate__ILjava_security_SecureRandom_2 - (JNIEnv *, jobject, jint, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_TomCrypt - * Method: generate - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024TomCrypt_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2 - (JNIEnv *, jobject, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_TomCrypt */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_TomCrypt -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_TomCrypt -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_TomCrypt */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_TomCrypt -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_TomCrypt -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_TomCrypt */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_TomCrypt -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_TomCrypt -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_TomCrypt - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024TomCrypt_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_TomCrypt - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;Ljava/lang/String;)Ljavax/crypto/SecretKey; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024TomCrypt_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject, jstring); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_TomCryptRaw */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_TomCryptRaw -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_TomCryptRaw -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_TomCryptRaw - * Method: sign - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024TomCryptRaw_sign - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_TomCryptRaw - * Method: verify - * Signature: ([B[B[BLjava/security/spec/ECParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024TomCryptRaw_verify - (JNIEnv *, jobject, jbyteArray, jbyteArray, jbyteArray, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_BotanLib */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_BotanLib -#define _Included_cz_crcs_ectester_standalone_libs_BotanLib -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_BotanLib - * Method: createProvider - * Signature: ()Ljava/security/Provider; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_BotanLib_createProvider - (JNIEnv *, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_BotanLib - * Method: getCurves - * Signature: ()Ljava/util/Set; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_BotanLib_getCurves - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan_serialVersionUID 1421746759512286392LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan_MAX_ARRAY_SIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan_MAX_ARRAY_SIZE 2147483639L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan_KEYS -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan_KEYS 0L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan_VALUES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan_VALUES 1L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan_ENTRIES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan_ENTRIES 2L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan_serialVersionUID 4112578634029874840LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan_serialVersionUID -4298000515446427739LL -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeProvider_Botan - * Method: setup - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Botan_setup - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Botan */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Botan -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Botan -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Botan_DEFAULT_KEYSIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Botan_DEFAULT_KEYSIZE 256L -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Botan - * Method: keysizeSupported - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Botan_keysizeSupported - (JNIEnv *, jobject, jint); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Botan - * Method: paramsSupported - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Botan_paramsSupported - (JNIEnv *, jobject, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Botan - * Method: generate - * Signature: (ILjava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Botan_generate__ILjava_security_SecureRandom_2 - (JNIEnv *, jobject, jint, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Botan - * Method: generate - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Botan_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2 - (JNIEnv *, jobject, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Botan */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Botan -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Botan -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Botan */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Botan -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Botan -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Botan */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Botan -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Botan -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Botan - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Botan_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Botan - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;Ljava/lang/String;)Ljavax/crypto/SecretKey; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Botan_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject, jstring); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Botan */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Botan -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Botan -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Botan - * Method: sign - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Botan_sign - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Botan - * Method: verify - * Signature: ([B[B[BLjava/security/spec/ECParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Botan_verify - (JNIEnv *, jobject, jbyteArray, jbyteArray, jbyteArray, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_CryptoppLib */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_CryptoppLib -#define _Included_cz_crcs_ectester_standalone_libs_CryptoppLib -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_CryptoppLib - * Method: createProvider - * Signature: ()Ljava/security/Provider; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_CryptoppLib_createProvider - (JNIEnv *, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_CryptoppLib - * Method: getCurves - * Signature: ()Ljava/util/Set; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_CryptoppLib_getCurves - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp_serialVersionUID 1421746759512286392LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp_MAX_ARRAY_SIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp_MAX_ARRAY_SIZE 2147483639L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp_KEYS -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp_KEYS 0L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp_VALUES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp_VALUES 1L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp_ENTRIES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp_ENTRIES 2L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp_serialVersionUID 4112578634029874840LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp_serialVersionUID -4298000515446427739LL -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeProvider_Cryptopp - * Method: setup - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Cryptopp_setup - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Cryptopp */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Cryptopp -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Cryptopp -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Cryptopp_DEFAULT_KEYSIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Cryptopp_DEFAULT_KEYSIZE 256L -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Cryptopp - * Method: keysizeSupported - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Cryptopp_keysizeSupported - (JNIEnv *, jobject, jint); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Cryptopp - * Method: paramsSupported - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Cryptopp_paramsSupported - (JNIEnv *, jobject, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Cryptopp - * Method: generate - * Signature: (ILjava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Cryptopp_generate__ILjava_security_SecureRandom_2 - (JNIEnv *, jobject, jint, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Cryptopp - * Method: generate - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Cryptopp_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2 - (JNIEnv *, jobject, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Cryptopp */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Cryptopp -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Cryptopp -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Cryptopp */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Cryptopp -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Cryptopp -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Cryptopp */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Cryptopp -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Cryptopp -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Cryptopp - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Cryptopp_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Cryptopp - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;Ljava/lang/String;)Ljavax/crypto/SecretKey; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Cryptopp_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject, jstring); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Cryptopp */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Cryptopp -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Cryptopp -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Cryptopp - * Method: sign - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Cryptopp_sign - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Cryptopp - * Method: verify - * Signature: ([B[B[BLjava/security/spec/ECParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Cryptopp_verify - (JNIEnv *, jobject, jbyteArray, jbyteArray, jbyteArray, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_OpensslLib */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_OpensslLib -#define _Included_cz_crcs_ectester_standalone_libs_OpensslLib -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_OpensslLib - * Method: createProvider - * Signature: ()Ljava/security/Provider; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_OpensslLib_createProvider - (JNIEnv *, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_OpensslLib - * Method: getCurves - * Signature: ()Ljava/util/Set; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_OpensslLib_getCurves - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl_serialVersionUID 1421746759512286392LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl_MAX_ARRAY_SIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl_MAX_ARRAY_SIZE 2147483639L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl_KEYS -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl_KEYS 0L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl_VALUES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl_VALUES 1L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl_ENTRIES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl_ENTRIES 2L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl_serialVersionUID 4112578634029874840LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl_serialVersionUID -4298000515446427739LL -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeProvider_Openssl - * Method: setup - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Openssl_setup - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Openssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Openssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Openssl -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Openssl_DEFAULT_KEYSIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Openssl_DEFAULT_KEYSIZE 256L -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Openssl - * Method: keysizeSupported - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Openssl_keysizeSupported - (JNIEnv *, jobject, jint); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Openssl - * Method: paramsSupported - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Openssl_paramsSupported - (JNIEnv *, jobject, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Openssl - * Method: generate - * Signature: (ILjava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Openssl_generate__ILjava_security_SecureRandom_2 - (JNIEnv *, jobject, jint, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Openssl - * Method: generate - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Openssl_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2 - (JNIEnv *, jobject, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Openssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Openssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Openssl -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Openssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Openssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Openssl -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Openssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Openssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Openssl -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Openssl - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Openssl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Openssl - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;Ljava/lang/String;)Ljavax/crypto/SecretKey; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Openssl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject, jstring); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Openssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Openssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Openssl -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Openssl - * Method: sign - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Openssl_sign - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Openssl - * Method: verify - * Signature: ([B[B[BLjava/security/spec/ECParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Openssl_verify - (JNIEnv *, jobject, jbyteArray, jbyteArray, jbyteArray, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_MscngLib */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_MscngLib -#define _Included_cz_crcs_ectester_standalone_libs_MscngLib -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_MscngLib - * Method: createProvider - * Signature: ()Ljava/security/Provider; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MscngLib_createProvider - (JNIEnv *, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_MscngLib - * Method: getCurves - * Signature: ()Ljava/util/Set; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MscngLib_getCurves - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng_serialVersionUID 1421746759512286392LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng_MAX_ARRAY_SIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng_MAX_ARRAY_SIZE 2147483639L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng_KEYS -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng_KEYS 0L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng_VALUES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng_VALUES 1L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng_ENTRIES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng_ENTRIES 2L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng_serialVersionUID 4112578634029874840LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng_serialVersionUID -4298000515446427739LL -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeProvider_Mscng - * Method: setup - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Mscng_setup - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Mscng */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Mscng -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Mscng -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Mscng_DEFAULT_KEYSIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Mscng_DEFAULT_KEYSIZE 256L -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Mscng - * Method: keysizeSupported - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Mscng_keysizeSupported - (JNIEnv *, jobject, jint); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Mscng - * Method: paramsSupported - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Mscng_paramsSupported - (JNIEnv *, jobject, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Mscng - * Method: generate - * Signature: (ILjava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Mscng_generate__ILjava_security_SecureRandom_2 - (JNIEnv *, jobject, jint, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Mscng - * Method: generate - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Mscng_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2 - (JNIEnv *, jobject, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Mscng */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Mscng -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Mscng -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Mscng */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Mscng -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Mscng -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Mscng */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Mscng -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Mscng -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Mscng - * Method: generateSecret - * Signature: (Ljava/security/interfaces/ECPublicKey;Ljava/security/interfaces/ECPrivateKey;Ljava/security/spec/AlgorithmParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Mscng_generateSecret__Ljava_security_interfaces_ECPublicKey_2Ljava_security_interfaces_ECPrivateKey_2Ljava_security_spec_AlgorithmParameterSpec_2 - (JNIEnv *, jobject, jobject, jobject, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Mscng - * Method: generateSecret - * Signature: (Ljava/security/interfaces/ECPublicKey;Ljava/security/interfaces/ECPrivateKey;Ljava/security/spec/AlgorithmParameterSpec;Ljava/lang/String;)Ljavax/crypto/SecretKey; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Mscng_generateSecret__Ljava_security_interfaces_ECPublicKey_2Ljava_security_interfaces_ECPrivateKey_2Ljava_security_spec_AlgorithmParameterSpec_2Ljava_lang_String_2 - (JNIEnv *, jobject, jobject, jobject, jobject, jstring); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Mscng */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Mscng -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Mscng -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Mscng - * Method: sign - * Signature: ([BLjava/security/interfaces/ECPrivateKey;Ljava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Mscng_sign - (JNIEnv *, jobject, jbyteArray, jobject, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Mscng - * Method: verify - * Signature: ([B[BLjava/security/interfaces/ECPublicKey;Ljava/security/spec/ECParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Mscng_verify - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_BoringsslLib */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_BoringsslLib -#define _Included_cz_crcs_ectester_standalone_libs_BoringsslLib -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_BoringsslLib - * Method: createProvider - * Signature: ()Ljava/security/Provider; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_BoringsslLib_createProvider - (JNIEnv *, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_BoringsslLib - * Method: getCurves - * Signature: ()Ljava/util/Set; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_BoringsslLib_getCurves - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl_serialVersionUID 1421746759512286392LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl_MAX_ARRAY_SIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl_MAX_ARRAY_SIZE 2147483639L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl_KEYS -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl_KEYS 0L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl_VALUES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl_VALUES 1L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl_ENTRIES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl_ENTRIES 2L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl_serialVersionUID 4112578634029874840LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl_serialVersionUID -4298000515446427739LL -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeProvider_Boringssl - * Method: setup - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Boringssl_setup - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Boringssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Boringssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Boringssl -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Boringssl_DEFAULT_KEYSIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Boringssl_DEFAULT_KEYSIZE 256L -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Boringssl - * Method: keysizeSupported - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Boringssl_keysizeSupported - (JNIEnv *, jobject, jint); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Boringssl - * Method: paramsSupported - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Boringssl_paramsSupported - (JNIEnv *, jobject, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Boringssl - * Method: generate - * Signature: (ILjava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Boringssl_generate__ILjava_security_SecureRandom_2 - (JNIEnv *, jobject, jint, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Boringssl - * Method: generate - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Boringssl_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2 - (JNIEnv *, jobject, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Boringssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Boringssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Boringssl -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Boringssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Boringssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Boringssl -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Boringssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Boringssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Boringssl -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Boringssl - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Boringssl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Boringssl - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;Ljava/lang/String;)Ljavax/crypto/SecretKey; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Boringssl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject, jstring); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Boringssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Boringssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Boringssl -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Boringssl - * Method: sign - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Boringssl_sign - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Boringssl - * Method: verify - * Signature: ([B[B[BLjava/security/spec/ECParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Boringssl_verify - (JNIEnv *, jobject, jbyteArray, jbyteArray, jbyteArray, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_GcryptLib */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_GcryptLib -#define _Included_cz_crcs_ectester_standalone_libs_GcryptLib -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_GcryptLib - * Method: createProvider - * Signature: ()Ljava/security/Provider; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_GcryptLib_createProvider - (JNIEnv *, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_GcryptLib - * Method: getCurves - * Signature: ()Ljava/util/Set; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_GcryptLib_getCurves - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt_serialVersionUID 1421746759512286392LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt_MAX_ARRAY_SIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt_MAX_ARRAY_SIZE 2147483639L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt_KEYS -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt_KEYS 0L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt_VALUES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt_VALUES 1L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt_ENTRIES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt_ENTRIES 2L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt_serialVersionUID 4112578634029874840LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt_serialVersionUID -4298000515446427739LL -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeProvider_Gcrypt - * Method: setup - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Gcrypt_setup - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Gcrypt */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Gcrypt -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Gcrypt -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Gcrypt_DEFAULT_KEYSIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Gcrypt_DEFAULT_KEYSIZE 256L -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Gcrypt - * Method: keysizeSupported - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Gcrypt_keysizeSupported - (JNIEnv *, jobject, jint); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Gcrypt - * Method: paramsSupported - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Gcrypt_paramsSupported - (JNIEnv *, jobject, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Gcrypt - * Method: generate - * Signature: (ILjava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Gcrypt_generate__ILjava_security_SecureRandom_2 - (JNIEnv *, jobject, jint, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Gcrypt - * Method: generate - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Gcrypt_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2 - (JNIEnv *, jobject, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Gcrypt */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Gcrypt -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Gcrypt -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Gcrypt */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Gcrypt -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Gcrypt -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Gcrypt */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Gcrypt -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Gcrypt -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Gcrypt - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Gcrypt_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Gcrypt - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;Ljava/lang/String;)Ljavax/crypto/SecretKey; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Gcrypt_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject, jstring); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Gcrypt */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Gcrypt -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Gcrypt -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Gcrypt - * Method: sign - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Gcrypt_sign - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Gcrypt - * Method: verify - * Signature: ([B[B[BLjava/security/spec/ECParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Gcrypt_verify - (JNIEnv *, jobject, jbyteArray, jbyteArray, jbyteArray, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_MbedTLSLib */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_MbedTLSLib -#define _Included_cz_crcs_ectester_standalone_libs_MbedTLSLib -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_MbedTLSLib - * Method: createProvider - * Signature: ()Ljava/security/Provider; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MbedTLSLib_createProvider - (JNIEnv *, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_MbedTLSLib - * Method: getCurves - * Signature: ()Ljava/util/Set; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MbedTLSLib_getCurves - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS_serialVersionUID 1421746759512286392LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS_MAX_ARRAY_SIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS_MAX_ARRAY_SIZE 2147483639L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS_KEYS -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS_KEYS 0L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS_VALUES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS_VALUES 1L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS_ENTRIES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS_ENTRIES 2L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS_serialVersionUID 4112578634029874840LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS_serialVersionUID -4298000515446427739LL -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeProvider_MbedTLS - * Method: setup - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024MbedTLS_setup - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_MbedTLS */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_MbedTLS -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_MbedTLS -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_MbedTLS_DEFAULT_KEYSIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_MbedTLS_DEFAULT_KEYSIZE 256L -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_MbedTLS - * Method: keysizeSupported - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024MbedTLS_keysizeSupported - (JNIEnv *, jobject, jint); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_MbedTLS - * Method: paramsSupported - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024MbedTLS_paramsSupported - (JNIEnv *, jobject, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_MbedTLS - * Method: generate - * Signature: (ILjava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024MbedTLS_generate__ILjava_security_SecureRandom_2 - (JNIEnv *, jobject, jint, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_MbedTLS - * Method: generate - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024MbedTLS_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2 - (JNIEnv *, jobject, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_MbedTLS */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_MbedTLS -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_MbedTLS -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_MbedTLS */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_MbedTLS -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_MbedTLS -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_MbedTLS */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_MbedTLS -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_MbedTLS -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_MbedTLS - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024MbedTLS_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_MbedTLS - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;Ljava/lang/String;)Ljavax/crypto/SecretKey; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024MbedTLS_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject, jstring); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_MbedTLS */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_MbedTLS -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_MbedTLS -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_MbedTLS - * Method: sign - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024MbedTLS_sign - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_MbedTLS - * Method: verify - * Signature: ([B[B[BLjava/security/spec/ECParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024MbedTLS_verify - (JNIEnv *, jobject, jbyteArray, jbyteArray, jbyteArray, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_IppcpLib */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_IppcpLib -#define _Included_cz_crcs_ectester_standalone_libs_IppcpLib -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_IppcpLib - * Method: createProvider - * Signature: ()Ljava/security/Provider; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_IppcpLib_createProvider - (JNIEnv *, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_IppcpLib - * Method: getCurves - * Signature: ()Ljava/util/Set; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_IppcpLib_getCurves - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp_serialVersionUID 1421746759512286392LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp_MAX_ARRAY_SIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp_MAX_ARRAY_SIZE 2147483639L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp_KEYS -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp_KEYS 0L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp_VALUES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp_VALUES 1L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp_ENTRIES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp_ENTRIES 2L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp_serialVersionUID 4112578634029874840LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp_serialVersionUID -4298000515446427739LL -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeProvider_Ippcp - * Method: setup - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Ippcp_setup - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Ippcp */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Ippcp -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Ippcp -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Ippcp_DEFAULT_KEYSIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Ippcp_DEFAULT_KEYSIZE 256L -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Ippcp - * Method: keysizeSupported - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Ippcp_keysizeSupported - (JNIEnv *, jobject, jint); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Ippcp - * Method: paramsSupported - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Ippcp_paramsSupported - (JNIEnv *, jobject, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Ippcp - * Method: generate - * Signature: (ILjava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Ippcp_generate__ILjava_security_SecureRandom_2 - (JNIEnv *, jobject, jint, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Ippcp - * Method: generate - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Ippcp_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2 - (JNIEnv *, jobject, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Ippcp */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Ippcp -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Ippcp -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Ippcp */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Ippcp -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Ippcp -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Ippcp */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Ippcp -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Ippcp -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Ippcp - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Ippcp_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Ippcp - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;Ljava/lang/String;)Ljavax/crypto/SecretKey; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Ippcp_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject, jstring); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Ippcp */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Ippcp -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Ippcp -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Ippcp - * Method: sign - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Ippcp_sign - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Ippcp - * Method: verify - * Signature: ([B[B[BLjava/security/spec/ECParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Ippcp_verify - (JNIEnv *, jobject, jbyteArray, jbyteArray, jbyteArray, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_MatrixsslLib */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_MatrixsslLib -#define _Included_cz_crcs_ectester_standalone_libs_MatrixsslLib -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_MatrixsslLib - * Method: createProvider - * Signature: ()Ljava/security/Provider; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MatrixsslLib_createProvider - (JNIEnv *, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_MatrixsslLib - * Method: getCurves - * Signature: ()Ljava/util/Set; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MatrixsslLib_getCurves - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_serialVersionUID 1421746759512286392LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_MAX_ARRAY_SIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_MAX_ARRAY_SIZE 2147483639L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_KEYS -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_KEYS 0L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_VALUES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_VALUES 1L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_ENTRIES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_ENTRIES 2L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_serialVersionUID 4112578634029874840LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_serialVersionUID -4298000515446427739LL -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl - * Method: setup - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Matrixssl_setup - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl_DEFAULT_KEYSIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl_DEFAULT_KEYSIZE 256L -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl - * Method: keysizeSupported - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Matrixssl_keysizeSupported - (JNIEnv *, jobject, jint); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl - * Method: paramsSupported - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Matrixssl_paramsSupported - (JNIEnv *, jobject, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl - * Method: generate - * Signature: (ILjava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Matrixssl_generate__ILjava_security_SecureRandom_2 - (JNIEnv *, jobject, jint, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl - * Method: generate - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Matrixssl_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2 - (JNIEnv *, jobject, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Matrixssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Matrixssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Matrixssl -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Matrixssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Matrixssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Matrixssl -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Matrixssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Matrixssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Matrixssl -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Matrixssl - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Matrixssl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Matrixssl - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;Ljava/lang/String;)Ljavax/crypto/SecretKey; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Matrixssl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject, jstring); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Matrixssl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Matrixssl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Matrixssl -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Matrixssl - * Method: sign - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Matrixssl_sign - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Matrixssl - * Method: verify - * Signature: ([B[B[BLjava/security/spec/ECParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Matrixssl_verify - (JNIEnv *, jobject, jbyteArray, jbyteArray, jbyteArray, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_LibresslLib */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_LibresslLib -#define _Included_cz_crcs_ectester_standalone_libs_LibresslLib -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_LibresslLib - * Method: createProvider - * Signature: ()Ljava/security/Provider; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_LibresslLib_createProvider - (JNIEnv *, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_LibresslLib - * Method: getCurves - * Signature: ()Ljava/util/Set; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_LibresslLib_getCurves - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl_serialVersionUID 1421746759512286392LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl_MAX_ARRAY_SIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl_MAX_ARRAY_SIZE 2147483639L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl_KEYS -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl_KEYS 0L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl_VALUES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl_VALUES 1L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl_ENTRIES -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl_ENTRIES 2L -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl_serialVersionUID 4112578634029874840LL -#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl_serialVersionUID -#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl_serialVersionUID -4298000515446427739LL -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeProvider_Libressl - * Method: setup - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Libressl_setup - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Libressl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Libressl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Libressl -#ifdef __cplusplus -extern "C" { -#endif -#undef cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Libressl_DEFAULT_KEYSIZE -#define cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Libressl_DEFAULT_KEYSIZE 256L -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Libressl - * Method: keysizeSupported - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Libressl_keysizeSupported - (JNIEnv *, jobject, jint); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Libressl - * Method: paramsSupported - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Libressl_paramsSupported - (JNIEnv *, jobject, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Libressl - * Method: generate - * Signature: (ILjava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Libressl_generate__ILjava_security_SecureRandom_2 - (JNIEnv *, jobject, jint, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Libressl - * Method: generate - * Signature: (Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)Ljava/security/KeyPair; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Libressl_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2 - (JNIEnv *, jobject, jobject, jobject); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Libressl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Libressl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Libressl -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Libressl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Libressl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Libressl -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Libressl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Libressl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Libressl -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Libressl - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Libressl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Libressl - * Method: generateSecret - * Signature: ([B[BLjava/security/spec/ECParameterSpec;Ljava/lang/String;)Ljavax/crypto/SecretKey; - */ -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Libressl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2 - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject, jstring); - -#ifdef __cplusplus -} -#endif -#endif -/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Libressl */ - -#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Libressl -#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Libressl -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Libressl - * Method: sign - * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B - */ -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Libressl_sign - (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject); - -/* - * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Libressl - * Method: verify - * Signature: ([B[B[BLjava/security/spec/ECParameterSpec;)Z - */ -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Libressl_verify - (JNIEnv *, jobject, jbyteArray, jbyteArray, jbyteArray, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/nettle.c b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/nettle.c deleted file mode 100644 index e8d874a..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/nettle.c +++ /dev/null @@ -1,511 +0,0 @@ -#include "native.h" -#include <string.h> - -#include <nettle/version.h> -#include <nettle/ecc.h> -#include <nettle/ecc-curve.h> -#include <nettle/ecdsa.h> -#include <nettle/yarrow.h> -#include <nettle/dsa.h> -#include <gmp.h> -#include <fcntl.h> -#include <unistd.h> - -#include "c_utils.h" -#include "c_timing.h" - -static struct yarrow256_ctx yarrow; - - -static jclass provider_class; - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_createProvider(JNIEnv *env, jobject self) { - /* Create the custom provider. */ - jclass local_provider_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeProvider$Nettle"); - provider_class = (*env)->NewGlobalRef(env, local_provider_class); - - jmethodID init = (*env)->GetMethodID(env, local_provider_class, "<init>", "(Ljava/lang/String;DLjava/lang/String;)V"); - - jstring name = (*env)->NewStringUTF(env, "Nettle"); - - double version = NETTLE_VERSION_MAJOR + (double) NETTLE_VERSION_MINOR / 10; - return (*env)->NewObject(env, provider_class, init, name, version, name); - -} - -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Nettle_setup(JNIEnv *env, jobject self) { - - INIT_PROVIDER(env, provider_class); - ADD_KPG(env, self, "EC", "Nettle"); - ADD_KA(env, self, "ECDH", "NettleECDH"); - ADD_SIG(env, self, "NONEwithECDSA", "NettleECDSAwithNONE"); - - init_classes(env, "Nettle"); - - yarrow256_init(&yarrow, 0, NULL); - uint8_t file = open("/dev/random", O_RDONLY); - yarrow256_seed(&yarrow, YARROW256_SEED_FILE_SIZE, &file); - close(file); - -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_getCurves(JNIEnv *env, jobject self) { - jclass hash_set_class = (*env)->FindClass(env, "java/util/TreeSet"); - - jmethodID hash_set_ctr = (*env)->GetMethodID(env, hash_set_class, "<init>", "()V"); - jmethodID hash_set_add = (*env)->GetMethodID(env, hash_set_class, "add", "(Ljava/lang/Object;)Z"); - - jobject result = (*env)->NewObject(env, hash_set_class, hash_set_ctr); - char *curve_names[] = {"secp192r1", "secp224r1", "secp256r1", "secp384r1", "secp521r1"}; - for (int i = 0; i < 5; i++) { - jstring curve_name = (*env)->NewStringUTF(env, curve_names[i]); - (*env)->CallBooleanMethod(env, result, hash_set_add, curve_name); - } - - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Nettle_keysizeSupported(JNIEnv *env, jobject self, jint keysize) { - int supported[] = {192, 224, 256, 384, 521}; - for (int i = 0; i < 5; i++) { - if (keysize == supported[i]) { - return JNI_TRUE; - } - } - return JNI_FALSE; -} - -static const struct ecc_curve* create_curve(JNIEnv *env, const char* curve_name) { - const struct ecc_curve* curve = NULL; - if (curve_name) { - if (strcasecmp("secp192r1", curve_name) == 0) { - curve = nettle_get_secp_192r1(); - } - if (strcasecmp("secp224r1", curve_name) == 0) { - curve = nettle_get_secp_224r1(); - } - if (strcasecmp("secp256r1", curve_name) == 0) { - curve = nettle_get_secp_256r1(); - } - if (strcasecmp("secp384r1", curve_name) == 0) { - curve = nettle_get_secp_384r1(); - } - if (strcasecmp("secp521r1", curve_name) == 0) { - curve = nettle_get_secp_521r1(); - } - return curve; - } - return NULL; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Nettle_paramsSupported(JNIEnv *env, jobject self, jobject params){ - if (params == NULL) { - return JNI_FALSE; - } - - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - return JNI_FALSE; - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char *utf_name = (*env)->GetStringUTFChars(env, name, NULL); - - char *curve_name[5] = {"secp192r1", "secp224r1", "secp256r1", "secp384r1", "secp521r1"}; - for (int i = 0; i < sizeof(curve_name); i++) { - if (strcasecmp(utf_name, curve_name[i]) == 0) { - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return JNI_TRUE; - } - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return JNI_FALSE; - } else { - return JNI_FALSE; - } - return JNI_FALSE; - -} - -static jobject generate_from_curve(JNIEnv *env, const struct ecc_curve* curve, jobject spec, int byte_size) { - - struct ecc_point pub; - struct ecc_scalar priv; - - ecc_point_init(&pub, curve); - ecc_scalar_init(&priv, curve); - native_timing_start(); - ecdsa_generate_keypair(&pub, &priv, (void *) &yarrow, (nettle_random_func *) yarrow256_random); - native_timing_stop(); - - mpz_t private_value; - mpz_init(private_value); - ecc_scalar_get(&priv, private_value); - size_t size = 0; - size_t xLen = 0; - size_t yLen = 0; - mpz_export(NULL, &size, 1, sizeof(unsigned char), 0, 0, private_value); - jbyteArray priv_bytes = (*env)->NewByteArray(env, byte_size); - jbyte *key_priv = (*env)->GetByteArrayElements(env, priv_bytes, NULL); - - int diff = byte_size - size; - memset(key_priv, 0x00, diff); - - mpz_export((unsigned char*) key_priv + diff, &size, 1, sizeof(unsigned char), 0, 0, private_value); - (*env)->ReleaseByteArrayElements(env, priv_bytes, key_priv, 0); - - - unsigned long key_len = 2*byte_size + 1; - jbyteArray pub_bytes = (*env)->NewByteArray(env, key_len); - mpz_t pub_value_x; - mpz_init(pub_value_x); - mpz_t pub_value_y; - mpz_init(pub_value_y); - ecc_point_get(&pub, pub_value_x, pub_value_y); - jbyte *key_pub = (*env)->GetByteArrayElements(env, pub_bytes, NULL); - key_pub[0] = 0x04; - - mpz_export(NULL, &xLen, 1, sizeof(unsigned char), 0, 0, pub_value_x); - diff = byte_size - xLen; - memset(key_pub + 1, 0x00, diff); - mpz_export((unsigned char*) key_pub + 1+diff, &xLen, 1, sizeof(unsigned char), 0, 0, pub_value_x); - - mpz_export(NULL, &yLen, 1, sizeof(unsigned char), 0, 0, pub_value_y); - diff = byte_size - yLen; - memset(key_pub + 1 + byte_size, 0x00, diff); - mpz_export((unsigned char*) key_pub + 1 + byte_size + diff, &yLen, 1, sizeof(unsigned char), 0, 0, pub_value_y); - (*env)->ReleaseByteArrayElements(env, pub_bytes, key_pub, 0); - - - jobject ec_pub_param_spec = (*env)->NewLocalRef(env, spec); - jmethodID ec_pub_init = (*env)->GetMethodID(env, pubkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject pubkey = (*env)->NewObject(env, pubkey_class, ec_pub_init, pub_bytes, ec_pub_param_spec); - - jobject ec_priv_param_spec = (*env)->NewLocalRef(env, spec); - jmethodID ec_priv_init = (*env)->GetMethodID(env, privkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject privkey = (*env)->NewObject(env, privkey_class, ec_priv_init, priv_bytes, ec_priv_param_spec); - - jmethodID keypair_init = (*env)->GetMethodID(env, keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V"); - mpz_clears(private_value, pub_value_x, pub_value_y, NULL); - ecc_point_clear(&pub); - ecc_scalar_clear(&priv); - return (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey); - - -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Nettle_generate__ILjava_security_SecureRandom_2(JNIEnv *env, jobject self, jint keysize, jobject random) { - throw_new(env, "java/lang/UnsupportedOperationException", "Not supported."); - return NULL; -} - - - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Nettle_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2Ljava_security_spec_AlgorithmParameterSpec_2(JNIEnv *env, jobject self, jobject params, jobject random, jobject spec) { - - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - return NULL; - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char* utf_name = (*env)->GetStringUTFChars(env, name, NULL); - const struct ecc_curve* curve; - int byte_size; - char *curve_name[5] = {"secp192r1", "secp224r1", "secp256r1", "secp384r1", "secp521r1"}; - int byte_sizes[] = {24, 28, 32, 48, 66}; - for (int i = 0; i < sizeof(curve_name); i++) { - if (strcasecmp(utf_name, curve_name[i]) == 0) { - curve = create_curve(env, curve_name[i]); - byte_size = byte_sizes[i]; - break; - } - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve for given bitsize not found."); - return NULL; - } - jobject result = generate_from_curve(env, curve, spec, byte_size); - return result; - } else { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found."); - return NULL; - } - return NULL; -} - -int barray_to_pubkey(JNIEnv *env, struct ecc_point* pubKey , jbyteArray pub) { - jsize pub_len = (*env)->GetArrayLength(env, pub); - jbyte *pub_data = (*env)->GetByteArrayElements(env, pub, NULL); - int pointLength = (pub_len - 1) / 2; - mpz_t x; - mpz_t y; - mpz_init(x); - mpz_init(y); - mpz_import(x, pointLength, 1, sizeof(unsigned char), 0, 0, pub_data+1); - mpz_import(y, pointLength, 1, sizeof(unsigned char), 0, 0, pub_data+1+pointLength); - (*env)->ReleaseByteArrayElements(env, pub, pub_data, JNI_ABORT); - ecc_point_set(pubKey, x, y); - return pointLength; -} - -int barray_to_privkey(JNIEnv *env, struct ecc_scalar* privKey, jbyteArray priv) { - jsize priv_len = (*env)->GetArrayLength(env, priv); - jbyte *priv_data = (*env)->GetByteArrayElements(env, priv, NULL); - mpz_t mp; - mpz_init(mp); - mpz_import(mp, priv_len, 1, sizeof(unsigned char), 0, 0, priv_data); - (*env)->ReleaseByteArrayElements(env, priv, priv_data, JNI_ABORT); - ecc_scalar_set(privKey, mp); - return priv_len; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Nettle_generateSecret___3B_3BLjava_security_spec_ECGenParameterSpec_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char* utf_name = (*env)->GetStringUTFChars(env, name, NULL); - const struct ecc_curve* curve; - char *curve_name[5] = {"secp192r1", "secp224r1", "secp256r1", "secp384r1", "secp521r1"}; - int byte_sizes[] = {24, 28, 32, 48, 66}; - int byte_size; - for (int i = 0; i < sizeof(curve_name); i++) { - if (strcasecmp(utf_name, curve_name[i]) == 0) { - curve = create_curve(env, curve_name[i]); - byte_size = byte_sizes[i]; - break; - } - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve for given bitsize not found."); - return NULL; - } - - struct ecc_scalar privScalar; - ecc_scalar_init(&privScalar, curve); - barray_to_privkey(env, &privScalar, privkey); - - struct ecc_point eccPubPoint; - ecc_point_init(&eccPubPoint, curve); - barray_to_pubkey(env, &eccPubPoint, pubkey); - - struct ecc_point resultPoint; - ecc_point_init(&resultPoint, curve); - - jbyteArray result = (*env)->NewByteArray(env, byte_size); - jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL); - - native_timing_start(); - ecc_point_mul(&resultPoint, &privScalar, &eccPubPoint); - native_timing_stop(); - - mpz_t x; - mpz_init(x); - ecc_point_get(&resultPoint, x, NULL); - - size_t size; - - mpz_export(NULL, &size, 1, sizeof(unsigned char), 0, 0, x); - int diff = byte_size - size; - memset(result_data, 0x00, diff); - mpz_export((unsigned char*) result_data + diff, &size, 1, sizeof(unsigned char), 0, 0, x); - (*env)->ReleaseByteArrayElements(env, result, result_data, 0); - ecc_scalar_clear(&privScalar); - ecc_point_clear(&eccPubPoint); - ecc_point_clear(&resultPoint); - mpz_clear(x); - return result; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Nettle_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm) { - throw_new(env, "java/lang/UnsupportedOperationException", "Not supported."); - return NULL; -} - -// credit to https://github.com/crocs-muni/ECTester/blob/master/src/cz/crcs/ectester/standalone/libs/jni/c_utils.c -size_t signature_to_der(struct dsa_signature* signature, unsigned char *result, int byte_size) { - size_t r_tmpSize; - size_t s_tmpSize; - size_t sequenceSize; - size_t sequenceSizeSize = 0; - size_t wholeSize; - - mpz_export(NULL, &r_tmpSize, 1, sizeof(unsigned char), 0, 0, signature->r); - mpz_export(NULL, &s_tmpSize, 1, sizeof(unsigned char), 0, 0, signature->s); - - unsigned char r_tmp[r_tmpSize]; - unsigned char s_tmp[s_tmpSize]; - mpz_export(r_tmp, &r_tmpSize, 1, sizeof(unsigned char), 0, 0, signature->r); - mpz_export(s_tmp, &s_tmpSize, 1, sizeof(unsigned char), 0, 0, signature->s); - - size_t rSize = r_tmpSize + (r_tmp[0] & 0x80 ? 1 : 0); - size_t sSize = s_tmpSize + (s_tmp[0] & 0x80 ? 1 : 0); - - sequenceSize = 2 + rSize + 2 + sSize; - - if (sequenceSize > 127) { - size_t s = sequenceSize; - do { - sequenceSizeSize++; - } while ((s = s >> 8)); - } - - wholeSize = sequenceSize + sequenceSizeSize + 2; - if (!result) { - return wholeSize; - } - - int index = 0; - result[index++] = 0x30; - if (sequenceSize < 128) { - result[index++] = sequenceSize; - } else { - result[index++] = sequenceSizeSize | 0x80; - for (size_t i = 0; i < sequenceSizeSize; i++) { - result[index++] = sequenceSize & (0xff << (8 * (sequenceSizeSize - i - 1))); - } - } - result[index++] = 0x02; - result[index++] = rSize; - if (r_tmp[0] & 0x80) { - result[index++] = 0x00; - } - memcpy(result + index, r_tmp, r_tmpSize); - index += r_tmpSize; - result[index++] = 0x02; - result[index++] = sSize; - if (s_tmp[0] & 0x80) { - result[index++] = 0x00; - } - memcpy(result + index, s_tmp, s_tmpSize); - return wholeSize; -} - -// credit to https://github.com/crocs-muni/ECTester/blob/master/src/cz/crcs/ectester/standalone/libs/jni/c_utils.cs -int der_to_signature(struct dsa_signature* signature, unsigned char* der) { - int index = 0; - size_t sequenceSize; - size_t sequenceSizeSize; - if (der[index++] != 0x30) { - return 0; - } - - if (!(der[index] & 0x80)) { - sequenceSize = der[index++]; - } else { - sequenceSizeSize = der[index++] & 0x7f; - while(sequenceSizeSize > 0) { - sequenceSizeSize--; - sequenceSize |= der[index++] << (sequenceSizeSize); - } - } - - if (der[index++] != 0x02) { - return 0; - } - - size_t rLength = der[index++]; - mpz_import(signature->r, rLength, 1, sizeof(unsigned char), 0, 0, der + index); - index += rLength; - if (der[index++] != 0x02) { - return 0; - } - size_t sLength = der[index++]; - mpz_import(signature->s, sLength, 1, sizeof(unsigned char), 0, 0, der + index); - return 1; - -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Nettle_sign(JNIEnv *env, jobject self, jbyteArray data, jbyteArray privkey, jobject params) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char* utf_name = (*env)->GetStringUTFChars(env, name, NULL); - const struct ecc_curve* curve; - int byte_size; - char *curve_name[5] = {"secp192r1", "secp224r1", "secp256r1", "secp384r1", "secp521r1"}; - int byte_sizes[] = {24, 28, 32, 48, 66}; - for (int i = 0; i < sizeof(curve_name); i++) { - if (strcasecmp(utf_name, curve_name[i]) == 0) { - curve = create_curve(env, curve_name[i]); - byte_size = byte_sizes[i] + 1; - break; - } - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve for given bitsize not found."); - return NULL; - } - struct ecc_scalar privScalar; - ecc_scalar_init(&privScalar, curve); - barray_to_privkey(env, &privScalar, privkey); - - jsize data_size = (*env)->GetArrayLength(env, data); - jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL); - - struct dsa_signature signature; - dsa_signature_init(&signature); - - native_timing_start(); - ecdsa_sign(&privScalar, (void *) &yarrow, (nettle_random_func *) yarrow256_random, data_size, (unsigned char*)data_data, &signature); - native_timing_stop(); - - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - - - jsize sig_len = signature_to_der(&signature, NULL, byte_size); - jbyteArray result = (*env)->NewByteArray(env, sig_len); - jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL); - signature_to_der(&signature, (unsigned char *)result_data, byte_size); - (*env)->ReleaseByteArrayElements(env, result, result_data, 0); - - ecc_scalar_clear(&privScalar); - dsa_signature_clear(&signature); - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Nettle_verify(JNIEnv *env, jobject self, jbyteArray signature, jbyteArray data, jbyteArray pubkey, jobject params) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char* utf_name = (*env)->GetStringUTFChars(env, name, NULL); - const struct ecc_curve* curve; - char *curve_name[5] = {"secp192r1", "secp224r1", "secp256r1", "secp384r1", "secp521r1"}; - for (int i = 0; i < sizeof(curve_name); i++) { - if (strcasecmp(utf_name, curve_name[i]) == 0) { - curve = create_curve(env, curve_name[i]); - break; - } - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve for given bitsize not found."); - return false; - } - - struct ecc_point eccPubPoint; - ecc_point_init(&eccPubPoint, curve); - barray_to_pubkey(env, &eccPubPoint, pubkey); - - jbyte *sig_data = (*env)->GetByteArrayElements(env, signature, NULL); - - struct dsa_signature eccSignature; - dsa_signature_init(&eccSignature); - - if (!der_to_signature(&eccSignature, (unsigned char*) sig_data)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Invalid DER encoding of the signature."); - return false; - } - - (*env)->ReleaseByteArrayElements(env, signature, sig_data, JNI_ABORT); - - jsize data_size = (*env)->GetArrayLength(env, data); - jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL); - - native_timing_start(); - int result = ecdsa_verify(&eccPubPoint, data_size, (unsigned char*)data_data, &eccSignature); - native_timing_stop(); - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - - ecc_point_clear(&eccPubPoint); - dsa_signature_clear(&eccSignature); - return (result == 1) ? JNI_TRUE : JNI_FALSE; -} diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/openssl.c b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/openssl.c deleted file mode 100644 index 1739420..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/openssl.c +++ /dev/null @@ -1,584 +0,0 @@ -#include "native.h" -#include <string.h> - -#include <openssl/conf.h> -#include <openssl/opensslv.h> -#include <openssl/objects.h> -#include <openssl/obj_mac.h> -#include <openssl/bn.h> -#include <openssl/evp.h> -#include <openssl/err.h> -#include <openssl/ec.h> -#include <openssl/ecdsa.h> - -#include "c_utils.h" -#include "c_timing.h" - - - -static jclass provider_class; - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_OpensslLib_createProvider(JNIEnv *env, jobject self) { - /* Create the custom provider. */ - jclass local_provider_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeProvider$Openssl"); - provider_class = (*env)->NewGlobalRef(env, local_provider_class); - - jmethodID init = (*env)->GetMethodID(env, local_provider_class, "<init>", "(Ljava/lang/String;DLjava/lang/String;)V"); - - jstring name = (*env)->NewStringUTF(env, OPENSSL_VERSION_TEXT); - long ver_hi = (OPENSSL_VERSION_NUMBER & 0xff000000L) >> 28; - long ver_mid = (OPENSSL_VERSION_NUMBER & 0xff0000L) >> 20; - long ver_low = (OPENSSL_VERSION_NUMBER & 0xff00L) >> 12; - double version = (double)ver_hi + ((double)ver_mid/10) + ((double)ver_low/100); - - return (*env)->NewObject(env, provider_class, init, name, version, name); -} - -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Openssl_setup(JNIEnv *env, jobject self) { - OPENSSL_no_config(); - ERR_load_crypto_strings(); - OpenSSL_add_all_algorithms(); - - INIT_PROVIDER(env, provider_class); - - ADD_KPG(env, self, "EC", "Openssl"); - ADD_KA(env, self, "ECDH", "OpensslECDH"); - ADD_SIG(env, self, "NONEwithECDSA", "OpensslECDSAwithNONE"); - - init_classes(env, "Openssl"); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_OpensslLib_getCurves(JNIEnv *env, jobject self) { - jclass hash_set_class = (*env)->FindClass(env, "java/util/TreeSet"); - - jmethodID hash_set_ctr = (*env)->GetMethodID(env, hash_set_class, "<init>", "()V"); - jmethodID hash_set_add = (*env)->GetMethodID(env, hash_set_class, "add", "(Ljava/lang/Object;)Z"); - - jobject result = (*env)->NewObject(env, hash_set_class, hash_set_ctr); - - size_t ncurves = EC_get_builtin_curves(NULL, 0); - EC_builtin_curve curves[ncurves]; - EC_get_builtin_curves(curves, ncurves); - - for (size_t i = 0; i < ncurves; ++i) { - jstring curve_name = (*env)->NewStringUTF(env, OBJ_nid2sn(curves[i].nid)); - (*env)->CallBooleanMethod(env, result, hash_set_add, curve_name); - } - - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Openssl_keysizeSupported(JNIEnv *env, jobject self, jint keysize) { - size_t ncurves = EC_get_builtin_curves(NULL, 0); - EC_builtin_curve curves[ncurves]; - EC_get_builtin_curves(curves, ncurves); - - for (size_t i = 0; i < ncurves; ++i) { - EC_GROUP *curve = EC_GROUP_new_by_curve_name(curves[i].nid); - if (EC_GROUP_get_degree(curve) == keysize) { - EC_GROUP_clear_free(curve); - return JNI_TRUE; - } - EC_GROUP_free(curve); - } - return JNI_FALSE; -} - -static jobject bignum_to_biginteger(JNIEnv *env, const BIGNUM *bn) { - jmethodID biginteger_init = (*env)->GetMethodID(env, biginteger_class, "<init>", "(I[B)V"); - int size = BN_num_bytes(bn); - jbyteArray bytes = (*env)->NewByteArray(env, size); - jbyte *data = (*env)->GetByteArrayElements(env, bytes, NULL); - BN_bn2bin(bn, (unsigned char *) data); - (*env)->ReleaseByteArrayElements(env, bytes, data, 0); - jobject result = (*env)->NewObject(env, biginteger_class, biginteger_init, 1, bytes); - return result; -} - -static BIGNUM *biginteger_to_bignum(JNIEnv *env, jobject bigint) { - jmethodID to_byte_array = (*env)->GetMethodID(env, biginteger_class, "toByteArray", "()[B"); - - jbyteArray byte_array = (jbyteArray) (*env)->CallObjectMethod(env, bigint, to_byte_array); - jsize byte_length = (*env)->GetArrayLength(env, byte_array); - jbyte *byte_data = (*env)->GetByteArrayElements(env, byte_array, NULL); - BIGNUM *result = BN_bin2bn((unsigned char *) byte_data, byte_length, NULL); - (*env)->ReleaseByteArrayElements(env, byte_array, byte_data, JNI_ABORT); - return result; -} - -static EC_GROUP *create_curve(JNIEnv *env, jobject params) { - jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject elliptic_curve = (*env)->CallObjectMethod(env, params, get_curve); - - jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field); - - jmethodID get_a = (*env)->GetMethodID(env, elliptic_curve_class, "getA", "()Ljava/math/BigInteger;"); - jobject a = (*env)->CallObjectMethod(env, elliptic_curve, get_a); - BIGNUM *a_bn = biginteger_to_bignum(env, a); - - jmethodID get_b = (*env)->GetMethodID(env, elliptic_curve_class, "getB", "()Ljava/math/BigInteger;"); - jobject b = (*env)->CallObjectMethod(env, elliptic_curve, get_b); - BIGNUM *b_bn = biginteger_to_bignum(env, b); - - jmethodID get_g = (*env)->GetMethodID(env, ec_parameter_spec_class, "getGenerator", "()Ljava/security/spec/ECPoint;"); - jobject g = (*env)->CallObjectMethod(env, params, get_g); - - jmethodID get_x = (*env)->GetMethodID(env, point_class, "getAffineX", "()Ljava/math/BigInteger;"); - jobject gx = (*env)->CallObjectMethod(env, g, get_x); - BIGNUM *gx_bn = biginteger_to_bignum(env, gx); - - jmethodID get_y = (*env)->GetMethodID(env, point_class, "getAffineY", "()Ljava/math/BigInteger;"); - jobject gy = (*env)->CallObjectMethod(env, g, get_y); - BIGNUM *gy_bn = biginteger_to_bignum(env, gy); - - EC_GROUP *result; - EC_POINT *g_point; - - if ((*env)->IsInstanceOf(env, field, fp_field_class)) { - jmethodID get_p = (*env)->GetMethodID(env, fp_field_class, "getP", "()Ljava/math/BigInteger;"); - jobject p = (*env)->CallObjectMethod(env, field, get_p); - - BIGNUM *p_bn = biginteger_to_bignum(env, p); - result = EC_GROUP_new_curve_GFp(p_bn, a_bn, b_bn, NULL); - BN_free(p_bn); - if (!result) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating EC_GROUP, EC_GROUP_new_curve_GFp."); - BN_free(a_bn); BN_free(b_bn); BN_free(gx_bn); BN_free(gy_bn); - return NULL; - } - - g_point = EC_POINT_new(result); - if(!EC_POINT_set_affine_coordinates_GFp(result, g_point, gx_bn, gy_bn, NULL)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating EC_GROUP, EC_POINT_set_affine_coordinates_GFp."); - BN_free(a_bn); BN_free(b_bn); BN_free(gx_bn); BN_free(gy_bn); EC_POINT_free(g_point); EC_GROUP_free(result); - return NULL; - } - } else if ((*env)->IsInstanceOf(env, field, f2m_field_class)) { - jmethodID get_reduction_poly = (*env)->GetMethodID(env, f2m_field_class, "getReductionPolynomial", "()Ljava/math/BigInteger;"); - jobject red_poly = (*env)->CallObjectMethod(env, field, get_reduction_poly); - - BIGNUM *p_bn = biginteger_to_bignum(env, red_poly); - result = EC_GROUP_new_curve_GF2m(p_bn, a_bn, b_bn, NULL); - BN_free(p_bn); - if (!result) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating EC_GROUP, EC_GROUP_new_curve_GF2m."); - BN_free(a_bn); BN_free(b_bn); BN_free(gx_bn); BN_free(gy_bn); - return NULL; - } - - g_point = EC_POINT_new(result); - if(!EC_POINT_set_affine_coordinates_GF2m(result, g_point, gx_bn, gy_bn, NULL)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating EC_GROUP, EC_POINT_set_affine_coordinates_GF2m."); - BN_free(a_bn); BN_free(b_bn); BN_free(gx_bn); BN_free(gy_bn); EC_POINT_free(g_point); EC_GROUP_free(result); - return NULL; - } - } else { - return NULL; - } - - BN_free(a_bn); - BN_free(b_bn); - - jmethodID get_n = (*env)->GetMethodID(env, ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;"); - jobject n = (*env)->CallObjectMethod(env, params, get_n); - BIGNUM *n_bn = biginteger_to_bignum(env, n); - - jmethodID get_h = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCofactor", "()I"); - jint h = (*env)->CallIntMethod(env, params, get_h); - BIGNUM *h_bn = BN_new(); - BN_set_word(h_bn, h); - - if (!EC_GROUP_set_generator(result, g_point, n_bn, h_bn)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating EC_GROUP, EC_GROUP_set_generator."); - BN_free(n_bn); BN_free(h_bn); BN_free(gx_bn); BN_free(gy_bn); EC_POINT_free(g_point); EC_GROUP_free(result); - return NULL; - } - - EC_POINT_free(g_point); - BN_free(gx_bn); - BN_free(gy_bn); - BN_free(n_bn); - BN_free(h_bn); - - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Openssl_paramsSupported(JNIEnv *env, jobject self, jobject params){ - if (params == NULL) { - return JNI_FALSE; - } - - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - EC_GROUP *curve = create_curve(env, params); - jboolean result = (EC_GROUP_check(curve, NULL) == 1) ? JNI_TRUE : JNI_FALSE; - EC_GROUP_free(curve); - return result; - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char *utf_name = (*env)->GetStringUTFChars(env, name, NULL); - size_t ncurves = EC_get_builtin_curves(NULL, 0); - EC_builtin_curve curves[ncurves]; - EC_get_builtin_curves(curves, ncurves); - for (size_t i = 0; i < ncurves; ++i) { - if (strcasecmp(utf_name, OBJ_nid2sn(curves[i].nid)) == 0) { - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return JNI_TRUE; - } - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return JNI_FALSE; - } else { - return JNI_FALSE; - } -} - -static jobject create_ec_param_spec(JNIEnv *env, const EC_GROUP *curve) { - int field_type = EC_METHOD_get_field_type(EC_GROUP_method_of(curve)); - BIGNUM *a; - BIGNUM *b; - - BIGNUM *gx; - BIGNUM *gy; - jobject field; - - a = BN_new(); - b = BN_new(); - - if (field_type == NID_X9_62_prime_field) { - BIGNUM *p = BN_new(); - if (!EC_GROUP_get_curve_GFp(curve, p, a, b, NULL)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_GROUP_get_curve_GFp."); - BN_free(p); BN_free(a); BN_free(b); - return NULL; - } - - jobject p_int = bignum_to_biginteger(env, p); - - jmethodID fp_field_init = (*env)->GetMethodID(env, fp_field_class, "<init>", "(Ljava/math/BigInteger;)V"); - field = (*env)->NewObject(env, fp_field_class, fp_field_init, p_int); - - BN_free(p); - - gx = BN_new(); - gy = BN_new(); - if (!EC_POINT_get_affine_coordinates_GFp(curve, EC_GROUP_get0_generator(curve), gx, gy, NULL)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_POINT_get_affine_coordinates_GFp."); - BN_free(a); BN_free(b); BN_free(gx); BN_free(gy); - return NULL; - } - - } else if (field_type == NID_X9_62_characteristic_two_field) { - if (!EC_GROUP_get_curve_GF2m(curve, NULL, a, b, NULL)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_GROUP_get_curve_GF2m."); - BN_free(a); BN_free(b); - return NULL; - } - - int basis_type = EC_GROUP_get_basis_type(curve); - jintArray ks; - jint *ks_data; - if (basis_type == NID_X9_62_tpBasis) { - ks = (*env)->NewIntArray(env, 1); - ks_data = (*env)->GetIntArrayElements(env, ks, NULL); - if (!EC_GROUP_get_trinomial_basis(curve, (unsigned int *) &ks_data[0])) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_GROUP_get_trinomial_basis."); - BN_free(a); BN_free(b); - (*env)->ReleaseIntArrayElements(env, ks, ks_data, JNI_ABORT); - return NULL; - } - } else if (basis_type == NID_X9_62_ppBasis) { - ks = (*env)->NewIntArray(env, 3); - ks_data = (*env)->GetIntArrayElements(env, ks, NULL); - if (!EC_GROUP_get_pentanomial_basis(curve, (unsigned int *) &ks_data[0], (unsigned int *) &ks_data[1], (unsigned int *) &ks_data[2])) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_GROUP_get_pentanomial_basis."); - BN_free(a); BN_free(b); - (*env)->ReleaseIntArrayElements(env, ks, ks_data, JNI_ABORT); - return NULL; - } - } else { - return NULL; - } - (*env)->ReleaseIntArrayElements(env, ks, ks_data, 0); - - jint m = EC_GROUP_get_degree(curve); - - jmethodID f2m_field_init = (*env)->GetMethodID(env, f2m_field_class, "<init>", "(I[I)V"); - field = (*env)->NewObject(env, f2m_field_class, f2m_field_init, m, ks); - - gx = BN_new(); - gy = BN_new(); - if (!EC_POINT_get_affine_coordinates_GF2m(curve, EC_GROUP_get0_generator(curve), gx, gy, NULL)) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_POINT_get_affine_coordinates_GF2m."); - BN_free(a); BN_free(b); BN_free(gx); BN_free(gy); - return NULL; - } - } else { - return NULL; - } - - jobject a_int = bignum_to_biginteger(env, a); - jobject b_int = bignum_to_biginteger(env, b); - - jmethodID elliptic_curve_init = (*env)->GetMethodID(env, elliptic_curve_class, "<init>", "(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject elliptic_curve = (*env)->NewObject(env, elliptic_curve_class, elliptic_curve_init, field, a_int, b_int); - - BN_free(a); - BN_free(b); - - jobject gx_int = bignum_to_biginteger(env, gx); - jobject gy_int = bignum_to_biginteger(env, gy); - - BN_free(gx); - BN_free(gy); - - jmethodID point_init = (*env)->GetMethodID(env, point_class, "<init>", "(Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject g = (*env)->NewObject(env, point_class, point_init, gx_int, gy_int); - - jobject order = bignum_to_biginteger(env, EC_GROUP_get0_order(curve)); - jint cofactor = BN_get_word(EC_GROUP_get0_cofactor(curve)); - - jmethodID ec_parameter_spec_init = (*env)->GetMethodID(env, ec_parameter_spec_class, "<init>", "(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V"); - return (*env)->NewObject(env, ec_parameter_spec_class, ec_parameter_spec_init, elliptic_curve, g, order, cofactor); -} - -static jobject generate_from_curve(JNIEnv *env, const EC_GROUP *curve) { - jint keysize = EC_GROUP_get_degree(curve); - unsigned long key_bytes = (keysize + 7) / 8; - - EC_KEY *key = EC_KEY_new(); - EC_KEY_set_group(key, curve); - - native_timing_start(); - int result = EC_KEY_generate_key(key); - native_timing_stop(); - - if (!result) { - throw_new(env, "java/security/GeneralSecurityException", "Error generating key, EC_KEY_generate_key."); - EC_KEY_free(key); - return NULL; - } - - jbyteArray priv_bytes = (*env)->NewByteArray(env, key_bytes); - jbyte *key_priv = (*env)->GetByteArrayElements(env, priv_bytes, NULL); - BN_bn2binpad(EC_KEY_get0_private_key(key), (unsigned char *) key_priv, key_bytes); - (*env)->ReleaseByteArrayElements(env, priv_bytes, key_priv, 0); - - unsigned long key_len = 2*key_bytes + 1; - jbyteArray pub_bytes = (*env)->NewByteArray(env, key_len); - jbyte *key_pub = (*env)->GetByteArrayElements(env, pub_bytes, NULL); - EC_POINT_point2oct(curve, EC_KEY_get0_public_key(key), POINT_CONVERSION_UNCOMPRESSED, (unsigned char *) key_pub, key_len, NULL); - (*env)->ReleaseByteArrayElements(env, pub_bytes, key_pub, 0); - - EC_KEY_free(key); - - jobject ec_param_spec = create_ec_param_spec(env, curve); - - jobject ec_pub_param_spec = (*env)->NewLocalRef(env, ec_param_spec); - jmethodID ec_pub_init = (*env)->GetMethodID(env, pubkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject pubkey = (*env)->NewObject(env, pubkey_class, ec_pub_init, pub_bytes, ec_pub_param_spec); - - jobject ec_priv_param_spec = (*env)->NewLocalRef(env, ec_param_spec); - jmethodID ec_priv_init = (*env)->GetMethodID(env, privkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject privkey = (*env)->NewObject(env, privkey_class, ec_priv_init, priv_bytes, ec_priv_param_spec); - - jmethodID keypair_init = (*env)->GetMethodID(env, keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V"); - return (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Openssl_generate__ILjava_security_SecureRandom_2(JNIEnv *env, jobject self, jint keysize, jobject random) { - size_t ncurves = EC_get_builtin_curves(NULL, 0); - EC_builtin_curve curves[ncurves]; - EC_get_builtin_curves(curves, ncurves); - - EC_GROUP *curve = NULL; - for (size_t i = 0; i < ncurves; ++i) { - curve = EC_GROUP_new_by_curve_name(curves[i].nid); - if (EC_GROUP_get_degree(curve) == keysize) { - break; - } - EC_GROUP_free(curve); - } - - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve for given bitsize not found."); - return NULL; - } - - jobject result = generate_from_curve(env, curve); - EC_GROUP_free(curve); - return result; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Openssl_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(JNIEnv *env, jobject self, jobject params, jobject random) { - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - EC_GROUP *curve = create_curve(env, params); - jobject result = generate_from_curve(env, curve); - EC_GROUP_free(curve); - return result; - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char* utf_name = (*env)->GetStringUTFChars(env, name, NULL); - size_t ncurves = EC_get_builtin_curves(NULL, 0); - EC_builtin_curve curves[ncurves]; - EC_get_builtin_curves(curves, ncurves); - EC_GROUP *curve = NULL; - for (size_t i = 0; i < ncurves; ++i) { - if (strcasecmp(utf_name, OBJ_nid2sn(curves[i].nid)) == 0) { - curve = EC_GROUP_new_by_curve_name(curves[i].nid); - break; - } - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve for given bitsize not found."); - return NULL; - } - jobject result = generate_from_curve(env, curve); - EC_GROUP_free(curve); - return result; - } else { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found."); - return NULL; - } -} - -EC_KEY *barray_to_pubkey(JNIEnv *env, const EC_GROUP *curve, jbyteArray pub) { - EC_KEY *result = EC_KEY_new(); - EC_KEY_set_group(result, curve); - jsize pub_len = (*env)->GetArrayLength(env, pub); - jbyte *pub_data = (*env)->GetByteArrayElements(env, pub, NULL); - EC_POINT *pub_point = EC_POINT_new(curve); - EC_POINT_oct2point(curve, pub_point, (unsigned char *) pub_data, pub_len, NULL); - (*env)->ReleaseByteArrayElements(env, pub, pub_data, JNI_ABORT); - EC_KEY_set_public_key(result, pub_point); - EC_POINT_free(pub_point); - return result; -} - -EC_KEY *barray_to_privkey(JNIEnv *env, const EC_GROUP *curve, jbyteArray priv) { - EC_KEY *result = EC_KEY_new(); - EC_KEY_set_group(result, curve); - jsize priv_len = (*env)->GetArrayLength(env, priv); - jbyte *priv_data = (*env)->GetByteArrayElements(env, priv, NULL); - BIGNUM *s = BN_bin2bn((unsigned char *) priv_data, priv_len, NULL); - (*env)->ReleaseByteArrayElements(env, priv, priv_data, JNI_ABORT); - EC_KEY_set_private_key(result, s); - BN_free(s); - return result; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Openssl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params) { - EC_GROUP *curve = create_curve(env, params); - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found."); - return NULL; - } - - EC_KEY *pub = barray_to_pubkey(env, curve, pubkey); - EC_KEY *priv = barray_to_privkey(env, curve, privkey); - - int field_size = EC_GROUP_get_degree(curve); - size_t secret_len = (field_size + 7)/8; - - //TODO: Do more KeyAgreements here, but will have to do the hash-fun manually, - // probably using the ECDH_KDF_X9_62 by wrapping it and dynamically choosing the EVP_MD. from the type string. - jbyteArray result = (*env)->NewByteArray(env, secret_len); - jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL); - - native_timing_start(); - int err = ECDH_compute_key(result_data, secret_len, EC_KEY_get0_public_key(pub), priv, NULL); - native_timing_stop(); - - if (err <= 0) { - throw_new(env, "java/security/GeneralSecurityException", "Error computing ECDH, ECDH_compute_key."); - EC_KEY_free(pub); EC_KEY_free(priv); EC_GROUP_free(curve); - (*env)->ReleaseByteArrayElements(env, result, result_data, JNI_ABORT); - return NULL; - } - (*env)->ReleaseByteArrayElements(env, result, result_data, 0); - - EC_KEY_free(pub); - EC_KEY_free(priv); - EC_GROUP_free(curve); - return result; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Openssl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm) { - throw_new(env, "java/lang/UnsupportedOperationException", "Not supported."); - return NULL; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Openssl_sign(JNIEnv *env, jobject self, jbyteArray data, jbyteArray privkey, jobject params) { - EC_GROUP *curve = create_curve(env, params); - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found."); - return NULL; - } - - EC_KEY *priv = barray_to_privkey(env, curve, privkey); - - jsize data_size = (*env)->GetArrayLength(env, data); - jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL); - // TODO: Do more Signatures here, maybe use the EVP interface to get to the hashes easier and not hash manually? - - native_timing_start(); - ECDSA_SIG *signature = ECDSA_do_sign((unsigned char *) data_data, data_size, priv); - native_timing_stop(); - - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - if (!signature) { - throw_new(env, "java/security/GeneralSecurityException", "Error signing, ECDSA_do_sign."); - EC_KEY_free(priv); EC_GROUP_free(curve); - return NULL; - } - - jsize sig_len = i2d_ECDSA_SIG(signature, NULL); - jbyteArray result = (*env)->NewByteArray(env, sig_len); - jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL); - jbyte *result_data_ptr = result_data; - i2d_ECDSA_SIG(signature, (unsigned char **)&result_data_ptr); - (*env)->ReleaseByteArrayElements(env, result, result_data, 0); - - ECDSA_SIG_free(signature); - EC_KEY_free(priv); - EC_GROUP_free(curve); - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Openssl_verify(JNIEnv *env, jobject self, jbyteArray signature, jbyteArray data, jbyteArray pubkey, jobject params) { - EC_GROUP *curve = create_curve(env, params); - if (!curve) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found."); - return JNI_FALSE; - } - - EC_KEY *pub = barray_to_pubkey(env, curve, pubkey); - - jsize sig_len = (*env)->GetArrayLength(env, signature); - jbyte *sig_data = (*env)->GetByteArrayElements(env, signature, NULL); - jbyte *sig_data_ptr = sig_data; - ECDSA_SIG *sig_obj = d2i_ECDSA_SIG(NULL, (const unsigned char **)&sig_data_ptr, sig_len); - (*env)->ReleaseByteArrayElements(env, signature, sig_data, JNI_ABORT); - - jsize data_size = (*env)->GetArrayLength(env, data); - jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL); - - native_timing_start(); - int result = ECDSA_do_verify((unsigned char *) data_data, data_size, sig_obj, pub); - native_timing_stop(); - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - - if (result < 0) { - throw_new(env, "java/security/GeneralSecurityException", "Error verifying, ECDSA_do_verify."); - EC_KEY_free(pub); EC_GROUP_free(curve); ECDSA_SIG_free(sig_obj); - return JNI_FALSE; - } - - ECDSA_SIG_free(sig_obj); - 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/java/cz/crcs/ectester/standalone/libs/jni/tomcrypt.c b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/tomcrypt.c deleted file mode 100644 index 82592f1..0000000 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/tomcrypt.c +++ /dev/null @@ -1,465 +0,0 @@ -#include "native.h" -#include <stdio.h> -#include <string.h> -#include <tomcrypt.h> -#include "c_utils.h" -#include "c_timing.h" - -static prng_state ltc_prng; -static jclass provider_class; - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_TomcryptLib_createProvider(JNIEnv *env, jobject this) { - /* Create the custom provider. */ - jclass local_provider_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeProvider$TomCrypt"); - provider_class = (*env)->NewGlobalRef(env, local_provider_class); - - jmethodID init = (*env)->GetMethodID(env, local_provider_class, "<init>", "(Ljava/lang/String;DLjava/lang/String;)V"); - - jstring name = (*env)->NewStringUTF(env, "libtomcrypt " SCRYPT); - double version = strtod(SCRYPT, NULL); - - return (*env)->NewObject(env, provider_class, init, name, version, name); -} - -JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024TomCrypt_setup(JNIEnv *env, jobject this) { - /* Initialize libtommath as the math lib. */ - ltc_mp = ltm_desc; - - jmethodID provider_put = (*env)->GetMethodID(env, provider_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); - - jstring ec = (*env)->NewStringUTF(env, "KeyPairGenerator.EC"); - jstring ec_value = (*env)->NewStringUTF(env, "cz.crcs.ectester.standalone.libs.jni.NativeKeyPairGeneratorSpi$TomCrypt"); - (*env)->CallObjectMethod(env, this, provider_put, ec, ec_value); - - jstring ecdh = (*env)->NewStringUTF(env, "KeyAgreement.ECDH"); - jstring ecdh_value = (*env)->NewStringUTF(env, "cz.crcs.ectester.standalone.libs.jni.NativeKeyAgreementSpi$TomCrypt"); - (*env)->CallObjectMethod(env, this, provider_put, ecdh, ecdh_value); - - jstring ecdsa = (*env)->NewStringUTF(env, "Signature.NONEwithECDSA"); - jstring ecdsa_value = (*env)->NewStringUTF(env, "cz.crcs.ectester.standalone.libs.jni.NativeSignatureSpi$TomCryptRaw"); - (*env)->CallObjectMethod(env, this, provider_put, ecdsa, ecdsa_value); - - int err; - /* register yarrow */ - if (register_prng(&yarrow_desc) == -1) { - fprintf(stderr, "Error registering Yarrow\n"); - return; - } - /* setup the PRNG */ - if ((err = rng_make_prng(128, find_prng("yarrow"), <c_prng, NULL)) != CRYPT_OK) { - fprintf(stderr, "Error setting up PRNG, %s\n", error_to_string(err)); - } - - init_classes(env, "TomCrypt"); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_TomcryptLib_getCurves(JNIEnv *env, jobject this) { - jclass hash_set_class = (*env)->FindClass(env, "java/util/TreeSet"); - - jmethodID hash_set_ctr = (*env)->GetMethodID(env, hash_set_class, "<init>", "()V"); - jmethodID hash_set_add = (*env)->GetMethodID(env, hash_set_class, "add", "(Ljava/lang/Object;)Z"); - - jobject result = (*env)->NewObject(env, hash_set_class, hash_set_ctr); - const ltc_ecc_set_type * curve = ltc_ecc_sets; - while (curve->size != 0) { - jstring curve_name = (*env)->NewStringUTF(env, curve->name); - (*env)->CallBooleanMethod(env, result, hash_set_add, curve_name); - curve++; - } - - return result; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024TomCrypt_keysizeSupported(JNIEnv *env, jobject this, jint keysize){ - int key_bytes = (keysize + 7) / 8; - const ltc_ecc_set_type * curve = ltc_ecc_sets; - while (curve->size != 0) { - if (curve->size == key_bytes) { - return JNI_TRUE; - } - curve++; - } - - return JNI_FALSE; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024TomCrypt_paramsSupported(JNIEnv *env, jobject this, jobject params){ - if (params == NULL) { - return JNI_FALSE; - } - - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject curve = (*env)->CallObjectMethod(env, params, get_curve); - - jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = (*env)->CallObjectMethod(env, curve, get_field); - - if ((*env)->IsInstanceOf(env, field, fp_field_class)) { - jmethodID get_p = (*env)->GetMethodID(env, fp_field_class, "getP", "()Ljava/math/BigInteger;"); - jobject p = (*env)->CallObjectMethod(env, field, get_p); - - jmethodID get_a = (*env)->GetMethodID(env, elliptic_curve_class, "getA", "()Ljava/math/BigInteger;"); - jobject a = (*env)->CallObjectMethod(env, curve, get_a); - - jmethodID biginteger_valueof = (*env)->GetStaticMethodID(env, biginteger_class, "valueOf", "(J)Ljava/math/BigInteger;"); - jobject three = (*env)->CallStaticObjectMethod(env, biginteger_class, biginteger_valueof, (jlong)3); - - jmethodID biginteger_add = (*env)->GetMethodID(env, biginteger_class, "add", "(Ljava/math/BigInteger;)Ljava/math/BigInteger;"); - jobject a_3 = (*env)->CallObjectMethod(env, a, biginteger_add, three); - - jmethodID biginteger_equals = (*env)->GetMethodID(env, biginteger_class, "equals", "(Ljava/lang/Object;)Z"); - jboolean eq = (*env)->CallBooleanMethod(env, p, biginteger_equals, a_3); - return eq; - } else if ((*env)->IsInstanceOf(env, field, f2m_field_class)) { - return JNI_FALSE; - } else { - return JNI_FALSE; - } - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char *utf_name = (*env)->GetStringUTFChars(env, name, NULL); - const ltc_ecc_set_type * curve = ltc_ecc_sets; - while (curve->size != 0) { - if (strcasecmp(utf_name, curve->name) == 0) { - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return JNI_TRUE; - } - curve++; - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - return JNI_FALSE; - } else { - return JNI_FALSE; - } -} - -static jobject create_ec_param_spec(JNIEnv *env, const ltc_ecc_set_type *curve) { - jstring p_string = (*env)->NewStringUTF(env, curve->prime); - jmethodID biginteger_init = (*env)->GetMethodID(env, biginteger_class, "<init>", "(Ljava/lang/String;I)V"); - jobject p = (*env)->NewObject(env, biginteger_class, biginteger_init, p_string, (jint) 16); - - jmethodID fp_field_init = (*env)->GetMethodID(env, fp_field_class, "<init>", "(Ljava/math/BigInteger;)V"); - jobject field = (*env)->NewObject(env, fp_field_class, fp_field_init, p); - - jmethodID biginteger_subtract = (*env)->GetMethodID(env, biginteger_class, "subtract", "(Ljava/math/BigInteger;)Ljava/math/BigInteger;"); - jmethodID biginteger_valueof = (*env)->GetStaticMethodID(env, biginteger_class, "valueOf", "(J)Ljava/math/BigInteger;"); - jobject three = (*env)->CallStaticObjectMethod(env, biginteger_class, biginteger_valueof, (jlong) 3); - jobject a = (*env)->CallObjectMethod(env, p, biginteger_subtract, three); - - jstring b_string = (*env)->NewStringUTF(env, curve->B); - jobject b = (*env)->NewObject(env, biginteger_class, biginteger_init, b_string, (jint) 16); - - jmethodID elliptic_curve_init = (*env)->GetMethodID(env, elliptic_curve_class, "<init>", "(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject elliptic_curve = (*env)->NewObject(env, elliptic_curve_class, elliptic_curve_init, field, a, b); - - jstring gx_string = (*env)->NewStringUTF(env, curve->Gx); - jstring gy_string = (*env)->NewStringUTF(env, curve->Gy); - jobject gx = (*env)->NewObject(env, biginteger_class, biginteger_init, gx_string, (jint) 16); - jobject gy = (*env)->NewObject(env, biginteger_class, biginteger_init, gy_string, (jint) 16); - - jmethodID point_init = (*env)->GetMethodID(env, point_class, "<init>", "(Ljava/math/BigInteger;Ljava/math/BigInteger;)V"); - jobject g = (*env)->NewObject(env, point_class, point_init, gx, gy); - - jstring n_string = (*env)->NewStringUTF(env, curve->order); - jobject n = (*env)->NewObject(env, biginteger_class, biginteger_init, n_string, (jint) 16); - - jmethodID ec_parameter_spec_init = (*env)->GetMethodID(env, ec_parameter_spec_class, "<init>", "(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V"); - return (*env)->NewObject(env, ec_parameter_spec_class, ec_parameter_spec_init, elliptic_curve, g, n, (jint) 1); -} - -static ltc_ecc_set_type* create_curve(JNIEnv *env, jobject params) { - jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;"); - jobject elliptic_curve = (*env)->CallObjectMethod(env, params, get_curve); - - jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;"); - jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field); - - jmethodID get_bits = (*env)->GetMethodID(env, fp_field_class, "getFieldSize", "()I"); - jint bits = (*env)->CallIntMethod(env, field, get_bits); - jint bytes = (bits + 7) / 8; - - jmethodID get_b = (*env)->GetMethodID(env, elliptic_curve_class, "getB", "()Ljava/math/BigInteger;"); - jobject b = (*env)->CallObjectMethod(env, elliptic_curve, get_b); - - jmethodID get_p = (*env)->GetMethodID(env, fp_field_class, "getP", "()Ljava/math/BigInteger;"); - jobject p = (*env)->CallObjectMethod(env, field, get_p); - - jmethodID get_g = (*env)->GetMethodID(env, ec_parameter_spec_class, "getGenerator", "()Ljava/security/spec/ECPoint;"); - jobject g = (*env)->CallObjectMethod(env, params, get_g); - - jmethodID get_x = (*env)->GetMethodID(env, point_class, "getAffineX", "()Ljava/math/BigInteger;"); - jobject gx = (*env)->CallObjectMethod(env, g, get_x); - - jmethodID get_y = (*env)->GetMethodID(env, point_class, "getAffineY", "()Ljava/math/BigInteger;"); - jobject gy = (*env)->CallObjectMethod(env, g, get_y); - - jmethodID get_n = (*env)->GetMethodID(env, ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;"); - jobject n = (*env)->CallObjectMethod(env, params, get_n); - jmethodID get_bitlength = (*env)->GetMethodID(env, biginteger_class, "bitLength", "()I"); - jint ord_bits = (*env)->CallIntMethod(env, n, get_bitlength); - jint ord_bytes = (ord_bits + 7) / 8; - - ltc_ecc_set_type *curve = calloc(sizeof(ltc_ecc_set_type), 1); - curve->size = bytes; - curve->name = ""; - curve->prime = biginteger_to_hex(env, p, bytes); - curve->B = biginteger_to_hex(env, b, bytes); - curve->order = biginteger_to_hex(env, n, ord_bytes); - curve->Gx = biginteger_to_hex(env, gx, bytes); - curve->Gy = biginteger_to_hex(env, gy, bytes); - - return curve; -} - -static void free_curve(ltc_ecc_set_type *curve) { - if (curve) { - free((void*)curve->prime); - free((void*)curve->B); - free((void*)curve->order); - free((void*)curve->Gx); - free((void*)curve->Gy); - free(curve); - } -} - -static jobject generate_from_curve(JNIEnv *env, const ltc_ecc_set_type *curve) { - ecc_key key; - - native_timing_start(); - int err = ecc_make_key_ex(<c_prng, find_prng("yarrow"), &key, curve); - native_timing_stop(); - - if (err != CRYPT_OK) { - throw_new(env, "java/security/GeneralSecurityException", error_to_string(err)); - return NULL; - } - unsigned long key_len = 2*curve->size + 1; - jbyteArray pub_bytes = (*env)->NewByteArray(env, key_len); - jbyte *key_pub = (*env)->GetByteArrayElements(env, pub_bytes, NULL); - ecc_ansi_x963_export(&key, (unsigned char *) key_pub, &key_len); - (*env)->ReleaseByteArrayElements(env, pub_bytes, key_pub, 0); - - jobject ec_param_spec = create_ec_param_spec(env, curve); - - jobject ec_pub_param_spec = (*env)->NewLocalRef(env, ec_param_spec); - jmethodID ec_pub_init = (*env)->GetMethodID(env, pubkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject pubkey = (*env)->NewObject(env, pubkey_class, ec_pub_init, pub_bytes, ec_pub_param_spec); - - jbyteArray priv_bytes = (*env)->NewByteArray(env, curve->size); - jbyte *key_priv = (*env)->GetByteArrayElements(env, priv_bytes, NULL); - ltc_mp.unsigned_write(key.k, (unsigned char *) key_priv); - (*env)->ReleaseByteArrayElements(env, priv_bytes, key_priv, 0); - - jobject ec_priv_param_spec = (*env)->NewLocalRef(env, ec_param_spec); - jmethodID ec_priv_init = (*env)->GetMethodID(env, privkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); - jobject privkey = (*env)->NewObject(env, privkey_class, ec_priv_init, priv_bytes, ec_priv_param_spec); - - jmethodID keypair_init = (*env)->GetMethodID(env, keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V"); - - ecc_free(&key); - return (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024TomCrypt_generate__ILjava_security_SecureRandom_2(JNIEnv *env, jobject this, jint keysize, jobject random){ - int key_bytes = (keysize + 7) / 8; - - const ltc_ecc_set_type *curve = ltc_ecc_sets; - while (curve->size != 0) { - if (curve->size == key_bytes) { - break; - } - curve++; - } - - if (curve->size == 0) { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve for given bitsize not found."); - return NULL; - } - - return generate_from_curve(env, curve); -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024TomCrypt_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(JNIEnv *env, jobject this, jobject params, jobject random){ - if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { - ltc_ecc_set_type *curve = create_curve(env, params); - jobject result = generate_from_curve(env, curve); - free_curve(curve); - return result; - } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) { - jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;"); - jstring name = (*env)->CallObjectMethod(env, params, get_name); - const char* utf_name = (*env)->GetStringUTFChars(env, name, NULL); - const ltc_ecc_set_type* curve = ltc_ecc_sets; - while (curve->size != 0) { - if (strcasecmp(utf_name, curve->name) == 0) { - break; - } - curve++; - } - (*env)->ReleaseStringUTFChars(env, name, utf_name); - - return generate_from_curve(env, curve); - } else { - throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found."); - return NULL; - } -} - -static jboolean privkey_from_bytes(JNIEnv *env, jbyteArray privkey, const ltc_ecc_set_type *curve, ecc_key *out) { - jsize priv_size = (*env)->GetArrayLength(env, privkey); - jbyte *priv_data = (*env)->GetByteArrayElements(env, privkey, NULL); - - if (curve->size != priv_size) { - throw_new(env, "java/lang/IllegalStateException", "Curve size does not match the private key size."); - (*env)->ReleaseByteArrayElements(env, privkey, priv_data, JNI_ABORT); - return JNI_FALSE; - } - - out->type = PK_PRIVATE; - out->idx = -1; - out->dp = curve; - ltc_mp.init(&out->k); - ltc_mp.unsigned_read(out->k, (unsigned char *) priv_data, (unsigned long) curve->size); - - (*env)->ReleaseByteArrayElements(env, privkey, priv_data, JNI_ABORT); - return JNI_TRUE; -} - -static jboolean pubkey_from_bytes(JNIEnv *env, jbyteArray pubkey, const ltc_ecc_set_type *curve, ecc_key *out) { - jsize pub_size = (*env)->GetArrayLength(env, pubkey); - jbyte *pub_data = (*env)->GetByteArrayElements(env, pubkey, NULL); - - if (curve->size != (pub_size - 1) / 2) { - throw_new(env, "java/lang/IllegalStateException", "Curve size does not match the public key size."); - (*env)->ReleaseByteArrayElements(env, pubkey, pub_data, JNI_ABORT); - return JNI_FALSE; - } - - out->type = PK_PUBLIC; - out->idx = -1; - out->dp = curve; - ltc_init_multi(&out->pubkey.x, &out->pubkey.y, &out->pubkey.z, NULL); - ltc_mp.set_int(out->pubkey.z, 1); - ltc_mp.unsigned_read(out->pubkey.x, (unsigned char *) pub_data + 1, (unsigned long) curve->size); - ltc_mp.unsigned_read(out->pubkey.y, (unsigned char *) pub_data + 1 + curve->size, (unsigned long) curve->size); - - (*env)->ReleaseByteArrayElements(env, pubkey, pub_data, JNI_ABORT); - - return JNI_TRUE; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024TomCrypt_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject this, jbyteArray pubkey, jbyteArray privkey, jobject params){ - ltc_ecc_set_type *curve = create_curve(env, params); - - ecc_key pub; - if (!pubkey_from_bytes(env, pubkey, curve, &pub)) { - free_curve(curve); - return NULL; - } - - ecc_key priv; - if (!privkey_from_bytes(env, privkey, curve, &priv)) { - free_curve(curve); - return NULL; - } - - unsigned char result[curve->size]; - unsigned long output_len = curve->size; - - native_timing_start(); - int err = ecc_shared_secret(&priv, &pub, result, &output_len); - native_timing_stop(); - - if (err != CRYPT_OK) { - throw_new(env, "java/security/GeneralSecurityException", error_to_string(err)); - free_curve(curve); - return NULL; - } - - jbyteArray output = (*env)->NewByteArray(env, curve->size); - jbyte *output_data = (*env)->GetByteArrayElements(env, output, NULL); - memcpy(output_data, result, curve->size); - (*env)->ReleaseByteArrayElements(env, output, output_data, 0); - - ltc_cleanup_multi(&pub.pubkey.x, &pub.pubkey.y, &pub.pubkey.z, &priv.k, NULL); - free_curve(curve); - return output; -} - -JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024TomCrypt_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2(JNIEnv *env, jobject this, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm) { - throw_new(env, "java/lang/UnsupportedOperationException", "Not supported."); - return NULL; -} - -JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024TomCryptRaw_sign(JNIEnv *env, jobject this, jbyteArray data, jbyteArray privkey, jobject params) { - ltc_ecc_set_type *curve = create_curve(env, params); - - ecc_key priv; - if (!privkey_from_bytes(env, privkey, curve, &priv)) { - free_curve(curve); - return NULL; - } - - jsize data_size = (*env)->GetArrayLength(env, data); - jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL); - - unsigned char result[curve->size*4]; - unsigned long output_len = curve->size*4; - - native_timing_start(); - int err = ecc_sign_hash((unsigned char *) data_data, data_size, result, &output_len, <c_prng, find_prng("yarrow"), &priv); - native_timing_stop(); - - if (err != CRYPT_OK) { - throw_new(env, "java/security/GeneralSecurityException", error_to_string(err)); - free_curve(curve); - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - return NULL; - } - - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - - jbyteArray output = (*env)->NewByteArray(env, output_len); - jbyte *output_data = (*env)->GetByteArrayElements(env, output, NULL); - memcpy(output_data, result, output_len); - (*env)->ReleaseByteArrayElements(env, output, output_data, 0); - - free_curve(curve); - return output; -} - -JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024TomCryptRaw_verify(JNIEnv *env, jobject this, jbyteArray signature, jbyteArray data, jbyteArray pubkey, jobject params) { - ltc_ecc_set_type *curve = create_curve(env, params); - - ecc_key pub; - if (!pubkey_from_bytes(env, pubkey, curve, &pub)) { - free_curve(curve); - return JNI_FALSE; - } - - jsize data_size = (*env)->GetArrayLength(env, data); - jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL); - - jsize sig_size = (*env)->GetArrayLength(env, signature); - jbyte *sig_data = (*env)->GetByteArrayElements(env, signature, NULL); - - int result; - native_timing_start(); - int err = ecc_verify_hash((unsigned char *) sig_data, sig_size, (unsigned char *) data_data, data_size, &result, &pub); - native_timing_stop(); - - if (err != CRYPT_OK) { - throw_new(env, "java/security/GeneralSecurityException", error_to_string(err)); - free_curve(curve); - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - (*env)->ReleaseByteArrayElements(env, signature, sig_data, JNI_ABORT); - return JNI_FALSE; - } - - (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); - (*env)->ReleaseByteArrayElements(env, signature, sig_data, JNI_ABORT); - free_curve(curve); - return result; -}
\ No newline at end of file diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneWrongSuite.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneWrongSuite.java index c061da6..a457a33 100644 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneWrongSuite.java +++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneWrongSuite.java @@ -252,7 +252,7 @@ public class StandaloneWrongSuite extends StandaloneTestSuite { */ curveMap = EC_Store.getInstance().getObjects(EC_Curve.class, "secg"); curves = curveMap.entrySet().stream().filter((e) -> e.getKey().endsWith("r1") && - e.getValue().getField() == javacard.security.KeyPair.ALG_EC_F2M).map(Map.Entry::getValue).collect(Collectors.toList()); + e.getValue().getField() == EC_Consts.ALG_EC_F2M).map(Map.Entry::getValue).collect(Collectors.toList()); for (EC_Curve curve : curves) { short bits = curve.getBits(); byte[][] coeffBytes; |
