diff --git a/common/build.gradle.kts b/common/build.gradle.kts
index 1aff0d76..ee302471 100644
--- a/common/build.gradle.kts
+++ b/common/build.gradle.kts
@@ -20,6 +20,11 @@ dependencies {
api("org.yaml:snakeyaml:2.2")
// https://mvnrepository.com/artifact/com.klinec/jcardsim
api("com.klinec:jcardsim:3.0.5.11")
+
+ testImplementation(platform("org.junit:junit-bom:5.10.2"))
+ testImplementation("org.junit.jupiter:junit-jupiter")
+ testImplementation("org.junit-pioneer:junit-pioneer:2.2.0")
+ testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}
java {
diff --git a/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous521.csv b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous521.csv
index e0d935eb..2f7eb22b 100644
--- a/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous521.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous521.csv
@@ -1 +1 @@
-0x1dcf4a3c1f9ac39550c7eb7bfb1dd6c345658a277d888d9b23273aac2914cde52ee7e8f424767d62fd266d46491d805564f32919b265d784941d61eefa43da0501f,0x14fb5e18b58eaa6e879edb5542e5c1e1140a0cb1df41c49b5d4be6b7abdaf2afd7a22b8bc95711dd9196968677a1edf9a99e60db654ad62755904ee34b592db2838,0x1c543ff6f595aaf4651f0315c95b1f433b9aa3b5be69f300d4a7f4441bb3331781fbc9527b62fe60d4eb7aaedb2cd50ea4a8ad70ab2935bf8e129cf6ffc30ec027c,0x11fd1c6612169a69250632396ec192b97490c6af601f2d0b2ffad81a2a8772c8f8c0ac6cf273335aed6852fda2a3fb0b32a366ad19662513751412d9d2e168c144d,0x11c894ae2c3647cae6ca89b7c090bf19a52781bddbebb2a21b4123cf16445f7bca20aa1fac5a0228c37e8b89c974c5a659810d29afa96f48cdca6ba77baa88fbac,0x1dcf4a3c1f9ac39550c7eb7bfb1dd6c345658a277d888d9b23273aac2914cde52ee7e8f424767d62fd266d46491d805564f32919b265d784941d61eefa43da0501f,0x1
\ No newline at end of file
+0x1dcf4a3c1f9ac39550c7eb7bfb1dd6c345658a277d888d9b23273aac2914cde52ee7e8f424767d62fd266d46491d805564f32919b265d784941d61eefa43da0501f,0x14fb5e18b58eaa6e879edb5542e5c1e1140a0cb1df41c49b5d4be6b7abdaf2afd7a22b8bc95711dd9196968677a1edf9a99e60db654ad62755904ee34b592db2838,0x1c543ff6f595aaf4651f0315c95b1f433b9aa3b5be69f300d4a7f4441bb3331781fbc9527b62fe60d4eb7aaedb2cd50ea4a8ad70ab2935bf8e129cf6ffc30ec027c,0x11fd1c6612169a69250632396ec192b97490c6af601f2d0b2ffad81a2a8772c8f8c0ac6cf273335aed6852fda2a3fb0b32a366ad19662513751412d9d2e168c144d,0x0011c894ae2c3647cae6ca89b7c090bf19a52781bddbebb2a21b4123cf16445f7bca20aa1fac5a0228c37e8b89c974c5a659810d29afa96f48cdca6ba77baa88fbac,0x1dcf4a3c1f9ac39550c7eb7bfb1dd6c345658a277d888d9b23273aac2914cde52ee7e8f424767d62fd266d46491d805564f32919b265d784941d61eefa43da0501f,0x1
\ No newline at end of file
diff --git a/common/src/main/resources/cz/crcs/ectester/data/gost/gost256.csv b/common/src/main/resources/cz/crcs/ectester/data/gost/gost256.csv
index baea45aa..32f6f32c 100644
--- a/common/src/main/resources/cz/crcs/ectester/data/gost/gost256.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/gost/gost256.csv
@@ -1 +1 @@
-0x8000000000000000000000000000000000000000000000000000000000000431,0x7,0x5fbff498aa938ce739b8e022fbafef40563f6e6a3472fc2a514c0ce9dae23b7e,0x2,0x8e2a8a0e65147d4bd6316030e16d19c85c97f0a9ca267122b96abbcea7e8fc8,0x8000000000000000000000000000000150fe8a1892976154c59cfc193accf5b3,0x1
\ No newline at end of file
+0x8000000000000000000000000000000000000000000000000000000000000431,0x7,0x5fbff498aa938ce739b8e022fbafef40563f6e6a3472fc2a514c0ce9dae23b7e,0x000000000000000000000000000000000000000000000000000000000000002,0x8e2a8a0e65147d4bd6316030e16d19c85c97f0a9ca267122b96abbcea7e8fc8,0x8000000000000000000000000000000150fe8a1892976154c59cfc193accf5b3,0x1
\ No newline at end of file
diff --git a/common/src/main/resources/cz/crcs/ectester/data/invalid/nist/k233.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/nist/k233.xml
index 250c9df8..2c080a4e 100644
--- a/common/src/main/resources/cz/crcs/ectester/data/invalid/nist/k233.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/nist/k233.xml
@@ -55,7 +55,7 @@
k233/9
- 0x0193d8ff00ac50effd52134acd2f15c51e452727a948b310c367328dcc,0x01bed4420061e99f86f9e4f87092dde4f9a0f8ffb91164f175619ed01f8d
+ 0x00193d8ff00ac50effd52134acd2f15c51e452727a948b310c367328dcc,0x01bed4420061e99f86f9e4f87092dde4f9a0f8ffb91164f175619ed01f8d
nist/K-233
invalid order = 29
diff --git a/common/src/main/resources/cz/crcs/ectester/data/misc/keys.xml b/common/src/main/resources/cz/crcs/ectester/data/misc/keys.xml
index e17b45b1..7aebc636 100644
--- a/common/src/main/resources/cz/crcs/ectester/data/misc/keys.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/misc/keys.xml
@@ -14,7 +14,7 @@
compression/128/non-residue
- 0xb6707fa8afeddf79b9579e8dda4eaf51,0x000000000000000000000000000000
+ 0xb6707fa8afeddf79b9579e8dda4eaf51,0x0000000000000000000000000000000
secg/secp128r1
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
index 4e7c30ec..d185ff5e 100644
--- a/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo521.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/pseudo521.csv
@@ -1 +1 @@
-0x153212291c26fe063b78bbca97d35dda6b0b349fe3fc1d4dee21786fc85296e22d93ce855a2d3ed048498c6a1f378cea240f029df302cffb658efe9e12379629acb,0x5a4b83e21db14397282aab529b230058a165962eadf8e8f15703ca5b91501463fc8bf866d7f1a2ce785c4ff0c5797e20e3fb6952bd42e3421ed1c589b2853a0c30,0x1196a7bc6d754b0224fcace252f9056acebba295a7a0763a95fd0fa90cca4bbcc1d030cbee049d06e103bb28c8b870a1d5989d9c56870ff7fde969f3bfd0278fbf7,0xd74e5bf4d166a2d75d57d49be58f9bf3900bda81bbb283a8f311d9972c7cd1ed547403b52c657af133297f852f938b6a7ba8ef52c2ca8eb79799b15f7123c5d2af,0x7ed2303056596fb09cfade2ca0f691c515da266565ba5afa4700c6c6ed38091f3cf4fdc67ee1426b849bb9be26c1e8c3b53530fc4510dad8b7badc81bad7276c5b,0x153212291c26fe063b78bc114fd2c18a365faa9b5b3fecbb87c2690125099ddd8baa5052aa2fda7f14120d3d6af0ac185902f97bae06a009588286cf5ce93b1cce3,0x0001
\ No newline at end of file
+0x153212291c26fe063b78bbca97d35dda6b0b349fe3fc1d4dee21786fc85296e22d93ce855a2d3ed048498c6a1f378cea240f029df302cffb658efe9e12379629acb,0x5a4b83e21db14397282aab529b230058a165962eadf8e8f15703ca5b91501463fc8bf866d7f1a2ce785c4ff0c5797e20e3fb6952bd42e3421ed1c589b2853a0c30,0x1196a7bc6d754b0224fcace252f9056acebba295a7a0763a95fd0fa90cca4bbcc1d030cbee049d06e103bb28c8b870a1d5989d9c56870ff7fde969f3bfd0278fbf7,0x00d74e5bf4d166a2d75d57d49be58f9bf3900bda81bbb283a8f311d9972c7cd1ed547403b52c657af133297f852f938b6a7ba8ef52c2ca8eb79799b15f7123c5d2af,0x007ed2303056596fb09cfade2ca0f691c515da266565ba5afa4700c6c6ed38091f3cf4fdc67ee1426b849bb9be26c1e8c3b53530fc4510dad8b7badc81bad7276c5b,0x153212291c26fe063b78bc114fd2c18a365faa9b5b3fecbb87c2690125099ddd8baa5052aa2fda7f14120d3d6af0ac185902f97bae06a009588286cf5ce93b1cce3,0x0001
\ No newline at end of file
diff --git a/common/src/test/java/cz/crcs/ectester/common/CardIntegerPaddingTests.java b/common/src/test/java/cz/crcs/ectester/common/CardIntegerPaddingTests.java
new file mode 100644
index 00000000..560935f6
--- /dev/null
+++ b/common/src/test/java/cz/crcs/ectester/common/CardIntegerPaddingTests.java
@@ -0,0 +1,114 @@
+package cz.crcs.ectester.common;
+
+import cz.crcs.ectester.common.ec.*;
+import cz.crcs.ectester.data.EC_Store;
+import org.junit.jupiter.api.Test;
+import org.opentest4j.AssertionFailedError;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class CardIntegerPaddingTests {
+
+ @Test
+ public void testKeys() {
+ EC_Store store = EC_Store.getInstance();
+ Map categories = store.getCategories();
+ List errors = new ArrayList<>();
+
+ for (EC_Category category : categories.values()) {
+ Map objects = category.getObjects();
+ List keys = new ArrayList<>();
+ for (EC_Data object : objects.values()) {
+ if (object instanceof EC_Key) {
+ EC_Key key = (EC_Key) object;
+ keys.add(key);
+ }
+ }
+ Map> keyMap = EC_Store.mapKeyToCurve(keys);
+ for (EC_Curve curve : keyMap.keySet()) {
+ List curveKeys = keyMap.get(curve);
+ int bits = curve.getBits();
+ int bytes = (bits + 7) / 8;
+ for (EC_Key key : curveKeys) {
+ if (key instanceof EC_Key.Private) {
+ continue;
+ }
+ byte[][] data = key.getData();
+ byte[] xCoord = data[0];
+ byte[] yCoord = data[1];
+ try {
+ assertEquals(bytes, xCoord.length, "Curve: " + curve.getId() + ", Key: " + category.getName() + "/" + key.getId() + " (x)");
+ } catch (AssertionFailedError e) {
+ errors.add(e);
+ }
+ try {
+ assertEquals(bytes, yCoord.length, "Curve: " + curve.getId() + ", Key: " + category.getName() + "/" + key.getId() + " (y)");
+ } catch (AssertionFailedError e) {
+ errors.add(e);
+ }
+ }
+ }
+ }
+
+ if (!errors.isEmpty()) {
+ StringBuilder sb = new StringBuilder("There were assertion errors:\n");
+ for (AssertionFailedError error : errors) {
+ sb.append(error.getMessage()).append("\n");
+ }
+ AssertionFailedError e = new AssertionFailedError(sb.toString());
+ for (AssertionFailedError error : errors) {
+ e.addSuppressed(error);
+ }
+ throw e;
+ }
+ }
+
+ @Test
+ public void testCurves() {
+ EC_Store store = EC_Store.getInstance();
+ Map categories = store.getCategories();
+ List errors = new ArrayList<>();
+
+ for (EC_Category category : categories.values()) {
+ Map objects = category.getObjects();
+ for (EC_Data object : objects.values()) {
+ if (object instanceof EC_Curve) {
+ EC_Curve curve = (EC_Curve) object;
+ if (curve.getField() == EC_Consts.ALG_EC_FP) {
+ int bits = curve.getBits();
+ int bytes = (bits + 7) / 8;
+ byte[][] generator = curve.getParam(EC_Consts.PARAMETER_G);
+ byte[] xCoord = generator[0];
+ byte[] yCoord = generator[1];
+ try {
+ assertEquals(bytes, xCoord.length, "Curve: " + category.getName() + "/" + curve.getId() + " (generator x)");
+ } catch (AssertionFailedError e) {
+ errors.add(e);
+ }
+ try {
+ assertEquals(bytes, yCoord.length, "Curve: " + category.getName() + "/" + curve.getId() + " (generator y)");
+ } catch (AssertionFailedError e) {
+ errors.add(e);
+ }
+ }
+ }
+ }
+ }
+
+ if (!errors.isEmpty()) {
+ StringBuilder sb = new StringBuilder("There were assertion errors:\n");
+ for (AssertionFailedError error : errors) {
+ sb.append(error.getMessage()).append("\n");
+ }
+ AssertionFailedError e = new AssertionFailedError(sb.toString());
+ for (AssertionFailedError error : errors) {
+ e.addSuppressed(error);
+ }
+ throw e;
+ }
+ }
+}