aboutsummaryrefslogtreecommitdiff
path: root/standalone/src/main/java
diff options
context:
space:
mode:
authorJ08nY2024-08-09 16:42:32 +0200
committerJ08nY2024-08-09 16:42:32 +0200
commit77469ff0f8daaa1c47719d88885d5a66431cdce5 (patch)
tree332464a134ec003d0a2ed4c000766be30570e65d /standalone/src/main/java
parent960b3c6f01876719c8642ff4b3d8fd76e2de3f9b (diff)
downloadECTester-77469ff0f8daaa1c47719d88885d5a66431cdce5.tar.gz
ECTester-77469ff0f8daaa1c47719d88885d5a66431cdce5.tar.zst
ECTester-77469ff0f8daaa1c47719d88885d5a66431cdce5.zip
Add deterministic PRNG via preload of RNG functions.
Diffstat (limited to 'standalone/src/main/java')
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/ECTesterStandalone.java50
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/BoringsslLib.java6
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/GcryptLib.java6
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/LibresslLib.java6
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/NativeECLibrary.java3
5 files changed, 67 insertions, 4 deletions
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/ECTesterStandalone.java b/standalone/src/main/java/cz/crcs/ectester/standalone/ECTesterStandalone.java
index dc61192..6822a30 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/ECTesterStandalone.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/ECTesterStandalone.java
@@ -23,6 +23,7 @@
*/
package cz.crcs.ectester.standalone;
+import com.sun.source.tree.StringTemplateTree;
import cz.crcs.ectester.common.cli.*;
import cz.crcs.ectester.common.ec.EC_Consts;
import cz.crcs.ectester.common.ec.EC_Curve;
@@ -105,12 +106,52 @@ public class ECTesterStandalone {
if (!System.getProperty("os.name").startsWith("Windows")) {
FileUtil.write(LIB_RESOURCE_DIR + "lib_timing.so", reqs.resolve("lib_timing.so"));
- System.load(reqs.resolve("lib_timing.so").toString());
-
+ FileUtil.write(LIB_RESOURCE_DIR + "lib_preload.so", reqs.resolve("lib_preload.so"));
+ FileUtil.write(LIB_RESOURCE_DIR + "lib_prng.so", reqs.resolve("lib_prng.so"));
FileUtil.write(LIB_RESOURCE_DIR + "lib_csignals.so", reqs.resolve("lib_csignals.so"));
- System.load(reqs.resolve("lib_csignals.so").toString());
FileUtil.write(LIB_RESOURCE_DIR + "lib_cppsignals.so", reqs.resolve("lib_cppsignals.so"));
- System.load(reqs.resolve("lib_cppsignals.so").toString());
+
+ String preloadLibPath = reqs.resolve("lib_preload.so").toAbsolutePath().toString();
+ String preload = System.getenv("LD_PRELOAD");
+ if (preload == null && !cli.hasOption("no-preload")) {
+ ProcessBuilder builder = new ProcessBuilder();
+ Map<String, String> env = builder.environment();
+ env.put("LD_PRELOAD", preloadLibPath);
+
+ ProcessHandle.Info info = ProcessHandle.current().info();
+ List<String> argList = new LinkedList<>();
+ if (info.command().isPresent()) {
+ argList.add(info.command().get());
+ } else {
+ System.err.println("Cannot locate command to spawn preloaded-subprocess.");
+ return;
+ }
+ if (info.arguments().isPresent()) {
+ argList.addAll(List.of(info.arguments().get()));
+ } else {
+ System.err.println("Cannot locate arguments to spawn preloaded-subprocess.");
+ return;
+ }
+ builder.command(argList);
+ builder.inheritIO();
+
+ Process process = builder.start();
+ int result;
+ while (true) {
+ try {
+ result = process.waitFor();
+ break;
+ } catch (InterruptedException ignored) {
+ }
+ }
+ System.exit(result);
+ } else {
+ // Load the utility libs.
+ System.load(reqs.resolve("lib_prng.so").toString());
+ System.load(reqs.resolve("lib_timing.so").toString());
+ System.load(reqs.resolve("lib_csignals.so").toString());
+ System.load(reqs.resolve("lib_cppsignals.so").toString());
+ }
}
List<ProviderECLibrary> libObjects = new LinkedList<>();
@@ -296,6 +337,7 @@ public class ECTesterStandalone {
opts.addOption(Option.builder("V").longOpt("version").desc("Print version info.").build());
opts.addOption(Option.builder("h").longOpt("help").desc("Print help(about <command>).").hasArg().argName("command").optionalArg(true).build());
opts.addOption(Option.builder("C").longOpt("color").desc("Print stuff with color, requires ANSI terminal.").build());
+ opts.addOption(Option.builder().longOpt("no-preload").desc("Do not use LD_PRELOAD.").build());
return optParser.parse(opts, args);
}
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/BoringsslLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/BoringsslLib.java
index af4d969..06e6b4a 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/BoringsslLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/BoringsslLib.java
@@ -16,4 +16,10 @@ public class BoringsslLib extends NativeECLibrary {
@Override
public native Set<String> getCurves();
+
+ @Override
+ public boolean supportsDeterministicPRNG() {
+ // This is provided by the native preload that hooks all randomness sources.
+ return true;
+ }
}
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/GcryptLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/GcryptLib.java
index 83d78ef..d1452a9 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/GcryptLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/GcryptLib.java
@@ -17,4 +17,10 @@ public class GcryptLib extends NativeECLibrary {
@Override
public native Set<String> getCurves();
+
+ @Override
+ public boolean supportsDeterministicPRNG() {
+ // This is provided by the native preload that hooks all randomness sources.
+ return true;
+ }
}
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/LibresslLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/LibresslLib.java
index 2dba049..e53399c 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/LibresslLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/LibresslLib.java
@@ -16,4 +16,10 @@ public class LibresslLib extends NativeECLibrary {
@Override
public native Set<String> getCurves();
+
+ @Override
+ public boolean supportsDeterministicPRNG() {
+ // This is provided by the native preload that hooks all randomness sources.
+ return true;
+ }
}
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NativeECLibrary.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NativeECLibrary.java
index c11dbdb..fb4e430 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NativeECLibrary.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NativeECLibrary.java
@@ -86,5 +86,8 @@ public abstract class NativeECLibrary extends ProviderECLibrary {
@Override
public native long getLastNativeTiming();
+ @Override
+ public native boolean setupDeterministicPRNG(byte[] seed);
+
abstract Provider createProvider();
}