From bc4b360520df886088358528d311e7ea46a2bcda Mon Sep 17 00:00:00 2001
From: J08nY
Date: Thu, 25 Apr 2024 15:01:28 +0200
Subject: Add pseudoprime-p curves.
---
.../cz/crcs/ectester/data/wrong/curves.xml | 42 ++++++++++++++++++++++
.../cz/crcs/ectester/data/wrong/pseudo192.csv | 1 +
.../cz/crcs/ectester/data/wrong/pseudo224.csv | 1 +
.../cz/crcs/ectester/data/wrong/pseudo256.csv | 1 +
.../cz/crcs/ectester/data/wrong/pseudo384.csv | 1 +
.../cz/crcs/ectester/data/wrong/pseudo512.csv | 1 +
.../cz/crcs/ectester/data/wrong/pseudo521.csv | 1 +
7 files changed, 48 insertions(+)
create mode 100644 common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo192.csv
create mode 100644 common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo224.csv
create mode 100644 common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo256.csv
create mode 100644 common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo384.csv
create mode 100644 common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo512.csv
create mode 100644 common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo521.csv
(limited to 'common/src')
diff --git a/common/src/main/resources/cz/crcs/ectester/data/wrong/curves.xml b/common/src/main/resources/cz/crcs/ectester/data/wrong/curves.xml
index 2a51474..9087940 100644
--- a/common/src/main/resources/cz/crcs/ectester/data/wrong/curves.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/curves.xml
@@ -92,4 +92,46 @@
wrongt571.csv
The field polynomial is not irreducible in F_2^571[x].
+
+ pseudo192
+ 192
+ prime
+ pseudo192.csv
+ The field is not prime (but a Carmichael pseudoprime, see https://github.com/crocs-muni/fooling-primality-tests/).
+
+
+ pseudo224
+ 224
+ prime
+ pseudo224.csv
+ The field is not prime (but a Carmichael pseudoprime, see https://github.com/crocs-muni/fooling-primality-tests/).
+
+
+ pseudo256
+ 256
+ prime
+ pseudo256.csv
+ The field is not prime (but a Carmichael pseudoprime, see https://github.com/crocs-muni/fooling-primality-tests/).
+
+
+ pseudo384
+ 384
+ prime
+ pseudo384.csv
+ The field is not prime (but a Carmichael pseudoprime, see https://github.com/crocs-muni/fooling-primality-tests/).
+
+
+ pseudo512
+ 512
+ prime
+ pseudo512.csv
+ The field is not prime (but a Carmichael pseudoprime, see https://github.com/crocs-muni/fooling-primality-tests/).
+
+
+ pseudo521
+ 521
+ prime
+ pseudo521.csv
+ The field is not prime (but a Carmichael pseudoprime, see https://github.com/crocs-muni/fooling-primality-tests/).
+
\ No newline at end of file
diff --git a/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo192.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo192.csv
new file mode 100644
index 0000000..c98e63b
--- /dev/null
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo192.csv
@@ -0,0 +1 @@
+0xf7601c102e5605a4510b865b28287060ae6002956371b4f7,0x429c8107ce7063a45234aeadd30c021acc6bdaff6531af7d,0x9637284c287bc5c97c574dc8f91d03e5f58f516bfdb77601,0x1f7fe14d44df79fcfbd9225173d39784374bc08a80a8dc40,0xdb2ff34213f3214f1aa4e273e48efaf8362292f4e0ed0b9f,0xf7601c102487dad5b1e6fbcb61193546c31f16a71903f85d,0x0001
\ No newline at end of file
diff --git a/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo224.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo224.csv
new file mode 100644
index 0000000..cf781d6
--- /dev/null
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo224.csv
@@ -0,0 +1 @@
+0xf54255f919b6fec4c9c9788c0dc432b8a50b7331e836a4fff9c5bc7f,0x270b8817bc48b1d56401abf8964e6fc785771d2a26130f8a572682f1,0xe28250a72ac83dd064b08cb83e8d2b678330d4dfd5193179088cb5cb,0xd0a2d469eda6a9c5bf9568459a02e2e65901f907f766891ad2a323cd,0x580e1fbfb94793f5880e36d6a2229c2fb082db0f3270f0b3ec4ce2a8,0xf54255f9581e15675cedd50065fa01410df6bfb6e17a2c69747246e5,0x0001
\ No newline at end of file
diff --git a/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo256.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo256.csv
new file mode 100644
index 0000000..ef14dc4
--- /dev/null
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo256.csv
@@ -0,0 +1 @@
+0x89ae5b1ffa52bd5a6e1e9627d2fef2b1658f5ae93ce0dabecead0f8cf294909b,0x35fe79c1bdac3f16080f6f763f1947c97fe841510d807e632fdb0abca45b539d,0x1da2a1152d54cc6d19da48bfbd8c31f6d7aba41fdbb744ef60c3ffb0a1b1b3cb,0x6ef9419070b90eaec6914e8c4809c3fe1c868b9857874abc4929321a021ef679,0x2391630ddc525199e2f65883d35623545cccd58496caa8b2e3fb8a84df6996e6,0x89ae5b1ffad4189f719eb3801d3a65986202d48cbab151d32b992e92dd589161,0x0001
\ No newline at end of file
diff --git a/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo384.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo384.csv
new file mode 100644
index 0000000..ac1f589
--- /dev/null
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo384.csv
@@ -0,0 +1 @@
+0xbddc881aa619fc8a2f4dedb315f0b55c8c0cca4d7aac4e595c96504eb2e8860489bd824340028f49ca90272998729fe7,0x1595f6abcbb9bea724adb7df2129472f9f4d7ed83e2c9e7a52dc8cd12ef36b7a209f46afa553901d7ecf0d98618dabcf,0xb6bf3f61901462bf181b096d61aa7ee00310d110f739cbf95fccf7faa7f529052ee8758210a9d6c10de2790e4ab7f1e3,0x6525e4141411e472233e794116f285835ed743c77d21cac612c9b8a5000fa58407754ff242671f4ca8478b6bece46ad9,0x335f77556d279a9fd8701c26f14a13646b927d3ab86c165fafb5e3ee08f3797b819eb0eea2e6e3a569c63271c406d3bb,0xbddc881aa619fc85d46958aae14456922f956e5a8bf1d5f3f889d9d14ff5ae4ef373c260215503b442e5a6f88e1b609d,0x0001
\ No newline at end of file
diff --git a/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo512.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo512.csv
new file mode 100644
index 0000000..3562558
--- /dev/null
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo512.csv
@@ -0,0 +1 @@
+0xd7489dfb959fd93de1b90bcdd949ea38d11c7e3637ab48f56fb1b2b34e6593fe3cf189e9c2f3166ddefc270747002d1914c558a23dceab08875e75a6b3b3c88f,0x15ae03d8fdf64becd183b64e8a235322be8342124a3e88ae8691ac7e635f424afad39da56169deb4ee25bfb4538054f6208f1bcb7abff14d6ea61ae9f8d2349b,0x7d22f3ece4a500edd384cae7de2f60377a6852e6d3a417374a881b0d83b8f747fba5106a011c76b2176916cd5fa68371c0ba0b2786b1dcdac80ad329b1a83f28,0x0aead0caddeda9ee70fe1976af1a96a410f96fbe65273a986bc88e3e7f3bd6e24d1dc728a04fecfd17e9ddfdfe9472359d39f877761dcdc73a0ee6514ba4894b,0x03f830aef9bfd770119e28a8de3f94119517508839df651129e8a6819c4e86df580179f97821d266d0e205f7536ab49cc04298aa88dde463d638689645188d86,0xd7489dfb959fd93de1b8fe30119d6f138fbeef529543d12c03f91d34c545a75197f79a0083650dbebee8fa12d39f2902101eed3f2e1963470d77dfe2204a02c7,0x0001
\ No newline at end of file
diff --git a/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo521.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo521.csv
new file mode 100644
index 0000000..4e7c30e
--- /dev/null
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo521.csv
@@ -0,0 +1 @@
+0x153212291c26fe063b78bbca97d35dda6b0b349fe3fc1d4dee21786fc85296e22d93ce855a2d3ed048498c6a1f378cea240f029df302cffb658efe9e12379629acb,0x5a4b83e21db14397282aab529b230058a165962eadf8e8f15703ca5b91501463fc8bf866d7f1a2ce785c4ff0c5797e20e3fb6952bd42e3421ed1c589b2853a0c30,0x1196a7bc6d754b0224fcace252f9056acebba295a7a0763a95fd0fa90cca4bbcc1d030cbee049d06e103bb28c8b870a1d5989d9c56870ff7fde969f3bfd0278fbf7,0xd74e5bf4d166a2d75d57d49be58f9bf3900bda81bbb283a8f311d9972c7cd1ed547403b52c657af133297f852f938b6a7ba8ef52c2ca8eb79799b15f7123c5d2af,0x7ed2303056596fb09cfade2ca0f691c515da266565ba5afa4700c6c6ed38091f3cf4fdc67ee1426b849bb9be26c1e8c3b53530fc4510dad8b7badc81bad7276c5b,0x153212291c26fe063b78bc114fd2c18a365faa9b5b3fecbb87c2690125099ddd8baa5052aa2fda7f14120d3d6af0ac185902f97bae06a009588286cf5ce93b1cce3,0x0001
\ No newline at end of file
--
cgit v1.3.1
From ee5c50d8b2491da2966f4b0730013765ab2507bc Mon Sep 17 00:00:00 2001
From: J08nY
Date: Thu, 25 Apr 2024 15:47:49 +0200
Subject: Add some output to tests as they run.
---
.../ectester/common/output/BaseTextTestWriter.java | 17 +++++++++++++++
.../ectester/common/output/BaseXMLTestWriter.java | 10 +++++++++
.../ectester/common/output/BaseYAMLTestWriter.java | 10 +++++++++
.../crcs/ectester/common/output/TeeTestWriter.java | 14 +++++++++++++
.../cz/crcs/ectester/common/output/TestWriter.java | 24 ++++++++++++++++------
.../cz/crcs/ectester/common/test/TestSuite.java | 2 ++
6 files changed, 71 insertions(+), 6 deletions(-)
(limited to 'common/src')
diff --git a/common/src/main/java/cz/crcs/ectester/common/output/BaseTextTestWriter.java b/common/src/main/java/cz/crcs/ectester/common/output/BaseTextTestWriter.java
index 5c449db..4670f95 100644
--- a/common/src/main/java/cz/crcs/ectester/common/output/BaseTextTestWriter.java
+++ b/common/src/main/java/cz/crcs/ectester/common/output/BaseTextTestWriter.java
@@ -113,6 +113,23 @@ public abstract class BaseTextTestWriter implements TestWriter {
return line + out.toString();
}
+ @Override
+ public void beginTest(Test t) {
+ if (t instanceof CompoundTest) {
+ CompoundTest test = (CompoundTest) t;
+ } else {
+ SimpleTest extends BaseTestable> test = (SimpleTest extends BaseTestable>) t;
+ }
+ output.print("Running ▶ " + t.getDescription());
+ output.flush();
+ }
+
+
+ @Override
+ public void endTest(Test t) {
+ output.print("\33[2K\r");
+ }
+
@Override
public void outputTest(Test t, int index) {
if (!t.hasRun())
diff --git a/common/src/main/java/cz/crcs/ectester/common/output/BaseXMLTestWriter.java b/common/src/main/java/cz/crcs/ectester/common/output/BaseXMLTestWriter.java
index 53970dd..5157ef0 100644
--- a/common/src/main/java/cz/crcs/ectester/common/output/BaseXMLTestWriter.java
+++ b/common/src/main/java/cz/crcs/ectester/common/output/BaseXMLTestWriter.java
@@ -115,6 +115,16 @@ public abstract class BaseXMLTestWriter implements TestWriter {
return testElem;
}
+ @Override
+ public void beginTest(Test t) {
+
+ }
+
+ @Override
+ public void endTest(Test t) {
+
+ }
+
@Override
public void outputTest(Test t, int index) {
if (!t.hasRun())
diff --git a/common/src/main/java/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java b/common/src/main/java/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java
index e054563..c3a42ea 100644
--- a/common/src/main/java/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java
+++ b/common/src/main/java/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java
@@ -91,6 +91,16 @@ public abstract class BaseYAMLTestWriter implements TestWriter {
return testObj;
}
+ @Override
+ public void beginTest(Test t) {
+
+ }
+
+ @Override
+ public void endTest(Test t) {
+
+ }
+
@Override
public void outputTest(Test t, int index) {
if (!t.hasRun())
diff --git a/common/src/main/java/cz/crcs/ectester/common/output/TeeTestWriter.java b/common/src/main/java/cz/crcs/ectester/common/output/TeeTestWriter.java
index 58a0a15..7635644 100644
--- a/common/src/main/java/cz/crcs/ectester/common/output/TeeTestWriter.java
+++ b/common/src/main/java/cz/crcs/ectester/common/output/TeeTestWriter.java
@@ -20,6 +20,20 @@ public class TeeTestWriter implements TestWriter {
}
}
+ @Override
+ public void beginTest(Test t) {
+ for (TestWriter writer : writers) {
+ writer.beginTest(t);
+ }
+ }
+
+ @Override
+ public void endTest(Test t) {
+ for (TestWriter writer : writers) {
+ writer.endTest(t);
+ }
+ }
+
@Override
public void outputTest(Test t, int index) {
for (TestWriter writer : writers) {
diff --git a/common/src/main/java/cz/crcs/ectester/common/output/TestWriter.java b/common/src/main/java/cz/crcs/ectester/common/output/TestWriter.java
index 67aeccb..7368c0a 100644
--- a/common/src/main/java/cz/crcs/ectester/common/output/TestWriter.java
+++ b/common/src/main/java/cz/crcs/ectester/common/output/TestWriter.java
@@ -19,20 +19,32 @@ public interface TestWriter {
void begin(TestSuite suite);
/**
- * @param t
- * @param index
+ * Begin the test (before it is run).
+ * @param t Test to begin output of.
+ */
+ void beginTest(Test t);
+
+ /**
+ * End the test (after it is run, or errored out).
+ * @param t Test to end output of.
+ */
+ void endTest(Test t);
+
+ /**
+ * @param t Test to output.
+ * @param index Index of the test.
*/
void outputTest(Test t, int index);
/**
- * @param t
- * @param cause
- * @param index
+ * @param t Test to output the error from.
+ * @param cause Throwable to output.
+ * @param index Index of the test.
*/
void outputError(Test t, Throwable cause, int index);
/**
- *
+ * End writing the TestSuite.
*/
void end();
}
diff --git a/common/src/main/java/cz/crcs/ectester/common/test/TestSuite.java b/common/src/main/java/cz/crcs/ectester/common/test/TestSuite.java
index b12680a..091b008 100644
--- a/common/src/main/java/cz/crcs/ectester/common/test/TestSuite.java
+++ b/common/src/main/java/cz/crcs/ectester/common/test/TestSuite.java
@@ -55,7 +55,9 @@ public abstract class TestSuite {
*/
protected T runTest(T t) {
running = t;
+ writer.beginTest(t);
t.run();
+ writer.endTest(t);
running = null;
return t;
}
--
cgit v1.3.1
From 6a9f2181e9fa0fad8732261bb923b0c24b232747 Mon Sep 17 00:00:00 2001
From: J08nY
Date: Sat, 27 Apr 2024 00:06:25 +0200
Subject: Add XDH to standalone CLI.
---
.../java/cz/crcs/ectester/common/util/ECUtil.java | 54 ++++++++++++++++++---
.../ectester/standalone/ECTesterStandalone.java | 56 +++++-----------------
2 files changed, 61 insertions(+), 49 deletions(-)
(limited to 'common/src')
diff --git a/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java b/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java
index f9be536..74fccc9 100644
--- a/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java
+++ b/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java
@@ -2,20 +2,22 @@ package cz.crcs.ectester.common.util;
import cz.crcs.ectester.common.ec.*;
import cz.crcs.ectester.data.EC_Store;
+import org.bouncycastle.asn1.ASN1OctetString;
+import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.crypto.signers.PlainDSAEncoding;
import org.bouncycastle.crypto.signers.StandardDSAEncoding;
+import org.bouncycastle.jcajce.interfaces.EdDSAPrivateKey;
+import org.bouncycastle.jcajce.interfaces.EdDSAPublicKey;
+import org.bouncycastle.jcajce.interfaces.XDHPrivateKey;
+import org.bouncycastle.jcajce.interfaces.XDHPublicKey;
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
-import java.security.KeyPair;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.interfaces.ECKey;
-import java.security.interfaces.ECPrivateKey;
-import java.security.interfaces.ECPublicKey;
+import java.security.*;
+import java.security.interfaces.*;
import java.security.spec.*;
import java.util.LinkedList;
import java.util.List;
@@ -456,6 +458,46 @@ public class ECUtil {
return null;
}
+ public static byte[] pubkeyToBytes(PublicKey pubkey) {
+ if (pubkey instanceof ECPublicKey) {
+ ECPublicKey ecPublicKey = (ECPublicKey) pubkey;
+ return ECUtil.toX962Uncompressed(ecPublicKey.getW(), ecPublicKey.getParams());
+ } else if (pubkey instanceof XECPublicKey) {
+ XECPublicKey xedPublicKey = (XECPublicKey) pubkey;
+ return xedPublicKey.getU().toByteArray();
+ } else if (pubkey instanceof EdECPublicKey) {
+ EdECPublicKey edECPublicKey = (EdECPublicKey) pubkey;
+ return edECPublicKey.getPoint().getY().toByteArray();
+ } else if (pubkey instanceof XDHPublicKey) {
+ XDHPublicKey xdhPublicKey = (XDHPublicKey) pubkey;
+ return xdhPublicKey.getU().toByteArray();
+ // Special-case BouncyCastle XDH
+ } else if (pubkey instanceof EdDSAPublicKey) {
+ EdDSAPublicKey edDSAPublicKey = (EdDSAPublicKey) pubkey;
+ // Special-case BouncyCastle EdDSA
+ return edDSAPublicKey.getPointEncoding();
+ }
+ return null;
+ }
+
+ public static byte[] privkeyToBytes(PrivateKey privkey) {
+ if (privkey instanceof ECPrivateKey) {
+ ECPrivateKey ecPrivateKey = (ECPrivateKey) privkey;
+ return ecPrivateKey.getS().toByteArray();
+ } else if (privkey instanceof XECPrivateKey) {
+ XECPrivateKey xecPrivateKey = (XECPrivateKey) privkey;
+ return xecPrivateKey.getScalar().get();
+ } else if (privkey instanceof EdECPrivateKey) {
+ EdECPrivateKey edECPrivateKey = (EdECPrivateKey) privkey;
+ return edECPrivateKey.getBytes().get();
+ } else if (privkey instanceof XDHPrivateKey || privkey instanceof EdDSAPrivateKey) {
+ // Special-case BouncyCastle XDH and EdDSA
+ PrivateKeyInfo xpkinfo = PrivateKeyInfo.getInstance(privkey.getEncoded());
+ return ASN1OctetString.getInstance(xpkinfo.getPrivateKey().getOctets()).getOctets();
+ }
+ return null;
+ }
+
public static boolean equalKeyPairParameters(ECPrivateKey priv, ECPublicKey pub) {
if (priv == null || pub == null) {
return false;
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 c5693e8..2dc5040 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/ECTesterStandalone.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/ECTesterStandalone.java
@@ -62,6 +62,7 @@ import java.security.interfaces.*;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.ECParameterSpec;
+import java.security.spec.NamedParameterSpec;
import java.util.*;
import java.util.stream.Collectors;
@@ -160,8 +161,6 @@ public class ECTesterStandalone {
listIdents();
} else if (cli.isNext("ecdh")) {
ecdh();
- } else if (cli.isNext("xdh")) {
- xdh();
} else if (cli.isNext("ecdsa")) {
ecdsa();
} else if (cli.isNext("generate")) {
@@ -236,11 +235,6 @@ public class ECTesterStandalone {
ParserOptions ecdh = new ParserOptions(new DefaultParser(), ecdhOpts, "Perform EC based KeyAgreement.");
actions.put("ecdh", ecdh);
- Options xdhOpts = new Options();
- xdhOpts.addOption(Option.builder("n").longOpt("amount").hasArg().argName("amount").optionalArg(false).desc("Do XDH [amount] times.").build());
- ParserOptions xdh = new ParserOptions(new DefaultParser(), xdhOpts, "Perform XDH (x25519/x448).");
- actions.put("xdh", xdh);
-
Options ecdsaOpts = new Options();
ecdsaOpts.addOption(bits);
ecdsaOpts.addOption(namedCurve);
@@ -467,8 +461,8 @@ public class ECTesterStandalone {
other = kpg.genKeyPair();
}
- ECPrivateKey privkey = (ECPrivateKey) ECUtil.loadKey(EC_Consts.PARAMETER_S, cli.getOptionValue("ecdh.named-private"), cli.getOptionValue("ecdh.private"), spec);
- ECPublicKey pubkey = (ECPublicKey) ECUtil.loadKey(EC_Consts.PARAMETER_W, cli.getOptionValue("ecdh.named-public"), cli.getOptionValue("ecdh.public"), spec);
+ PrivateKey privkey = (ECPrivateKey) ECUtil.loadKey(EC_Consts.PARAMETER_S, cli.getOptionValue("ecdh.named-private"), cli.getOptionValue("ecdh.private"), spec);
+ PublicKey pubkey = (ECPublicKey) ECUtil.loadKey(EC_Consts.PARAMETER_W, cli.getOptionValue("ecdh.named-public"), cli.getOptionValue("ecdh.public"), spec);
int amount = Integer.parseInt(cli.getOptionValue("ecdh.amount", "1"));
for (int i = 0; i < amount || amount == 0; ++i) {
@@ -480,11 +474,11 @@ public class ECTesterStandalone {
}
if (!cli.hasOption("ecdh.named-private") && !cli.hasOption("ecdh.private")) {
- privkey = (ECPrivateKey) one.getPrivate();
+ privkey = one.getPrivate();
}
if (!cli.hasOption("ecdh.named-public") && !cli.hasOption("ecdh.public")) {
- pubkey = (ECPublicKey) other.getPublic();
+ pubkey = other.getPublic();
}
long elapsed = -System.nanoTime();
@@ -510,8 +504,8 @@ public class ECTesterStandalone {
}
ka = kaIdent.getInstance(lib.getProvider());
- String pub = ByteUtil.bytesToHex(ECUtil.toX962Uncompressed(pubkey.getW(), pubkey.getParams()), false);
- String priv = ByteUtil.bytesToHex(privkey.getS().toByteArray(), false);
+ String pub = ByteUtil.bytesToHex(ECUtil.pubkeyToBytes(pubkey), false);
+ String priv = ByteUtil.bytesToHex(ECUtil.privkeyToBytes(privkey), false);
String dh = ByteUtil.bytesToHex(result, false);
out.printf("%d;%d;%s;%s;%s%n", i, elapsed, pub, priv, dh);
}
@@ -521,10 +515,6 @@ public class ECTesterStandalone {
}
}
- private void xdh() {
-
- }
-
/**
*
*/
@@ -759,30 +749,11 @@ public class ECTesterStandalone {
}
PublicKey pubkey = kp.getPublic();
PrivateKey privkey = kp.getPrivate();
- String pub;
- String priv;
- if (pubkey instanceof ECPublicKey && privkey instanceof ECPrivateKey) {
- ECPublicKey publicKey = (ECPublicKey) pubkey;
- ECPrivateKey privateKey = (ECPrivateKey) privkey;
- pub = ByteUtil.bytesToHex(ECUtil.toX962Uncompressed(publicKey.getW(), publicKey.getParams()), false);
- priv = ByteUtil.bytesToHex(privateKey.getS().toByteArray(), false);
- } else if (pubkey instanceof XECPublicKey && privkey instanceof XECPrivateKey) {
- pub = ByteUtil.bytesToHex(((XECPublicKey) pubkey).getU().toByteArray(), false);
- priv = ByteUtil.bytesToHex(((XECPrivateKey) privkey).getScalar().get(), false);
- } else if (pubkey instanceof EdECPublicKey && privkey instanceof EdECPrivateKey) {
- pub = ByteUtil.bytesToHex(((EdECPublicKey) pubkey).getPoint().getY().toByteArray(), false);
- priv = ByteUtil.bytesToHex(((EdECPrivateKey) privkey).getBytes().get(), false);
- } else if (pubkey instanceof XDHPublicKey && privkey instanceof XDHPrivateKey) {
- // Special-case BouncyCastle XDH
- pub = ByteUtil.bytesToHex(((XDHPublicKey) pubkey).getU().toByteArray(), false);
- PrivateKeyInfo pkinfo = PrivateKeyInfo.getInstance(privkey.getEncoded());
- priv = ByteUtil.bytesToHex(ASN1OctetString.getInstance(pkinfo.getPrivateKey().getOctets()).getOctets(), false);
- } else if (pubkey instanceof EdDSAPublicKey && privkey instanceof EdDSAPrivateKey) {
- // Special-case BouncyCastle EdDSA
- pub = ByteUtil.bytesToHex(((EdDSAPublicKey) pubkey).getPointEncoding(), false);
- PrivateKeyInfo pkinfo = PrivateKeyInfo.getInstance(privkey.getEncoded());
- priv = ByteUtil.bytesToHex(ASN1OctetString.getInstance(pkinfo.getPrivateKey().getOctets()).getOctets(), false);
- } else {
+ byte[] pubBytes = ECUtil.pubkeyToBytes(pubkey);
+ byte[] privBytes = ECUtil.privkeyToBytes(privkey);
+ String pub = ByteUtil.bytesToHex(pubBytes, false);
+ String priv = ByteUtil.bytesToHex(privBytes, false);
+ if (pubBytes == null || privBytes == null) {
System.err.println(pubkey.getClass().getCanonicalName());
System.err.println(privkey.getClass().getCanonicalName());
break;
@@ -801,7 +772,6 @@ public class ECTesterStandalone {
private void test() throws TestException, ParserConfigurationException, FileNotFoundException {
TestWriter writer = new FileTestWriter(cli.getOptionValue("test.format", "text"), !cli.hasOption("test.quiet"), cli.getOptionValues("test.output"));
StandaloneTestSuite suite;
-
switch (cli.getArg(0).toLowerCase()) {
case "test-vectors":
suite = new StandaloneTestVectorSuite(writer, cfg, cli);
@@ -836,9 +806,9 @@ public class ECTesterStandalone {
case "performance":
suite = new StandalonePerformanceSuite(writer, cfg, cli);
break;
- case "default":
default:
suite = new StandaloneDefaultSuite(writer, cfg, cli);
+ break;
}
suite.run();
--
cgit v1.3.1
From ba76bd7c04a94b52f57eda418e270dc658976c12 Mon Sep 17 00:00:00 2001
From: J08nY
Date: Fri, 10 May 2024 16:08:43 +0200
Subject: Fix Nettle issues.
Fixes #23.
---
.../java/cz/crcs/ectester/common/util/ECUtil.java | 11 ++
.../crcs/ectester/standalone/libs/NettleLib.java | 32 +++++
.../standalone/libs/jni/NativeKeyAgreementSpi.java | 128 +++++++++++--------
.../libs/jni/NativeKeyPairGeneratorSpi.java | 49 ++++++--
.../cz/crcs/ectester/standalone/libs/jni/native.h | 136 +++++++++++++++++++++
.../cz/crcs/ectester/standalone/libs/jni/nettle.c | 51 +-------
.../java/cz/crcs/ectester/standalone/AppTests.java | 15 ---
7 files changed, 294 insertions(+), 128 deletions(-)
(limited to 'common/src')
diff --git a/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java b/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java
index 74fccc9..54c5131 100644
--- a/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java
+++ b/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java
@@ -507,4 +507,15 @@ public class ECUtil {
priv.getParams().getGenerator().equals(pub.getParams().getGenerator()) &&
priv.getParams().getOrder().equals(pub.getParams().getOrder());
}
+
+ public static boolean equalECParameterSpec(ECParameterSpec left, ECParameterSpec right) {
+ if (left == null || right == null) {
+ return false;
+ }
+
+ return left.getCofactor() == right.getCofactor() &&
+ left.getCurve().equals(right.getCurve()) &&
+ left.getGenerator().equals(right.getGenerator()) &&
+ left.getOrder().equals(right.getOrder());
+ }
}
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 6b60779..d4df414 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
@@ -1,6 +1,15 @@
package cz.crcs.ectester.standalone.libs;
+import cz.crcs.ectester.common.ec.EC_Curve;
+import cz.crcs.ectester.common.util.ECUtil;
+import cz.crcs.ectester.data.EC_Store;
+
+import java.security.InvalidAlgorithmParameterException;
import java.security.Provider;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.ECGenParameterSpec;
+import java.security.spec.ECParameterSpec;
+import java.util.Arrays;
import java.util.Set;
/**
@@ -17,4 +26,27 @@ public class NettleLib extends NativeECLibrary {
@Override
public native Set getCurves();
+
+ public static ECGenParameterSpec parametersKnown(AlgorithmParameterSpec params) throws InvalidAlgorithmParameterException {
+ if (params instanceof ECGenParameterSpec) {
+ if (Arrays.asList("secp192r1", "secp224r1", "secp256r1", "secp384r1", "secp521r1").contains(((ECGenParameterSpec) params).getName())) {
+ return (ECGenParameterSpec) params;
+ }
+ } else if (params instanceof ECParameterSpec) {
+ ECParameterSpec spec = (ECParameterSpec) params;
+ EC_Store store = EC_Store.getInstance();
+ if (ECUtil.equalECParameterSpec(spec, store.getObject(EC_Curve.class, "secg/secp192r1").toSpec())) {
+ return new ECGenParameterSpec("secp192r1");
+ } else if (ECUtil.equalECParameterSpec(spec, store.getObject(EC_Curve.class, "secg/secp224r1").toSpec())) {
+ return new ECGenParameterSpec("secp224r1");
+ } else if (ECUtil.equalECParameterSpec(spec, store.getObject(EC_Curve.class, "secg/secp256r1").toSpec())) {
+ return new ECGenParameterSpec("secp256r1");
+ } else if (ECUtil.equalECParameterSpec(spec, store.getObject(EC_Curve.class, "secg/secp384r1").toSpec())) {
+ return new ECGenParameterSpec("secp384r1");
+ } else if (ECUtil.equalECParameterSpec(spec, store.getObject(EC_Curve.class, "secg/secp521r1").toSpec())) {
+ return new ECGenParameterSpec("secp521r1");
+ }
+ }
+ throw new InvalidAlgorithmParameterException("Unknown curve.");
+ }
}
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java
index afed02b..d9a4d40 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java
@@ -1,6 +1,9 @@
package cz.crcs.ectester.standalone.libs.jni;
+import cz.crcs.ectester.common.ec.EC_Curve;
import cz.crcs.ectester.common.util.ECUtil;
+import cz.crcs.ectester.data.EC_Store;
+import cz.crcs.ectester.standalone.libs.NettleLib;
import javax.crypto.KeyAgreementSpi;
import javax.crypto.SecretKey;
@@ -11,7 +14,6 @@ import java.security.interfaces.ECPublicKey;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.ECParameterSpec;
-import java.security.spec.InvalidParameterSpecException;
/**
* @author Jan Jancar johny@neuromancer.sk
@@ -61,6 +63,22 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
return secret.length;
}
+ protected byte[] getPubkey() {
+ if (publicKey instanceof NativeECPublicKey) {
+ return ((NativeECPublicKey) publicKey).getData();
+ } else {
+ return ECUtil.pubkeyToBytes(publicKey);
+ }
+ }
+
+ protected byte[] getPrivkey() {
+ if (privateKey instanceof NativeECPrivateKey) {
+ return ((NativeECPrivateKey) privateKey).getData();
+ } else {
+ return ECUtil.privkeyToBytes(privateKey);
+ }
+ }
+
private abstract static class SimpleKeyAgreementSpi extends NativeKeyAgreementSpi {
@Override
@@ -72,51 +90,79 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
this.params = params;
}
- private byte[] getPubkey() {
- if (publicKey instanceof NativeECPublicKey) {
- return ((NativeECPublicKey) publicKey).getData();
- } else {
- return ECUtil.toX962Uncompressed(publicKey.getW(), ((ECParameterSpec) params));
+ @Override
+ protected byte[] engineGenerateSecret() throws IllegalStateException {
+ return generateSecret(getPubkey(), getPrivkey(), (ECParameterSpec) params);
+ }
+
+ abstract byte[] generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params);
+
+ @Override
+ protected SecretKey engineGenerateSecret(String algorithm) throws IllegalStateException, NoSuchAlgorithmException, InvalidKeyException {
+ if (algorithm == null) {
+ throw new NoSuchAlgorithmException("Algorithm must not be null.");
}
+ return generateSecret(getPubkey(), getPrivkey(), (ECParameterSpec) params, algorithm);
}
- private byte[] getPrivkey() {
- if (privateKey instanceof NativeECPrivateKey) {
- return ((NativeECPrivateKey) privateKey).getData();
- } else {
- return ECUtil.toByteArray(privateKey.getS(), ((ECParameterSpec) params).getOrder().bitLength());
+ abstract SecretKey generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params, String algorithm);
+ }
+
+ private abstract static class ExtendedKeyAgreementSpi extends NativeKeyAgreementSpi {
+
+ @Override
+ protected void engineInit(Key key, AlgorithmParameterSpec params, SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException {
+ if (!(params instanceof ECParameterSpec || params instanceof ECGenParameterSpec)) {
+ throw new InvalidAlgorithmParameterException("Unknown parameter class.");
}
+ engineInit(key, random);
+ this.params = params;
}
@Override
protected byte[] engineGenerateSecret() throws IllegalStateException {
- return generateSecret(getPubkey(), getPrivkey(), (ECParameterSpec) params);
+ return generateSecret(publicKey, privateKey, params);
}
- abstract byte[] generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params);
+ abstract byte[] generateSecret(ECPublicKey pubkey, ECPrivateKey privkey, AlgorithmParameterSpec params);
@Override
protected SecretKey engineGenerateSecret(String algorithm) throws IllegalStateException, NoSuchAlgorithmException, InvalidKeyException {
if (algorithm == null) {
throw new NoSuchAlgorithmException("Algorithm must not be null");
}
- return generateSecret(getPubkey(), getPrivkey(), (ECParameterSpec) params, algorithm);
+ return generateSecret(publicKey, privateKey, params, algorithm);
}
- abstract SecretKey generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params, String algorithm);
+ abstract SecretKey generateSecret(ECPublicKey pubkey, ECPrivateKey privkey, AlgorithmParameterSpec params, String algorithm);
}
- private abstract static class ExtendedKeyAgreementSpi extends NativeKeyAgreementSpi {
+ private abstract static class NamedKeyAgreementSpi extends NativeKeyAgreementSpi {
+
+ @Override
+ protected void engineInit(Key key, SecureRandom random) throws InvalidKeyException {
+ if (!(key instanceof ECPrivateKey)) {
+ throw new InvalidKeyException("Key must be instance of ECPrivateKey");
+ }
+ privateKey = (ECPrivateKey) key;
+ try {
+ this.params = parametersKnown(privateKey.getParams());
+ } catch (InvalidAlgorithmParameterException e) {
+ throw new InvalidKeyException(e);
+ }
+ }
@Override
protected void engineInit(Key key, AlgorithmParameterSpec params, SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException {
if (!(params instanceof ECParameterSpec || params instanceof ECGenParameterSpec)) {
- throw new InvalidAlgorithmParameterException();
+ throw new InvalidAlgorithmParameterException("Unknown parameter class.");
}
engineInit(key, random);
- this.params = params;
+ this.params = parametersKnown(params);
}
+ abstract ECGenParameterSpec parametersKnown(AlgorithmParameterSpec params) throws InvalidAlgorithmParameterException;
+
@Override
protected byte[] engineGenerateSecret() throws IllegalStateException {
return generateSecret(publicKey, privateKey, params);
@@ -374,7 +420,7 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
}
}
- public abstract static class Nettle extends SimpleKeyAgreementSpi {
+ public abstract static class Nettle extends NamedKeyAgreementSpi {
private final String type;
public Nettle(String type) {
@@ -382,43 +428,21 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
}
@Override
- byte[] generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params) {
- try {
- // TODO: OMG remove this monstrosity.
- AlgorithmParameters tmp = AlgorithmParameters.getInstance("EC");
- tmp.init(params);
- ECGenParameterSpec spec = tmp.getParameterSpec(ECGenParameterSpec.class);
- switch (spec.getName()) {
- case "1.2.840.10045.3.1.7":
- spec = new ECGenParameterSpec("secp256r1");
- break;
- case "1.2.840.10045.3.1.1":
- spec = new ECGenParameterSpec("secp192r1");
- break;
- case "1.3.132.0.33":
- spec = new ECGenParameterSpec("secp224r1");
- break;
- case "1.3.132.0.34":
- spec = new ECGenParameterSpec("secp384r1");
- break;
- case "1.3.132.0.35":
- spec = new ECGenParameterSpec("secp521r1");
- break;
- default:
- return null;
-
- }
- return generateSecret(pubkey, privkey, spec);
-
- } catch (NoSuchAlgorithmException | InvalidParameterSpecException e) {
- return null;
- }
+ ECGenParameterSpec parametersKnown(AlgorithmParameterSpec params) throws InvalidAlgorithmParameterException {
+ return NettleLib.parametersKnown(params);
}
- native byte[] generateSecret(byte[] pubkey, byte[] privkey, ECGenParameterSpec params);
+ @Override
+ byte[] generateSecret(ECPublicKey pubkey, ECPrivateKey privkey, AlgorithmParameterSpec params) {
+ return generateSecret(getPubkey(), getPrivkey(), (ECGenParameterSpec) params);
+ }
@Override
- native SecretKey generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params, String algorithm);
+ SecretKey generateSecret(ECPublicKey pubkey, ECPrivateKey privkey, AlgorithmParameterSpec params, String algorithm) {
+ throw new UnsupportedOperationException("Not supported.");
+ }
+
+ native byte[] generateSecret(byte[] pubkey, byte[] privkey, ECGenParameterSpec params);
}
public static class NettleECDH extends Nettle {
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi.java
index 0a9487f..086c2c4 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi.java
@@ -2,6 +2,7 @@ package cz.crcs.ectester.standalone.libs.jni;
import cz.crcs.ectester.common.ec.EC_Curve;
import cz.crcs.ectester.data.EC_Store;
+import cz.crcs.ectester.standalone.libs.NettleLib;
import java.security.*;
import java.security.spec.AlgorithmParameterSpec;
@@ -293,7 +294,7 @@ public abstract class NativeKeyPairGeneratorSpi extends KeyPairGeneratorSpi {
@Override
native KeyPair generate(AlgorithmParameterSpec params, SecureRandom random);
}
-
+
public static class Libressl extends NativeKeyPairGeneratorSpi {
public Libressl() {
@@ -319,26 +320,48 @@ public abstract class NativeKeyPairGeneratorSpi extends KeyPairGeneratorSpi {
}
@Override
- native boolean keysizeSupported(int keysize);
+ boolean keysizeSupported(int keysize) {
+ switch (keysize) {
+ case 192, 224, 256, 384, 521:
+ return true;
+ default:
+ return false;
+ }
+ }
@Override
- native boolean paramsSupported(AlgorithmParameterSpec params);
+ boolean paramsSupported(AlgorithmParameterSpec params) {
+ try {
+ NettleLib.parametersKnown(params);
+ return true;
+ } catch (InvalidAlgorithmParameterException ignored) {
+ return false;
+ }
+ }
@Override
- native KeyPair generate(int keysize, SecureRandom random);
+ KeyPair generate(int keysize, SecureRandom random) {
+ EC_Curve curve = EC_Store.getInstance().getObject(EC_Curve.class, "secg/secp" + keysize + "r1");
+ return generate(keysize, random, curve.toSpec());
+ }
+
+ native KeyPair generate(int keysize, SecureRandom random, AlgorithmParameterSpec spec);
@Override
KeyPair generate(AlgorithmParameterSpec params, SecureRandom random) {
- if (params instanceof ECGenParameterSpec) {
- String curveName = ((ECGenParameterSpec) params).getName();
- if (curveName.contains("secp")) {
- curveName = "secg/" + curveName;
- }
- EC_Curve curve = EC_Store.getInstance().getObject(EC_Curve.class, curveName);
- ECParameterSpec spec = curve.toSpec();
- return generate(params, random, spec);
+ ECGenParameterSpec named;
+ try {
+ named = NettleLib.parametersKnown(params);
+ } catch (InvalidAlgorithmParameterException ignored) {
+ return null;
+ }
+ String curveName = named.getName();
+ if (curveName.startsWith("secp")) {
+ curveName = "secg/" + curveName;
}
- return null;
+ EC_Curve curve = EC_Store.getInstance().getObject(EC_Curve.class, curveName);
+ ECParameterSpec spec = curve.toSpec();
+ return generate(params, random, spec);
}
native KeyPair generate(AlgorithmParameterSpec params, SecureRandom random, AlgorithmParameterSpec spec);
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 dcaf57c..60c59b1 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
@@ -1861,3 +1861,139 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna
}
#endif
#endif
+/* Header for class cz_crcs_ectester_standalone_libs_NettleLib */
+
+#ifndef _Included_cz_crcs_ectester_standalone_libs_NettleLib
+#define _Included_cz_crcs_ectester_standalone_libs_NettleLib
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class: cz_crcs_ectester_standalone_libs_NettleLib
+ * Method: createProvider
+ * Signature: ()Ljava/security/Provider;
+ */
+JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_createProvider
+ (JNIEnv *, jobject);
+
+/*
+ * Class: cz_crcs_ectester_standalone_libs_NettleLib
+ * Method: getCurves
+ * Signature: ()Ljava/util/Set;
+ */
+JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_getCurves
+ (JNIEnv *, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle */
+
+#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle
+#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle
+#ifdef __cplusplus
+extern "C" {
+#endif
+#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_serialVersionUID
+#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_serialVersionUID 1421746759512286392LL
+#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_MAX_ARRAY_SIZE
+#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_MAX_ARRAY_SIZE 2147483639L
+#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_KEYS
+#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_KEYS 0L
+#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_VALUES
+#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_VALUES 1L
+#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_ENTRIES
+#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_ENTRIES 2L
+#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_serialVersionUID
+#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_serialVersionUID 4112578634029874840LL
+#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_serialVersionUID
+#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_serialVersionUID -4298000515446427739LL
+/*
+ * Class: cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle
+ * Method: setup
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Nettle_setup
+ (JNIEnv *, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Nettle */
+
+#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Nettle
+#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Nettle
+#ifdef __cplusplus
+extern "C" {
+#endif
+#undef cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Nettle_DEFAULT_KEYSIZE
+#define cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Nettle_DEFAULT_KEYSIZE 256L
+/*
+ * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Nettle
+ * Method: generate
+ * Signature: (ILjava/security/SecureRandom;Ljava/security/spec/AlgorithmParameterSpec;)Ljava/security/KeyPair;
+ */
+JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Nettle_generate__ILjava_security_SecureRandom_2Ljava_security_spec_AlgorithmParameterSpec_2
+ (JNIEnv *, jobject, jint, jobject, jobject);
+
+/*
+ * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Nettle
+ * Method: generate
+ * Signature: (Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;Ljava/security/spec/AlgorithmParameterSpec;)Ljava/security/KeyPair;
+ */
+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 *, jobject, jobject, jobject, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Nettle */
+
+#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Nettle
+#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Nettle
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Nettle
+ * Method: generateSecret
+ * Signature: ([B[BLjava/security/spec/ECGenParameterSpec;)[B
+ */
+JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Nettle_generateSecret
+ (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Nettle */
+
+#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Nettle
+#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Nettle
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Nettle
+ * Method: sign
+ * Signature: ([B[BLjava/security/spec/ECGenParameterSpec;)[B
+ */
+JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Nettle_sign
+ (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject);
+
+/*
+ * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Nettle
+ * Method: verify
+ * Signature: ([B[B[BLjava/security/spec/ECGenParameterSpec;)Z
+ */
+JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Nettle_verify
+ (JNIEnv *, jobject, jbyteArray, jbyteArray, jbyteArray, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#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 48b8f26..24ba699 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
@@ -36,7 +36,6 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_create
}
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");
@@ -67,16 +66,6 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_getCur
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_from_name(JNIEnv *env, const char* curve_name) {
if (!curve_name) {
return NULL;
@@ -116,34 +105,6 @@ static const struct ecc_curve* create_curve_from_size(JNIEnv *env, jint keysize)
}
}
-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;
@@ -210,16 +171,15 @@ static jobject generate_from_curve(JNIEnv *env, const struct ecc_curve* curve, j
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) {
+JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Nettle_generate__ILjava_security_SecureRandom_2Ljava_security_spec_AlgorithmParameterSpec_2(JNIEnv *env, jobject self, jint keysize, jobject random, jobject spec) {
const struct ecc_curve* curve = create_curve_from_size(env, keysize);
if (!curve) {
throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
return NULL;
}
int byte_size = (keysize + 7) / 8;
- jobject result = generate_from_curve(env, curve, NULL, byte_size);
+ jobject result = generate_from_curve(env, curve, spec, byte_size);
return result;
- 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) {
@@ -280,7 +240,7 @@ int barray_to_privkey(JNIEnv *env, struct ecc_scalar* privKey, jbyteArray priv)
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) {
+JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Nettle_generateSecret(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);
@@ -339,11 +299,6 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKey
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;
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 c39ee54..1f82bb0 100644
--- a/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java
+++ b/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java
@@ -90,9 +90,6 @@ public class AppTests {
@MethodSource("libs")
@StdIo()
public void defaultSuite(String libName, StdOut out) {
- // TODO: "Nettle" is very broken here for a weird reason.
- assumeFalse(libName.equals("Nettle"));
-
String[] args = buildCLIArgs(libName, "default");
if (libName.equals("Botan") || libName.equals("Crypto++")) {
args = buildCLIArgs(libName, "default", "--kpg-type", "ECDH");
@@ -123,9 +120,6 @@ public class AppTests {
@ParameterizedTest
@MethodSource("libs")
public void performanceSuite(String libName) {
- // TODO: "Nettle" is very broken here for a weird reason.
- assumeFalse(libName.equals("Nettle"));
-
String[] args = buildCLIArgs(libName, "performance");
if (libName.equals("Botan") || libName.equals("Crypto++")) {
args = buildCLIArgs(libName, "performance", "--kpg-type", "ECDH");
@@ -172,9 +166,6 @@ public class AppTests {
@ParameterizedTest
@MethodSource("libs")
public void twistSuite(String libName) {
- // TODO: "Nettle" is very broken here for a weird reason.
- assumeFalse(libName.equals("Nettle"));
-
String[] args = buildCLIArgs(libName, "twist", "-q");
if (libName.equals("Botan") || libName.equals("Crypto++")) {
args = buildCLIArgs(libName, "twist", "--kpg-type", "ECDH", "-q");
@@ -185,9 +176,6 @@ public class AppTests {
@ParameterizedTest
@MethodSource("libs")
public void degenerateSuite(String libName) {
- // TODO: "Nettle" is very broken here for a weird reason.
- assumeFalse(libName.equals("Nettle"));
-
String[] args = buildCLIArgs(libName, "degenerate", "-q");
if (libName.equals("Botan") || libName.equals("Crypto++")) {
args = buildCLIArgs(libName, "degenerate", "--kpg-type", "ECDH", "-q");
@@ -255,9 +243,6 @@ public class AppTests {
@ParameterizedTest
@MethodSource("libs")
public void invalidSuite(String libName) {
- // TODO: "Nettle" is very broken here for a weird reason.
- assumeFalse(libName.equals("Nettle"));
-
String[] args = buildCLIArgs(libName, "invalid", "-q");
if (libName.equals("Botan") || libName.equals("Crypto++")) {
args = buildCLIArgs(libName, "invalid", "--kpg-type", "ECDH", "-q");
--
cgit v1.3.1
From 025d1f9db13e8eb72f28b743e5a8884b6d259a24 Mon Sep 17 00:00:00 2001
From: J08nY
Date: Mon, 20 May 2024 13:37:10 +0200
Subject: Fix bad param value in standalone wrong test suite.
---
common/src/main/java/cz/crcs/ectester/common/ec/CustomECFieldFp.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'common/src')
diff --git a/common/src/main/java/cz/crcs/ectester/common/ec/CustomECFieldFp.java b/common/src/main/java/cz/crcs/ectester/common/ec/CustomECFieldFp.java
index eafcb72..1fe6eb0 100644
--- a/common/src/main/java/cz/crcs/ectester/common/ec/CustomECFieldFp.java
+++ b/common/src/main/java/cz/crcs/ectester/common/ec/CustomECFieldFp.java
@@ -19,7 +19,7 @@ public class CustomECFieldFp extends ECFieldFp {
@Override
public int getFieldSize() {
- return p.bitCount();
+ return p.bitLength();
}
@Override
--
cgit v1.3.1
From 2ecf1379142f580730cfaf7ceaca18aeb7af9b40 Mon Sep 17 00:00:00 2001
From: J08nY
Date: Fri, 14 Jun 2024 12:44:47 +0200
Subject: Allow malformed sigs in nonce recovery.
---
.../main/java/cz/crcs/ectester/common/util/ECUtil.java | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
(limited to 'common/src')
diff --git a/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java b/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java
index 54c5131..907d75f 100644
--- a/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java
+++ b/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java
@@ -3,6 +3,9 @@ package cz.crcs.ectester.common.util;
import cz.crcs.ectester.common.ec.*;
import cz.crcs.ectester.data.EC_Store;
import org.bouncycastle.asn1.ASN1OctetString;
+import org.bouncycastle.asn1.ASN1Integer;
+import org.bouncycastle.asn1.ASN1Primitive;
+import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.crypto.signers.PlainDSAEncoding;
@@ -371,14 +374,18 @@ public class ECUtil {
}
// Parse signature
- BigInteger[] sigPair;
+ BigInteger r;
+ BigInteger s;
if (sigType.contains("CVC") || sigType.contains("PLAIN")) {
- sigPair = PlainDSAEncoding.INSTANCE.decode(n, signature);
+ BigInteger[] sigPair = PlainDSAEncoding.INSTANCE.decode(n, signature);
+ r = sigPair[0];
+ s = sigPair[1];
} else {
- sigPair = StandardDSAEncoding.INSTANCE.decode(n, signature);
+ ASN1Sequence seq = (ASN1Sequence)ASN1Primitive.fromByteArray(signature);
+ r = ((ASN1Integer)seq.getObjectAt(0)).getValue();
+ s = ((ASN1Integer)seq.getObjectAt(1)).getValue();
}
- BigInteger r = sigPair[0];
- BigInteger s = sigPair[1];
+
BigInteger rd = privkey.multiply(r).mod(n);
BigInteger hrd = hashInt.add(rd).mod(n);
--
cgit v1.3.1
From 99d463bd5f34ada3f6dcd92073960590b68afbb3 Mon Sep 17 00:00:00 2001
From: J08nY
Date: Fri, 14 Jun 2024 14:19:26 +0200
Subject: More detailed signature format tests.
---
.../java/cz/crcs/ectester/common/util/ECUtil.java | 39 ++++-
.../resources/cz/crcs/ectester/data/schema.xsd | 1 +
.../cz/crcs/ectester/data/wrong/results.xml | 163 +++++++++++++++++----
.../test/suites/StandaloneSignatureSuite.java | 2 +-
4 files changed, 170 insertions(+), 35 deletions(-)
(limited to 'common/src')
diff --git a/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java b/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java
index 907d75f..e7f138e 100644
--- a/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java
+++ b/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java
@@ -349,6 +349,39 @@ public class ECUtil {
return new KeyPair(pubkey, privkey);
}
+ /**
+ * Validate DER or PLAIN signature format.
+ *
+ * @throws IllegalArgumentException in case of invalid format.
+ * @param signature
+ * @param params
+ * @param hashAlgo
+ * @param sigType
+ */
+ public static void validateSignatureFormat(byte[] signature, ECParameterSpec params, String hashAlgo, String sigType) {
+ BigInteger n = params.getOrder();
+ try {
+ if (sigType.contains("CVC") || sigType.contains("PLAIN")) {
+ PlainDSAEncoding.INSTANCE.decode(n, signature);
+ } else {
+ StandardDSAEncoding.INSTANCE.decode(n, signature);
+ }
+ } catch (Exception e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ /**
+ * Recover the ECDSA signature nonce.
+ *
+ * @param signature
+ * @param data
+ * @param privkey
+ * @param params
+ * @param hashAlgo
+ * @param sigType
+ * @return The nonce.
+ */
public static BigInteger recoverSignatureNonce(byte[] signature, byte[] data, BigInteger privkey, ECParameterSpec params, String hashAlgo, String sigType) {
// We do not know how to reconstruct those nonces so far.
// sigType.contains("ECKCDSA") || sigType.contains("ECNR") || sigType.contains("SM2")
@@ -381,9 +414,9 @@ public class ECUtil {
r = sigPair[0];
s = sigPair[1];
} else {
- ASN1Sequence seq = (ASN1Sequence)ASN1Primitive.fromByteArray(signature);
- r = ((ASN1Integer)seq.getObjectAt(0)).getValue();
- s = ((ASN1Integer)seq.getObjectAt(1)).getValue();
+ ASN1Sequence seq = (ASN1Sequence) ASN1Primitive.fromByteArray(signature);
+ r = ((ASN1Integer) seq.getObjectAt(0)).getValue();
+ s = ((ASN1Integer) seq.getObjectAt(1)).getValue();
}
diff --git a/common/src/main/resources/cz/crcs/ectester/data/schema.xsd b/common/src/main/resources/cz/crcs/ectester/data/schema.xsd
index 99c9b76..245aa9a 100644
--- a/common/src/main/resources/cz/crcs/ectester/data/schema.xsd
+++ b/common/src/main/resources/cz/crcs/ectester/data/schema.xsd
@@ -82,6 +82,7 @@
+
diff --git a/common/src/main/resources/cz/crcs/ectester/data/wrong/results.xml b/common/src/main/resources/cz/crcs/ectester/data/wrong/results.xml
index e3f0967..af5d6dd 100644
--- a/common/src/main/resources/cz/crcs/ectester/data/wrong/results.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/results.xml
@@ -23,8 +23,9 @@
nok/random
- SHA1
+ *
0x30440220e641671e6415629dc8398e35ae1362cb647f293a92553b1594d57fff58df302c02206baafface035e3758eea0dd9ef734976c70b6dd06f4d81d33f5e28bfb8730624
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
@@ -32,8 +33,9 @@
nok/r0
- SHA1
- 0x3044022000000000000000000000000000000000000000000000000000000000000000000220d0837b07fe63d225733391e6808a081fd8aeb1359511feba7ca4f266727f968e
+ *
+ 0x30250201000220675e2eb20e1f1ec11c3016f7675d9a2e7a3c3370efde499ccb91920ab3da4ef3
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
@@ -41,8 +43,9 @@
nok/s0
- SHA1
- 0x304402206bea66d439da6b0b4a0e45b51e76d53336f27f7aa8e35f2008b77a8e021eff0a02200000000000000000000000000000000000000000000000000000000000000000
+ *
+ 0x302502206bea66d439da6b0b4a0e45b51e76d53336f27f7aa8e35f2008b77a8e021eff0a020100
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
@@ -50,8 +53,9 @@
nok/r1
- SHA1
- 0x3044022000000000000000000000000000000000000000000000000000000000000000010220e660f19ddc20a30adda6ca175577b492e238ef8734b904a31045d453825974d4
+ *
+ 0x302502010102203494a201a1a539189253c5eab77d1cb99ce1b154c642acc85a956cf2eec2bb3f
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
@@ -59,8 +63,9 @@
nok/s1
- SHA1
- 0x30440220d30ab3301d7132edbead77c0d622bbb7be8626c9ac5ee6c536281e6c18e79ab002200000000000000000000000000000000000000000000000000000000000000001
+ *
+ 0x302502201ee448a2ce4695ac5b71d89553e3dd9688f33041f64aa9aed49c269f6f943c25020101
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
@@ -68,8 +73,9 @@
nok/r0s0
- SHA1
- 0x30440220000000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000000
+ *
+ 0x3006020100020100
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
@@ -77,8 +83,9 @@
nok/r0s1
- SHA1
- 0x30440220000000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000001
+ *
+ 0x3006020100020101
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
@@ -86,8 +93,9 @@
nok/r1s0
- SHA1
- 0x30440220000000000000000000000000000000000000000000000000000000000000000102200000000000000000000000000000000000000000000000000000000000000000
+ *
+ 0x3006020101020100
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
@@ -95,35 +103,119 @@
nok/r1s1
- SHA1
- 0x30440220000000000000000000000000000000000000000000000000000000000000000102200000000000000000000000000000000000000000000000000000000000000001
+ *
+ 0x3006020101020101
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
Well-formed invalid signature with r = 1 and s = 1.
+
+ nok/r0_padded
+ *
+ 0x3044022000000000000000000000000000000000000000000000000000000000000000000220675e2eb20e1f1ec11c3016f7675d9a2e7a3c3370efde499ccb91920ab3da4ef3
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
+ secg/secp256r1
+ wrong/default_priv
+ wrong/default_pub
+ Malformed (zero-padded) invalid signature with r = 0.
+
+
+ nok/s0_padded
+ *
+ 0x304402206bea66d439da6b0b4a0e45b51e76d53336f27f7aa8e35f2008b77a8e021eff0a02200000000000000000000000000000000000000000000000000000000000000000
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
+ secg/secp256r1
+ wrong/default_priv
+ wrong/default_pub
+ Malformed (zero-padded) invalid signature with s = 0.
+
+
+ nok/r1_padded
+ *
+ 0x30440220000000000000000000000000000000000000000000000000000000000000000102203494a201a1a539189253c5eab77d1cb99ce1b154c642acc85a956cf2eec2bb3f
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
+ secg/secp256r1
+ wrong/default_priv
+ wrong/default_pub
+ Malformed (zero-padded) invalid signature with r = 1.
+
+
+ nok/s1_padded
+ *
+ 0x304402201ee448a2ce4695ac5b71d89553e3dd9688f33041f64aa9aed49c269f6f943c2502200000000000000000000000000000000000000000000000000000000000000001
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
+ secg/secp256r1
+ wrong/default_priv
+ wrong/default_pub
+ Malformed (zero-padded) invalid signature with s = 1.
+
+
+ nok/r0s0_padded
+ *
+ 0x30440220000000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000000
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
+ secg/secp256r1
+ wrong/default_priv
+ wrong/default_pub
+ Malformed (zero-padded) invalid signature with r = 0 and s = 0.
+
+
+ nok/r0s1_padded
+ *
+ 0x30440220000000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000001
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
+ secg/secp256r1
+ wrong/default_priv
+ wrong/default_pub
+ Malformed (zero-padded) invalid signature with r = 0 and s = 1.
+
+
+ nok/r1s0_padded
+ *
+ 0x30440220000000000000000000000000000000000000000000000000000000000000000102200000000000000000000000000000000000000000000000000000000000000000
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
+ secg/secp256r1
+ wrong/default_priv
+ wrong/default_pub
+ Malformed (zero-padded) invalid signature with r = 1 and s = 0.
+
+
+ nok/r1s1_padded
+ *
+ 0x30440220000000000000000000000000000000000000000000000000000000000000000102200000000000000000000000000000000000000000000000000000000000000001
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
+ secg/secp256r1
+ wrong/default_priv
+ wrong/default_pub
+ Malformed (zero-padded) invalid signature with r = 1 and s = 1.
+
nok/sp
- SHA1
+ *
0x30440220fc48281b60b73752f3e20c25e8a06b335122d5890db28d2969d3145fcd384e7b0220ffffffff00000001000000000000000000000000ffffffffffffffffffffffff
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
- Well-formed invalid signature s = p.
+ Malformed (zero-padded) invalid signature s = p.
nok/s2p
- SHA1
+ *
0x30450220feba982489753a51a69fd582673d2e62b6b07cc6374237c1424f1e469cb00a98022101fffffffe00000002000000000000000000000001fffffffffffffffffffffffe
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
- Well-formed invalid signature with s = 2 * p.
+ Malformed (zero-padded) invalid signature with s = 2 * p.
nok/length_overflow16
- SHA1
+ *
0x3083ff000002203988322ab9f52c7f11d5d1aa92a2ac0b00275bcad8e934682257323fda672482022052231597382268e8f3b82b99e386ebb7c7db1a8b4a8bdacd496190314e4c5bad
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
@@ -131,8 +223,9 @@
nok/length_overflow32
- SHA1
+ *
0x3085ff0000000002203988322ab9f52c7f11d5d1aa92a2ac0b00275bcad8e934682257323fda672482022052231597382268e8f3b82b99e386ebb7c7db1a8b4a8bdacd496190314e4c5bad
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
@@ -140,8 +233,9 @@
nok/length_overflow64
- SHA1
+ *
0x3089ff000000000000000002203988322ab9f52c7f11d5d1aa92a2ac0b00275bcad8e934682257323fda672482022052231597382268e8f3b82b99e386ebb7c7db1a8b4a8bdacd496190314e4c5bad
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
@@ -149,8 +243,9 @@
nok/length_indefinite
- SHA1
+ *
0x308002203988322ab9f52c7f11d5d1aa92a2ac0b00275bcad8e934682257323fda672482022052231597382268e8f3b82b99e386ebb7c7db1a8b4a8bdacd496190314e4c5bad
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
@@ -158,8 +253,9 @@
nok/long
- SHA1
+ *
0x30420220e641671e6415629dc8398e35ae1362cb647f293a92553b1594d57fff58df302c02206baafface035e3758eea0dd9ef734976c70b6dd06f4d81d33f5e28bfb8730624
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
@@ -167,8 +263,9 @@
nok/short
- SHA1
+ *
0x30460220e641671e6415629dc8398e35ae1362cb647f293a92553b1594d57fff58df302c02206baafface035e3758eea0dd9ef734976c70b6dd06f4d81d33f5e28bfb8730624
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
@@ -176,8 +273,9 @@
nok/long_r
- SHA1
+ *
0x3044021ee641671e6415629dc8398e35ae1362cb647f293a92553b1594d57fff58df302c02206baafface035e3758eea0dd9ef734976c70b6dd06f4d81d33f5e28bfb8730624
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
@@ -185,8 +283,9 @@
nok/long_s
- SHA1
+ *
0x30440220e641671e6415629dc8398e35ae1362cb647f293a92553b1594d57fff58df302c021e6baafface035e3758eea0dd9ef734976c70b6dd06f4d81d33f5e28bfb8730624
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
@@ -194,8 +293,9 @@
nok/short_r
- SHA1
+ *
0x30440222e641671e6415629dc8398e35ae1362cb647f293a92553b1594d57fff58df302c02206baafface035e3758eea0dd9ef734976c70b6dd06f4d81d33f5e28bfb8730624
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
@@ -203,8 +303,9 @@
nok/short_s
- SHA1
+ *
0x30440220e641671e6415629dc8398e35ae1362cb647f293a92553b1594d57fff58df302c02226baafface035e3758eea0dd9ef734976c70b6dd06f4d81d33f5e28bfb8730624
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneSignatureSuite.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneSignatureSuite.java
index bafaa90..8e5e452 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneSignatureSuite.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneSignatureSuite.java
@@ -73,7 +73,7 @@ public class StandaloneSignatureSuite extends StandaloneTestSuite {
}
private void ecdsaTest(EC_SigResult sig, SignatureIdent sigIdent, Result.ExpectedValue expected, byte[] defaultData) throws NoSuchAlgorithmException {
- if (!sig.getSig().equals(sigIdent.getHashAlgo())) {
+ if (!sig.getSig().equals(sigIdent.getHashAlgo()) && !sig.getSig().equals("*")) {
doTest(CompoundTest.all(Result.ExpectedValue.SUCCESS, "ECDSA test of " + sig.getId() + " not applicable."));
return;
}
--
cgit v1.3.1
From aa0406801665327087968e9e19c4140b6471970e Mon Sep 17 00:00:00 2001
From: J08nY
Date: Fri, 14 Jun 2024 14:29:27 +0200
Subject: Only output "Running logs" when in console.
---
.../cz/crcs/ectester/common/output/BaseTextTestWriter.java | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
(limited to 'common/src')
diff --git a/common/src/main/java/cz/crcs/ectester/common/output/BaseTextTestWriter.java b/common/src/main/java/cz/crcs/ectester/common/output/BaseTextTestWriter.java
index 4670f95..1c7e4d4 100644
--- a/common/src/main/java/cz/crcs/ectester/common/output/BaseTextTestWriter.java
+++ b/common/src/main/java/cz/crcs/ectester/common/output/BaseTextTestWriter.java
@@ -115,19 +115,19 @@ public abstract class BaseTextTestWriter implements TestWriter {
@Override
public void beginTest(Test t) {
- if (t instanceof CompoundTest) {
- CompoundTest test = (CompoundTest) t;
- } else {
- SimpleTest extends BaseTestable> test = (SimpleTest extends BaseTestable>) t;
+ if (System.console() != null) {
+ output.print("Running ▶ " + t.getDescription());
+ output.flush();
}
- output.print("Running ▶ " + t.getDescription());
- output.flush();
}
@Override
public void endTest(Test t) {
- output.print("\33[2K\r");
+ if (System.console() != null) {
+ output.print("\33[2K\r");
+ output.flush();
+ }
}
@Override
--
cgit v1.3.1
From b2e85d46c029965f76e5f93b11e33cf782386f33 Mon Sep 17 00:00:00 2001
From: J08nY
Date: Fri, 14 Jun 2024 14:33:15 +0200
Subject: Fix points on composite order curves.
Fixes #27.
---
.../main/resources/cz/crcs/ectester/data/cofactor/cofactor128p65535.csv | 2 +-
common/src/main/resources/cz/crcs/ectester/data/cofactor/keys.xml | 2 +-
.../main/resources/cz/crcs/ectester/data/composite/composite192_pq2.csv | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
(limited to 'common/src')
diff --git a/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p65535.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p65535.csv
index 54da6cc..fb16cdb 100644
--- a/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p65535.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p65535.csv
@@ -1 +1 @@
-0xdd94e89ef3fba74afc2a67cb91546a93,0x6cf4828ab4960df2b9fcab3990e3959a,0x80a5c32206c83f769c5ed3e4f5b2ea4e,0xd7a4bb4b7e9ad9e81895caeaeac8b739,0x45ebc51cf353974b02b36b9912de041b,0x0000dd95c634ba30617af48fd4eb321b,0xffff
\ No newline at end of file
+0xdd94e89ef3fba74afc2a67cb91546a93,0x6cf4828ab4960df2b9fcab3990e3959a,0x80a5c32206c83f769c5ed3e4f5b2ea4e,0x91e251594dab368b04d7dd6d9b99fdef,0xa7da97b3ba62ac554f7202d4f0348133,0x0000dd95c634ba30617af48fd4eb321b,0xffff
\ No newline at end of file
diff --git a/common/src/main/resources/cz/crcs/ectester/data/cofactor/keys.xml b/common/src/main/resources/cz/crcs/ectester/data/cofactor/keys.xml
index d6058f0..1b5ec4b 100644
--- a/common/src/main/resources/cz/crcs/ectester/data/cofactor/keys.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/keys.xml
@@ -668,7 +668,7 @@
pq/cofactor192/1
- 0x6366613b66339fa580f390d630ccf9b535437229aa8b61cd,0x1b975fa3848bd68f34f6a08b7cf190bcaeaf9782270e2413
+ 0x28f5b96b08f9dbe661472dbf8e5925b944e42ac5fdfdb2da,0x227e8b2a9b07d1cd67211d4b933bf43eefbb7140e5a65dca
composite/pq/composite192/1
cofactor order = 0x00000000000000000000035efd8bad55038e6bd22db8b805
diff --git a/common/src/main/resources/cz/crcs/ectester/data/composite/composite192_pq2.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite192_pq2.csv
index 33fe0f3..c92dcb2 100644
--- a/common/src/main/resources/cz/crcs/ectester/data/composite/composite192_pq2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite192_pq2.csv
@@ -1 +1 @@
-0xa261fff62647eebf810a404f0c80a971dd7c7838fdc52b5b,0x87502ebb62d26e1eca06c434f8ef069dfb2c287d6183750c,0x4ad6ce1f16e1bfc3d40f0027d787aeadb53846d69099a883,0x6366613b66339fa580f390d630ccf9b535437229aa8b61cd,0x1b975fa3848bd68f34f6a08b7cf190bcaeaf9782270e2413,0x00000000000000000000035efd8bad55038e6bd22db8b805,0x01
\ No newline at end of file
+0xa261fff62647eebf810a404f0c80a971dd7c7838fdc52b5b,0x87502ebb62d26e1eca06c434f8ef069dfb2c287d6183750c,0x4ad6ce1f16e1bfc3d40f0027d787aeadb53846d69099a883,0x16a5b79035a1e561aae737dc7f32f3c03d5f03f73bd405e4,0x3ddad60cc20b136913dcab69a30e5b71e0bf11f859658524,0x00000000000000000000035efd8bad55038e6bd22db8b805,0x01
\ No newline at end of file
--
cgit v1.3.1
From 6c333be59a328dcca776acfbd73f3bd332b8563d Mon Sep 17 00:00:00 2001
From: J08nY
Date: Sat, 15 Jun 2024 12:07:01 +0200
Subject: Cleaner output of compound tests.
---
.../ectester/common/output/BaseTextTestWriter.java | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
(limited to 'common/src')
diff --git a/common/src/main/java/cz/crcs/ectester/common/output/BaseTextTestWriter.java b/common/src/main/java/cz/crcs/ectester/common/output/BaseTextTestWriter.java
index 1c7e4d4..538539b 100644
--- a/common/src/main/java/cz/crcs/ectester/common/output/BaseTextTestWriter.java
+++ b/common/src/main/java/cz/crcs/ectester/common/output/BaseTextTestWriter.java
@@ -51,11 +51,13 @@ public abstract class BaseTextTestWriter implements TestWriter {
private String testString(Test t, String prefix, int index) {
boolean compound = t instanceof CompoundTest;
+ boolean cont = compound ? ((CompoundTest) t).getStartedTests().length > 0 : false;
+ boolean root = prefix.equals("");
Result result = t.getResult();
String line = "";
- if (prefix.equals("")) {
+ if (root) {
char[] charLine = new char[BASE_WIDTH + 24];
new String(new char[BASE_WIDTH + 24]).replace("\0", "━").getChars(0, charLine.length - 1, charLine, 0);
charLine[0] = '■';
@@ -68,10 +70,20 @@ public abstract class BaseTextTestWriter implements TestWriter {
StringBuilder out = new StringBuilder();
out.append(t.ok() ? Colors.ok(" OK ") : Colors.error("NOK "));
- out.append(compound ? (prefix.equals("") ? "╋ " : "┳ ") : "━ ");
+ String marker;
+ if (compound) {
+ if (root) {
+ marker = cont ? "╋" : "┻";
+ } else {
+ marker = cont ? "┳" : "━";
+ }
+ } else {
+ marker = "━";
+ }
+ out.append(marker + " ");
int width = BASE_WIDTH - (prefix.length() + 6);
String widthSpec = "%-" + width + "s";
- String desc = ((prefix.equals("")) ? "(" + index + ") " : "") + t.getDescription();
+ String desc = ((root) ? "(" + index + ") " : "") + t.getDescription();
out.append(String.format(widthSpec, desc));
out.append(" ┃ ");
Colors.Foreground valueColor;
--
cgit v1.3.1
From 9b51ac854de9d9fbf3b884d1cb65f80927cbd6be Mon Sep 17 00:00:00 2001
From: J08nY
Date: Sat, 15 Jun 2024 12:07:33 +0200
Subject: More signature tests.
---
.../cz/crcs/ectester/data/wrong/results.xml | 48 ++++++++++++++++++++--
1 file changed, 44 insertions(+), 4 deletions(-)
(limited to 'common/src')
diff --git a/common/src/main/resources/cz/crcs/ectester/data/wrong/results.xml b/common/src/main/resources/cz/crcs/ectester/data/wrong/results.xml
index af5d6dd..18302b1 100644
--- a/common/src/main/resources/cz/crcs/ectester/data/wrong/results.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/results.xml
@@ -11,6 +11,16 @@
wrong/default_pub
A correct signature by the default key.
+
+ nok/malleable/s+n
+ SHA1
+ 0x304502203988322ab9f52c7f11d5d1aa92a2ac0b00275bcad8e934682257323fda67248202210152231596382268e9f3b82b99e386ebb784c21538f1a379523d1b5af44aaf80fe
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
+ secg/secp256r1
+ wrong/default_priv
+ wrong/default_pub
+ A correct signature modified by adding n to s.
+
nok/negated
SHA1
@@ -194,22 +204,52 @@
nok/sp
*
- 0x30440220fc48281b60b73752f3e20c25e8a06b335122d5890db28d2969d3145fcd384e7b0220ffffffff00000001000000000000000000000000ffffffffffffffffffffffff
+ 0x304502207c48281b60b73752f3e20c25e8a06b335122d5890db28d2969d3145fcd384e7b022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff
0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
- Malformed (zero-padded) invalid signature s = p.
+ Well-formed invalid signature s = p.
nok/s2p
*
- 0x30450220feba982489753a51a69fd582673d2e62b6b07cc6374237c1424f1e469cb00a98022101fffffffe00000002000000000000000000000001fffffffffffffffffffffffe
+ 0x304502207eba982489753a51a69fd582673d2e62b6b07cc6374237c1424f1e469cb00a98022101fffffffe00000002000000000000000000000001fffffffffffffffffffffffe
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
+ secg/secp256r1
+ wrong/default_priv
+ wrong/default_pub
+ Well-formed invalid signature with s = 2 * p.
+
+
+ nok/sn
+ *
+ 0x304502207c48281b60b73752f3e20c25e8a06b335122d5890db28d2969d3145fcd384e7b022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
+ secg/secp256r1
+ wrong/default_priv
+ wrong/default_pub
+ Well-formed invalid signature s = n.
+
+
+ nok/rnsn
+ *
+ 0x3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551
+ 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
+ secg/secp256r1
+ wrong/default_priv
+ wrong/default_pub
+ Well-formed invalid signature r = n and s = n.
+
+
+ nok/s2n
+ *
+ 0x304502207eba982489753a51a69fd582673d2e62b6b07cc6374237c1424f1e469cb00a98022101fffffffe00000002000000000000000000000001fffffffffffffffffffffffe
0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
secg/secp256r1
wrong/default_priv
wrong/default_pub
- Malformed (zero-padded) invalid signature with s = 2 * p.
+ Well-formed invalid signature with s = 2 * n.
nok/length_overflow16
--
cgit v1.3.1
From 9c2b3c836bddddd9486d7ed74b5a95af683ff83e Mon Sep 17 00:00:00 2001
From: J08nY
Date: Fri, 21 Jun 2024 14:23:31 +0200
Subject: Always write shims to shim directory, do not check for freshness.
---
.../src/main/java/cz/crcs/ectester/common/util/FileUtil.java | 11 +++++++++++
ext/boringssl | 2 +-
.../java/cz/crcs/ectester/standalone/ECTesterStandalone.java | 6 +++---
.../cz/crcs/ectester/standalone/libs/NativeECLibrary.java | 4 ++--
4 files changed, 17 insertions(+), 6 deletions(-)
(limited to 'common/src')
diff --git a/common/src/main/java/cz/crcs/ectester/common/util/FileUtil.java b/common/src/main/java/cz/crcs/ectester/common/util/FileUtil.java
index e6e319b..da682b6 100644
--- a/common/src/main/java/cz/crcs/ectester/common/util/FileUtil.java
+++ b/common/src/main/java/cz/crcs/ectester/common/util/FileUtil.java
@@ -81,6 +81,17 @@ public class FileUtil {
return true;
}
+ public static boolean write(String resourcePath, Path outPath) throws IOException {
+ URL reqURL = FileUtil.class.getResource(resourcePath);
+ if (reqURL == null) {
+ return false;
+ }
+ URLConnection reqConn = reqURL.openConnection();
+ Files.copy(reqConn.getInputStream(), outPath, StandardCopyOption.REPLACE_EXISTING);
+ reqConn.getInputStream().close();
+ return true;
+ }
+
public static Path getLibDir() {
return getAppData().resolve("ECTesterStandalone");
}
diff --git a/ext/boringssl b/ext/boringssl
index 80a243e..67422ed 160000
--- a/ext/boringssl
+++ b/ext/boringssl
@@ -1 +1 @@
-Subproject commit 80a243e07ef77156af66efa7d22ac35aba44c1b3
+Subproject commit 67422ed4434116daa8898773692165ddd51a6ac2
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 2b9a853..10e95ca 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/ECTesterStandalone.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/ECTesterStandalone.java
@@ -103,12 +103,12 @@ public class ECTesterStandalone {
reqs.toFile().mkdirs();
if (!System.getProperty("os.name").startsWith("Windows")) {
- FileUtil.writeNewer(LIB_RESOURCE_DIR + "lib_timing.so", reqs.resolve("lib_timing.so"));
+ FileUtil.write(LIB_RESOURCE_DIR + "lib_timing.so", reqs.resolve("lib_timing.so"));
System.load(reqs.resolve("lib_timing.so").toString());
- FileUtil.writeNewer(LIB_RESOURCE_DIR + "lib_csignals.so", reqs.resolve("lib_csignals.so"));
+ FileUtil.write(LIB_RESOURCE_DIR + "lib_csignals.so", reqs.resolve("lib_csignals.so"));
System.load(reqs.resolve("lib_csignals.so").toString());
- FileUtil.writeNewer(LIB_RESOURCE_DIR + "lib_cppsignals.so", reqs.resolve("lib_cppsignals.so"));
+ FileUtil.write(LIB_RESOURCE_DIR + "lib_cppsignals.so", reqs.resolve("lib_cppsignals.so"));
System.load(reqs.resolve("lib_cppsignals.so").toString());
}
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 7f9d96e..c11dbdb 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
@@ -33,7 +33,7 @@ public abstract class NativeECLibrary extends ProviderECLibrary {
Path libPath = libDir.resolve(resource + "." + suffix);
/* Write the shim. */
- boolean found = FileUtil.writeNewer(ECTesterStandalone.LIB_RESOURCE_DIR + resource + "." + suffix, libPath);
+ boolean found = FileUtil.write(ECTesterStandalone.LIB_RESOURCE_DIR + resource + "." + suffix, libPath);
if (!found) {
return false;
}
@@ -44,7 +44,7 @@ public abstract class NativeECLibrary extends ProviderECLibrary {
if (requirement.endsWith(suffix)) {
/* The requirement is bundled, write it */
Path reqPath = libReqDir.resolve(requirement);
- found = FileUtil.writeNewer(ECTesterStandalone.LIB_RESOURCE_DIR + requirement, reqPath);
+ found = FileUtil.write(ECTesterStandalone.LIB_RESOURCE_DIR + requirement, reqPath);
if (!found) {
return false;
}
--
cgit v1.3.1