aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2024-05-07 10:47:02 +0200
committerJ08nY2024-05-07 10:47:02 +0200
commitb76b401cf1131cb19764dd6cc88c104b85fb8f1a (patch)
tree6e323527582ad4f3de385cfbb7f9bd2b0f1ab592
parentf8ca335dc6b5c42cd124fca1704c715771d8128c (diff)
downloadECTester-b76b401cf1131cb19764dd6cc88c104b85fb8f1a.tar.gz
ECTester-b76b401cf1131cb19764dd6cc88c104b85fb8f1a.tar.zst
ECTester-b76b401cf1131cb19764dd6cc88c104b85fb8f1a.zip
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_signals.h17
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp79
-rw-r--r--standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java8
3 files changed, 63 insertions, 41 deletions
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_signals.h b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_signals.h
index 4420a4d..466628a 100644
--- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_signals.h
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_signals.h
@@ -40,6 +40,22 @@ jobject get_siginfo(JNIEnv *env);
#define SIG_TRY(timeout) init_signals(get_jmpbuf(), timeout); \
if (!sigsetjmp(*get_jmpbuf(), 1))
#define SIG_CATCH() deinit_signals();
+#define SIG_DEINIT() deinit_signals();
+#ifdef __cplusplus
+#define SIG_HANDLE(env) do { \
+ jobject siginfo = get_siginfo(env); \
+ if (siginfo != NULL) { \
+ jclass sigexception_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/SignalException"); \
+ jmethodID new_sigexception = env->GetMethodID(sigexception_class, "<init>", "(Lcz/crcs/ectester/standalone/libs/jni/SigInfo;)V"); \
+ jobject sigexception = env->NewObject(sigexception_class, new_sigexception, siginfo); \
+ env->Throw((jthrowable) sigexception); \
+ } \
+ if (get_timedout()) { \
+ jclass timeoutexception_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/TimeoutException"); \
+ env->ThrowNew(timeoutexception_class, "Operation timed out."); \
+ } \
+} while (0)
+#else
#define SIG_HANDLE(env) do { \
jobject siginfo = get_siginfo(env); \
if (siginfo != NULL) { \
@@ -53,6 +69,7 @@ jobject get_siginfo(JNIEnv *env);
(*env)->ThrowNew(env, timeoutexception_class, "Operation timed out."); \
} \
} while (0)
+#endif
#define SIG_CATCH_HANDLE(env) SIG_CATCH(); \
SIG_HANDLE(env)
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp
index 6ec2060..e5deedb 100644
--- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp
@@ -71,6 +71,7 @@ using CryptoPP::Integer;
#include "cpp_utils.hpp"
#include "c_timing.h"
+#include "c_signals.h"
/*
* Crypto++:
@@ -504,14 +505,17 @@ template <class EC> jobject generate_from_group(JNIEnv *env, DL_GroupParameters_
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 nullptr;
- }
+ SIG_TRY(TIMEOUT) {
+ try {
+ native_timing_start();
+ ec_domain.GenerateKeyPair(rng, priv, pub);
+ native_timing_stop();
+ } catch (Exception & ex) {
+ SIG_DEINIT();
+ throw_new(env, "java/security/GeneralSecurityException", ex.what());
+ return nullptr;
+ }
+ } SIG_CATCH_HANDLE(env);
jbyteArray pub_bytearray = env->NewByteArray(pub.SizeInBytes());
jbyte *pub_bytes = env->GetByteArrayElements(pub_bytearray, nullptr);
@@ -587,31 +591,34 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKey
bool success;
std::unique_ptr<SecByteBlock> secret;
- try {
- 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);
+ SIG_TRY(TIMEOUT) {
+ try {
+ 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);
+ ECDH<EC2N>::Domain dh_agreement(*ec2n_group);
- secret = std::make_unique<SecByteBlock>(dh_agreement.AgreedValueLength());
- native_timing_start();
- success = dh_agreement.Agree(*secret, private_key, public_key);
- native_timing_stop();
+ secret = std::make_unique<SecByteBlock>(dh_agreement.AgreedValueLength());
+ native_timing_start();
+ success = dh_agreement.Agree(*secret, private_key, public_key);
+ native_timing_stop();
- } else {
- ECDH<ECP>::Domain dh_agreement(*ecp_group);
+ } else {
+ ECDH<ECP>::Domain dh_agreement(*ecp_group);
- secret = std::make_unique<SecByteBlock>(dh_agreement.AgreedValueLength());
- native_timing_start();
- success = dh_agreement.Agree(*secret, private_key, public_key);
- native_timing_stop();
+ 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) {
+ SIG_DEINIT();
+ throw_new(env, "java/security/GeneralSecurityException", ex.what());
+ return nullptr;
}
- } catch (Exception & ex) {
- throw_new(env, "java/security/GeneralSecurityException", ex.what());
- return nullptr;
- }
+ } SIG_CATCH_HANDLE(env);
if (!success) {
throw_new(env, "java/security/GeneralSecurityException", "Agreement was unsuccessful.");
@@ -642,9 +649,12 @@ jbyteArray sign_message(JNIEnv *env, DL_GroupParameters_EC<EC> group, jbyteArray
jsize data_length = env->GetArrayLength(data);
jbyte *data_bytes = env->GetByteArrayElements(data, nullptr);
- native_timing_start();
- size_t len = signer.SignMessage(rng, (byte *)data_bytes, data_length, (byte *)signature.c_str());
- native_timing_stop();
+ size_t len;
+ SIG_TRY(TIMEOUT) {
+ native_timing_start();
+ len = signer.SignMessage(rng, (byte *)data_bytes, data_length, (byte *)signature.c_str());
+ native_timing_stop();
+ } SIG_CATCH_HANDLE(env);
env->ReleaseByteArrayElements(data, data_bytes, JNI_ABORT);
signature.resize(len);
@@ -740,9 +750,12 @@ jboolean verify_message(JNIEnv *env, DL_GroupParameters_EC<EC> group, jbyteArray
jsize data_length = env->GetArrayLength(data);
jbyte *data_bytes = env->GetByteArrayElements(data, nullptr);
- native_timing_start();
- bool result = verifier.VerifyMessage((byte *)data_bytes, data_length, sig, sig_len);
- native_timing_stop();
+ bool result;
+ SIG_TRY(TIMEOUT) {
+ native_timing_start();
+ result = verifier.VerifyMessage((byte *)data_bytes, data_length, sig, sig_len);
+ native_timing_stop();
+ } SIG_CATCH_HANDLE(env);
env->ReleaseByteArrayElements(data, data_bytes, JNI_ABORT);
return result;
diff --git a/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java b/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java
index 7ff2826..8802bb4 100644
--- a/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java
+++ b/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java
@@ -162,7 +162,6 @@ public class AppTests {
@ParameterizedTest
@MethodSource("libs")
- @Timeout(20)
public void miscSuite(String libName) {
String[] args = buildCLIArgs(libName, "miscellaneous", "-q");
if (libName.equals("Botan") || libName.equals("Crypto++")) {
@@ -173,7 +172,6 @@ public class AppTests {
@ParameterizedTest
@MethodSource("libs")
- @Timeout(20)
public void twistSuite(String libName) {
// TODO: "Nettle" is very broken here for a weird reason.
assumeFalse(libName.equals("Nettle"));
@@ -187,7 +185,6 @@ public class AppTests {
@ParameterizedTest
@MethodSource("libs")
- @Timeout(20)
public void degenerateSuite(String libName) {
// TODO: "Nettle" is very broken here for a weird reason.
assumeFalse(libName.equals("Nettle"));
@@ -201,7 +198,6 @@ public class AppTests {
@ParameterizedTest
@MethodSource("libs")
- @Timeout(20)
public void edgeCasesSuite(String libName) {
// TODO: Crypto++ and tomcrypt is broken here.
assumeFalse(libName.equals("Crypto++") || libName.equals("tomcrypt"));
@@ -215,7 +211,6 @@ public class AppTests {
@ParameterizedTest
@MethodSource("libs")
- @Timeout(20)
// TODO: This breaks the tests because the libs do all sorts of weird stuff here.
@Disabled
public void compositeSuite(String libName) {
@@ -231,7 +226,6 @@ public class AppTests {
@ParameterizedTest
@MethodSource("libs")
- @Timeout(20)
public void cofactorSuite(String libName) {
String[] args = buildCLIArgs(libName, "cofactor", "-q");
if (libName.equals("Botan") || libName.equals("Crypto++")) {
@@ -242,7 +236,6 @@ public class AppTests {
@ParameterizedTest
@MethodSource("libs")
- @Timeout(20)
// TODO: This breaks the tests because the libs do all sorts of weird stuff here.
@Disabled
public void wrongSuite(String libName) {
@@ -258,7 +251,6 @@ public class AppTests {
@ParameterizedTest
@MethodSource("libs")
- @Timeout(20)
public void invalidSuite(String libName) {
// TODO: "Nettle" is very broken here for a weird reason.
assumeFalse(libName.equals("Nettle"));