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; + } + } +}