aboutsummaryrefslogtreecommitdiff
path: root/standalone/src/main/java
diff options
context:
space:
mode:
authorJ08nY2024-03-23 13:01:03 +0100
committerJ08nY2024-03-25 14:57:34 +0100
commitc01f16cbacb45682547e4712bdae854c56604e61 (patch)
tree5bfe030c2b6333dde0ee34b444d975d02bbc5659 /standalone/src/main/java
parent73af477a8774e1ede5dd8de6491eb353dc0b12bd (diff)
downloadECTester-c01f16cbacb45682547e4712bdae854c56604e61.tar.gz
ECTester-c01f16cbacb45682547e4712bdae854c56604e61.tar.zst
ECTester-c01f16cbacb45682547e4712bdae854c56604e61.zip
Fix applet building.
Diffstat (limited to 'standalone/src/main/java')
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/.clang-format90
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/.gitignore8
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/Makefile217
-rwxr-xr-xstandalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/Makefile.bat163
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/boringssl.c516
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/botan.cpp528
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/c_timing.c254
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/c_timing.h44
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/c_utils.c252
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/c_utils.h68
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/cpp_utils.cpp115
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/cpp_utils.hpp50
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp767
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/gcrypt.c623
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/ippcp.c698
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/libressl.c609
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/matrixssl.c397
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/mbedtls.c544
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/mscng.c1273
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/native.h2044
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/nettle.c511
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/openssl.c584
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/tomcrypt.c465
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneWrongSuite.java2
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, &paramLength);
-
- // 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, &paramLength);
-
- // 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, &paramList, 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, &paramList, 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"), &ltc_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(&ltc_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, &ltc_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;