aboutsummaryrefslogtreecommitdiff
path: root/standalone/src
diff options
context:
space:
mode:
authorJ08nY2024-08-07 20:34:48 +0200
committerJ08nY2024-08-07 20:34:48 +0200
commit50c576e0f28eac393985073d7d91dac1262bf5da (patch)
treeac2dbacfbdb745587a17b28c9bb697633434ef19 /standalone/src
parent84858177fe6c2b9bdc6ea9785a92781ba1237e04 (diff)
downloadECTester-50c576e0f28eac393985073d7d91dac1262bf5da.tar.gz
ECTester-50c576e0f28eac393985073d7d91dac1262bf5da.tar.zst
ECTester-50c576e0f28eac393985073d7d91dac1262bf5da.zip
Diffstat (limited to 'standalone/src')
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/CryptoppLib.java6
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp27
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/native.h16
-rw-r--r--standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java4
4 files changed, 49 insertions, 4 deletions
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/CryptoppLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/CryptoppLib.java
index 66aa9ea..25f2de4 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/CryptoppLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/CryptoppLib.java
@@ -17,4 +17,10 @@ public class CryptoppLib extends NativeECLibrary {
@Override
public native Set<String> getCurves();
+
+ @Override
+ public native boolean supportsDeterministicPRNG();
+
+ @Override
+ public native boolean setupDeterministicPRNG(byte[] seed);
}
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 c4c74a6..1f82f8a 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
@@ -22,8 +22,12 @@ using CryptoPP::Exception;
using CryptoPP::byte;
#include "cryptopp/osrng.h"
+using CryptoPP::RandomNumberGenerator;
using CryptoPP::AutoSeededRandomPool;
+#include "cryptopp/mersenne.h"
+using CryptoPP::MT19937;
+
#include "cryptopp/sha.h"
using CryptoPP::SHA1;
using CryptoPP::SHA224;
@@ -89,7 +93,7 @@ using CryptoPP::Integer;
*/
static jclass provider_class;
-static AutoSeededRandomPool rng;
+static std::unique_ptr<RandomNumberGenerator> rng = std::make_unique<AutoSeededRandomPool>();
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_CryptoppLib_createProvider(JNIEnv *env, jobject self) {
@@ -187,6 +191,23 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_CryptoppLib_getC
return result;
}
+JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_CryptoppLib_supportsDeterministicPRNG(JNIEnv *env, jobject self) {
+ return JNI_TRUE;
+}
+
+JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_CryptoppLib_setupDeterministicPRNG(JNIEnv *env, jobject self, jbyteArray seed) {
+ jsize seed_length = env->GetArrayLength(seed);
+ if (seed_length > 4) {
+ fprintf(stderr, "Error setting seed, needs to be at most 4 bytes.\n");
+ return JNI_FALSE;
+ }
+ jbyte *seed_data = env->GetByteArrayElements(seed, nullptr);
+ uint32_t seed_int = seed_data[0] | seed_data[1] << 8 | seed_data[2] << 16 | seed_data[3] << 24;
+ rng.reset(new MT19937(seed_int));
+ env->ReleaseByteArrayElements(seed, seed_data, JNI_ABORT);
+ return JNI_TRUE;
+}
+
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 & ecp_oid : ecp_oids) {
@@ -517,7 +538,7 @@ template <class EC> jobject generate_from_group(JNIEnv *env, DL_GroupParameters_
SIG_TRY(TIMEOUT) {
try {
native_timing_start();
- ec_domain.GenerateKeyPair(rng, priv, pub);
+ ec_domain.GenerateKeyPair(*rng, priv, pub);
native_timing_stop();
} catch (Exception & ex) {
SIG_DEINIT();
@@ -661,7 +682,7 @@ jbyteArray sign_message(JNIEnv *env, DL_GroupParameters_EC<EC> group, jbyteArray
size_t len;
SIG_TRY(TIMEOUT) {
native_timing_start();
- len = signer.SignMessage(rng, (byte *)data_bytes, data_length, (byte *)signature.c_str());
+ 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);
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/native.h b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/native.h
index 287b450..91cada9 100644
--- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/native.h
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/native.h
@@ -468,6 +468,22 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_CryptoppLib_crea
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_CryptoppLib_getCurves
(JNIEnv *, jobject);
+/*
+ * Class: cz_crcs_ectester_standalone_libs_CryptoppLib
+ * Method: supportsDeterministicPRNG
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_CryptoppLib_supportsDeterministicPRNG
+ (JNIEnv *, jobject);
+
+/*
+ * Class: cz_crcs_ectester_standalone_libs_CryptoppLib
+ * Method: setupDeterministicPRNG
+ * Signature: ([B)Z
+ */
+JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_CryptoppLib_setupDeterministicPRNG
+ (JNIEnv *, jobject, jbyteArray);
+
#ifdef __cplusplus
}
#endif
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 8693b7b..6e8ec76 100644
--- a/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java
+++ b/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java
@@ -95,9 +95,11 @@ public class AppTests {
String[] args = new String[]{"generate", "-ps", "123412341234123412341234123412341234123412341234123412341234123412341234123412341234123412341234", "-n", "10", "-nc", "secg/secp256r1", libName};
switch (libName) {
case "Botan":
- case "Crypto++":
args = new String[]{"generate", "-ps", "123412341234123412341234123412341234123412341234123412341234123412341234123412341234123412341234", "-n", "10", "-nc", "secg/secp256r1", "-t", "ECDH", libName};
break;
+ case "Crypto++":
+ args = new String[]{"generate", "-ps", "12345678", "-n", "10", "-nc", "secg/secp256r1", "-t", "ECDH", libName};
+ break;
case "Nettle":
case "libgcrypt":
case "wolfCrypt":