aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2024-08-07 13:48:00 +0200
committerJ08nY2024-08-07 13:48:00 +0200
commitaa37d2b0853670cb6e13e41ae65cd74f6b64d021 (patch)
tree40d840bb3ca997f7850a098bc4e58b30b33313d1
parentc55d804aed8b63eb62c74018a720c4804c43c681 (diff)
downloadECTester-aa37d2b0853670cb6e13e41ae65cd74f6b64d021.tar.gz
ECTester-aa37d2b0853670cb6e13e41ae65cd74f6b64d021.tar.zst
ECTester-aa37d2b0853670cb6e13e41ae65cd74f6b64d021.zip
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java6
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/native.h15
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/nettle.c32
3 files changed, 49 insertions, 4 deletions
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java
index d4df414..aa90c38 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java
@@ -49,4 +49,10 @@ public class NettleLib extends NativeECLibrary {
}
throw new InvalidAlgorithmParameterException("Unknown curve.");
}
+
+ @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/native.h b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/native.h
index 49be801..b8b2af1 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
@@ -1932,6 +1932,21 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_create
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_getCurves
(JNIEnv *, jobject);
+/*
+* Class: cz_crcs_ectester_standalone_libs_NettleLib
+* Method: supportsDeterministicPRNG
+* Signature: ()Z
+*/
+JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_supportsDeterministicPRNG
+(JNIEnv *, jobject);
+
+/*
+* Class: cz_crcs_ectester_standalone_libs_NettleLib
+* Method: setupDeterministicPRNG
+* Signature: ([B)Z
+*/
+JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_setupDeterministicPRNG
+(JNIEnv *, jobject, jbyteArray);
#ifdef __cplusplus
}
#endif
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/nettle.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/nettle.c
index e7ec00e..08b09d5 100644
--- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/nettle.c
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/nettle.c
@@ -44,10 +44,16 @@ JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_
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);
-
+ FILE *urandom = fopen("/dev/urandom", "rb");
+ uint8_t seed[YARROW256_SEED_FILE_SIZE];
+ if (urandom) {
+ size_t read = 0;
+ while (read < sizeof(seed)) {
+ read += fread(((uint8_t *)&seed) + read, 1, sizeof(seed) - read, urandom);
+ }
+ fclose(urandom);
+ }
+ yarrow256_seed(&yarrow, YARROW256_SEED_FILE_SIZE, seed);
}
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_getCurves(JNIEnv *env, jobject self) {
@@ -66,6 +72,24 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_getCur
return result;
}
+JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_supportsDeterministicPRNG(JNIEnv *env, jobject self) {
+ return JNI_TRUE;
+}
+
+JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_setupDeterministicPRNG(JNIEnv *env, jobject self, jbyteArray seed) {
+ jsize seed_length = (*env)->GetArrayLength(env, seed);
+ if (seed_length < YARROW256_SEED_FILE_SIZE) {
+ fprintf(stderr, "Error setting seed, needs to be at least %i bytes.\n", YARROW256_SEED_FILE_SIZE);
+ return JNI_FALSE;
+ }
+
+ jbyte *seed_data = (*env)->GetByteArrayElements(env, seed, NULL);
+ yarrow256_init(&yarrow, 0, NULL);
+ yarrow256_seed(&yarrow, YARROW256_SEED_FILE_SIZE, seed_data);
+ (*env)->ReleaseByteArrayElements(env, seed, seed_data, JNI_ABORT);
+ return JNI_TRUE;
+}
+
static const struct ecc_curve* create_curve_from_name(JNIEnv *env, const char* curve_name) {
if (!curve_name) {
return NULL;