aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2018-06-30 00:57:54 +0200
committerJ08nY2018-06-30 00:57:54 +0200
commit6c29f55b0e3c5a866c7589393db9259950db811b (patch)
tree0e9711a3e8c91330ec9d88f7770928a43f92f11a
parent07cfc81f909ebeee6ea88a5671749bc44e5c6769 (diff)
downloadECTester-6c29f55b0e3c5a866c7589393db9259950db811b.tar.gz
ECTester-6c29f55b0e3c5a866c7589393db9259950db811b.tar.zst
ECTester-6c29f55b0e3c5a866c7589393db9259950db811b.zip
-rw-r--r--src/cz/crcs/ectester/data/EC_Store.java6
-rw-r--r--src/cz/crcs/ectester/data/composite/composite128_pq.csv1
-rw-r--r--src/cz/crcs/ectester/data/composite/composite128_pq1.csv1
-rw-r--r--src/cz/crcs/ectester/data/composite/composite128_pq2.csv1
-rw-r--r--src/cz/crcs/ectester/data/composite/composite160_pq.csv1
-rw-r--r--src/cz/crcs/ectester/data/composite/composite160_pq1.csv1
-rw-r--r--src/cz/crcs/ectester/data/composite/composite160_pq2.csv1
-rw-r--r--src/cz/crcs/ectester/data/composite/composite192_pq.csv1
-rw-r--r--src/cz/crcs/ectester/data/composite/composite192_pq1.csv1
-rw-r--r--src/cz/crcs/ectester/data/composite/composite192_pq2.csv1
-rw-r--r--src/cz/crcs/ectester/data/composite/composite224_pq.csv1
-rw-r--r--src/cz/crcs/ectester/data/composite/composite224_pq1.csv1
-rw-r--r--src/cz/crcs/ectester/data/composite/composite224_pq2.csv1
-rw-r--r--src/cz/crcs/ectester/data/composite/composite256_pq.csv1
-rw-r--r--src/cz/crcs/ectester/data/composite/composite256_pq1.csv1
-rw-r--r--src/cz/crcs/ectester/data/composite/composite256_pq2.csv1
-rw-r--r--src/cz/crcs/ectester/data/composite/curves.xml110
-rw-r--r--src/cz/crcs/ectester/reader/test/CardCompositeCurvesSuite.java50
18 files changed, 170 insertions, 11 deletions
diff --git a/src/cz/crcs/ectester/data/EC_Store.java b/src/cz/crcs/ectester/data/EC_Store.java
index d2c8224..db8371c 100644
--- a/src/cz/crcs/ectester/data/EC_Store.java
+++ b/src/cz/crcs/ectester/data/EC_Store.java
@@ -327,6 +327,9 @@ public class EC_Store {
curveKeys.add(item);
curves.putIfAbsent(curve, curveKeys);
}
+ for (List<T> keyList : curves.values()) {
+ Collections.sort(keyList);
+ }
List<Map.Entry<EC_Curve, List<T>>> curveList = new LinkedList<>();
curveList.addAll(curves.entrySet());
Comparator<Map.Entry<EC_Curve, List<T>>> c = Comparator.comparing(o -> o.getKey().getBits());
@@ -350,6 +353,9 @@ public class EC_Store {
group.add(item);
groups.putIfAbsent(prefix, group);
}
+ for (List<T> itemList : groups.values()) {
+ Collections.sort(itemList);
+ }
List<Map.Entry<String, List<T>>> result = new LinkedList<>();
result.addAll(groups.entrySet());
result.sort(Comparator.comparing(Map.Entry::getKey));
diff --git a/src/cz/crcs/ectester/data/composite/composite128_pq.csv b/src/cz/crcs/ectester/data/composite/composite128_pq.csv
new file mode 100644
index 0000000..8aea6b2
--- /dev/null
+++ b/src/cz/crcs/ectester/data/composite/composite128_pq.csv
@@ -0,0 +1 @@
+0xee6b3964632807cf11b8b9dba1b4f099,0x1fd6f78c0303652c5b7de184a4744f98,0x2da1b3253571565989f3b72b865a3e27,0x7c23e2a7e80b6586a1f9e1c9d4fbadc2,0xe987ee5eb715e2eb8cc8ad77311cfe0a,0xee6b3964632807cd9c885b5658f1a7c7,0x01 \ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/composite/composite128_pq1.csv b/src/cz/crcs/ectester/data/composite/composite128_pq1.csv
new file mode 100644
index 0000000..a551487
--- /dev/null
+++ b/src/cz/crcs/ectester/data/composite/composite128_pq1.csv
@@ -0,0 +1 @@
+0xee6b3964632807cf11b8b9dba1b4f099,0x1fd6f78c0303652c5b7de184a4744f98,0x2da1b3253571565989f3b72b865a3e27,0x6ef5b1d42abdbd6f44bcf4d64504927c,0x73e82c27b93032b7a7a15111d1569bb3,0x000000000000000000000003f76917eb,0x01 \ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/composite/composite128_pq2.csv b/src/cz/crcs/ectester/data/composite/composite128_pq2.csv
new file mode 100644
index 0000000..69181df
--- /dev/null
+++ b/src/cz/crcs/ectester/data/composite/composite128_pq2.csv
@@ -0,0 +1 @@
+0xee6b3964632807cf11b8b9dba1b4f099,0x1fd6f78c0303652c5b7de184a4744f98,0x2da1b3253571565989f3b72b865a3e27,0x73ca0050dff0de43cff4a026d8aa4baa,0xebd7490611fe3886fe5a8083d344edd0,0x000000003c1be1d1dd7edf84b8013495,0x01 \ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/composite/composite160_pq.csv b/src/cz/crcs/ectester/data/composite/composite160_pq.csv
new file mode 100644
index 0000000..3f43b50
--- /dev/null
+++ b/src/cz/crcs/ectester/data/composite/composite160_pq.csv
@@ -0,0 +1 @@
+0x919cf0a89ca7a8ea2f61156ea4b3100a2a357477,0x75cd1f1c32f1e5d2b2d54db103b22d296de34722,0x3177d3e2f79c884a0b1a6e74d9843c3a52e794de,0x46239bb42c524f45764e8edba8c958203d185886,0x6bce8ab48c9b4d0ab4083122ea9684173f9b07a9,0x919cf0a89ca7a8ea2f626ab2ab86ff4a074a5d51,0x01 \ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/composite/composite160_pq1.csv b/src/cz/crcs/ectester/data/composite/composite160_pq1.csv
new file mode 100644
index 0000000..debd466
--- /dev/null
+++ b/src/cz/crcs/ectester/data/composite/composite160_pq1.csv
@@ -0,0 +1 @@
+0x919cf0a89ca7a8ea2f61156ea4b3100a2a357477,0x75cd1f1c32f1e5d2b2d54db103b22d296de34722,0x3177d3e2f79c884a0b1a6e74d9843c3a52e794de,0x706deef87d4593bbeaa70bc2609e1d8c0e2e0c10,0x64df2537d395da2e0cb8c7e340426b64699cf325,0x00000000000000000000000af2407f270b81f45f,0x01 \ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/composite/composite160_pq2.csv b/src/cz/crcs/ectester/data/composite/composite160_pq2.csv
new file mode 100644
index 0000000..efd7475
--- /dev/null
+++ b/src/cz/crcs/ectester/data/composite/composite160_pq2.csv
@@ -0,0 +1 @@
+0x919cf0a89ca7a8ea2f61156ea4b3100a2a357477,0x75cd1f1c32f1e5d2b2d54db103b22d296de34722,0x3177d3e2f79c884a0b1a6e74d9843c3a52e794de,0x0818df9ccebf5b3fd422d00393d346b314e48f98,0x75bde540b81b5bf0ab45c86fbff7bb2e7ec833cb,0x00000000000000000d4d7041e1dbf10b42f48c4f,0x01 \ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/composite/composite192_pq.csv b/src/cz/crcs/ectester/data/composite/composite192_pq.csv
new file mode 100644
index 0000000..47b8a13
--- /dev/null
+++ b/src/cz/crcs/ectester/data/composite/composite192_pq.csv
@@ -0,0 +1 @@
+0xa261fff62647eebf810a404f0c80a971dd7c7838fdc52b5b,0x87502ebb62d26e1eca06c434f8ef069dfb2c287d6183750c,0x4ad6ce1f16e1bfc3d40f0027d787aeadb53846d69099a883,0x253e1db7210418abfe1de82c0053098e90bb15ad4f20096f,0x962c565cb0dd62b6a04be33ec7b20a1b3e7f23e24d48c6c2,0xa261fff62647eebf810a404f23ba4db93199e2e02ccffdfd,0x01 \ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/composite/composite192_pq1.csv b/src/cz/crcs/ectester/data/composite/composite192_pq1.csv
new file mode 100644
index 0000000..664d35e
--- /dev/null
+++ b/src/cz/crcs/ectester/data/composite/composite192_pq1.csv
@@ -0,0 +1 @@
+0xa261fff62647eebf810a404f0c80a971dd7c7838fdc52b5b,0x87502ebb62d26e1eca06c434f8ef069dfb2c287d6183750c,0x4ad6ce1f16e1bfc3d40f0027d787aeadb53846d69099a883,0x6366613b66339fa580f390d630ccf9b535437229aa8b61cd,0x2abab8c0e803a3612c7a7fbcb47e06fd8ef42a7a7d8c380f,0x00000000000000000000000000302b72431ff070e7e06799,0x1 \ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/composite/composite192_pq2.csv b/src/cz/crcs/ectester/data/composite/composite192_pq2.csv
new file mode 100644
index 0000000..41f4610
--- /dev/null
+++ b/src/cz/crcs/ectester/data/composite/composite192_pq2.csv
@@ -0,0 +1 @@
+0xa261fff62647eebf810a404f0c80a971dd7c7838fdc52b5b,0x87502ebb62d26e1eca06c434f8ef069dfb2c287d6183750c,0x4ad6ce1f16e1bfc3d40f0027d787aeadb53846d69099a883,0x6366613b66339fa580f390d630ccf9b535437229aa8b61cd,0x1b975fa3848bd68f34f6a08b7cf190bcaeaf9782270e2413,0x00000000000000000000035efd8bad55038e6bd22db8b805,0x1 \ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/composite/composite224_pq.csv b/src/cz/crcs/ectester/data/composite/composite224_pq.csv
new file mode 100644
index 0000000..ffa2cc1
--- /dev/null
+++ b/src/cz/crcs/ectester/data/composite/composite224_pq.csv
@@ -0,0 +1 @@
+0xa0dccd401872aa37c279e2469a08d97d559addb6fc870a1766f80e6f,0x393797f1d924dc63c761d4497086d09284a922a5517c07f93f3a075c,0x54f4673322854dafc1241b66192134ea9e18f8849c45660b793abb97,0x4f3b94b4e9234f3611bfe74d69ad06178e06c5f56fa100233f0d43e1,0x0eb042a295465c53ca6e01ff8c2cf4d029bf6d4a646fed830468d73a,0xa0dccd401872aa37c279e2469a0791ea2f15e32a10632ec07cf3ff97,0x01 \ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/composite/composite224_pq1.csv b/src/cz/crcs/ectester/data/composite/composite224_pq1.csv
new file mode 100644
index 0000000..6a01e2d
--- /dev/null
+++ b/src/cz/crcs/ectester/data/composite/composite224_pq1.csv
@@ -0,0 +1 @@
+0xa0dccd401872aa37c279e2469a08d97d559addb6fc870a1766f80e6f,0x393797f1d924dc63c761d4497086d09284a922a5517c07f93f3a075c,0x54f4673322854dafc1241b66192134ea9e18f8849c45660b793abb97,0x1b189f3372946c9cbb421a60bc3a0a06d16cf3ce043781ada561834c,0x57e00f270dbc56c6c86946dcb6c6ab12133d168609c588b6960c357f,0x00000000000000000000000000000000001824ec370e405bfb5024db,0x01 \ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/composite/composite224_pq2.csv b/src/cz/crcs/ectester/data/composite/composite224_pq2.csv
new file mode 100644
index 0000000..f8bc6df
--- /dev/null
+++ b/src/cz/crcs/ectester/data/composite/composite224_pq2.csv
@@ -0,0 +1 @@
+0xa0dccd401872aa37c279e2469a08d97d559addb6fc870a1766f80e6f,0x393797f1d924dc63c761d4497086d09284a922a5517c07f93f3a075c,0x54f4673322854dafc1241b66192134ea9e18f8849c45660b793abb97,0x97e540c8fc6f9603f25b1689895e5fe738565013675b1bd6c0e16a4b,0x66d0bbe7ee9b0e9e7e1d43b6a47e1d5550c696433c58ee06b94e8615,0x0000000000000000000006a99de2a928e8f227e7a2ed33a555f24ef5,0x01 \ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/composite/composite256_pq.csv b/src/cz/crcs/ectester/data/composite/composite256_pq.csv
new file mode 100644
index 0000000..8a59520
--- /dev/null
+++ b/src/cz/crcs/ectester/data/composite/composite256_pq.csv
@@ -0,0 +1 @@
+0xf75e78a6e2acb23d6317e57258287c00597e24881e0686039d0badb77b4e6b21,0x1aafadea1da31b45bbc02da735cc341f9cf9915884eb9cd31441520ead906b38,0x0f7f209988b0eada7190201ace3b3972d6ce3cbadac9933716d08645a7c31c63,0x4c4765a35cb2de9cc548d4dd47778b70395d023c4bf112f4bc820431502384e9,0x25bffa1f9ae1af10177f32abf13d3f607e78415c89676eeb13330098c9794503,0xf75e78a6e2acb23d6317e57258287c021fa26f10c359320ee8758b4e1f2c605d,0x1 \ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/composite/composite256_pq1.csv b/src/cz/crcs/ectester/data/composite/composite256_pq1.csv
new file mode 100644
index 0000000..8012893
--- /dev/null
+++ b/src/cz/crcs/ectester/data/composite/composite256_pq1.csv
@@ -0,0 +1 @@
+0xf75e78a6e2acb23d6317e57258287c00597e24881e0686039d0badb77b4e6b21,0x1aafadea1da31b45bbc02da735cc341f9cf9915884eb9cd31441520ead906b38,0x0f7f209988b0eada7190201ace3b3972d6ce3cbadac9933716d08645a7c31c63,0x93d1f4d02d6f0d2ea7b80f7095e70e731bcf66fb8118e7698a16eab45aadcaa4,0x51dccaa47e35062383e4878625bf2116be5413c34a1b964c7547f65297f0bc04,0x743bc7ea193d40db,0x1 \ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/composite/composite256_pq2.csv b/src/cz/crcs/ectester/data/composite/composite256_pq2.csv
new file mode 100644
index 0000000..25b57af
--- /dev/null
+++ b/src/cz/crcs/ectester/data/composite/composite256_pq2.csv
@@ -0,0 +1 @@
+0xf75e78a6e2acb23d6317e57258287c00597e24881e0686039d0badb77b4e6b21,0x1aafadea1da31b45bbc02da735cc341f9cf9915884eb9cd31441520ead906b38,0x0f7f209988b0eada7190201ace3b3972d6ce3cbadac9933716d08645a7c31c63,0x93d1f4d02d6f0d2ea7b80f7095e70e731bcf66fb8118e7698a16eab45aadcaa4,0x3db7c6ee2d24d142ee0ec56f3ba0a606d099debb66a765e3926a5aa19539a2c3,0x220d23234534b240aac0efa70a3bc44e046c2431ad5a32d27,0x1 \ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/composite/curves.xml b/src/cz/crcs/ectester/data/composite/curves.xml
index a1abe2e..1eddbea 100644
--- a/src/cz/crcs/ectester/data/composite/curves.xml
+++ b/src/cz/crcs/ectester/data/composite/curves.xml
@@ -100,4 +100,114 @@
<file>composite521_small.csv</file>
<desc>r = 0x05</desc>
</curve>
+
+ <curve>
+ <id>pq/composite128</id>
+ <bits>128</bits>
+ <field>prime</field>
+ <file>composite128_pq.csv</file>
+ <desc>r = 0x03f76917eb * 0x3c1be1d1dd7edf84b8013495</desc>
+ </curve>
+ <curve>
+ <id>pq/composite128/1</id>
+ <bits>128</bits>
+ <field>prime</field>
+ <file>composite128_pq1.csv</file>
+ <desc>r = 0x03f76917eb</desc>
+ </curve>
+ <curve>
+ <id>pq/composite128/2</id>
+ <bits>128</bits>
+ <field>prime</field>
+ <file>composite128_pq2.csv</file>
+ <desc>r = 0x3c1be1d1dd7edf84b8013495</desc>
+ </curve>
+
+ <curve>
+ <id>pq/composite160</id>
+ <bits>160</bits>
+ <field>prime</field>
+ <file>composite160_pq.csv</file>
+ <desc>r = 0x0af2407f270b81f45f * 0x4d7041e1dbf10b42f48c4f</desc>
+ </curve>
+ <curve>
+ <id>pq/composite160/1</id>
+ <bits>160</bits>
+ <field>prime</field>
+ <file>composite160_pq1.csv</file>
+ <desc>r = 0x0af2407f270b81f45f</desc>
+ </curve>
+ <curve>
+ <id>pq/composite160/2</id>
+ <bits>160</bits>
+ <field>prime</field>
+ <file>composite160_pq2.csv</file>
+ <desc>r = 0x4d7041e1dbf10b42f48c4f</desc>
+ </curve>
+
+ <curve>
+ <id>pq/composite192</id>
+ <bits>192</bits>
+ <field>prime</field>
+ <file>composite192_pq.csv</file>
+ <desc>r = 0x302b72431ff070e7e06799 * 0x35efd8bad55038e6bd22db8b805</desc>
+ </curve>
+ <curve>
+ <id>pq/composite192/1</id>
+ <bits>192</bits>
+ <field>prime</field>
+ <file>composite192_pq1.csv</file>
+ <desc>r = 0x302b72431ff070e7e06799</desc>
+ </curve>
+ <curve>
+ <id>pq/composite192/2</id>
+ <bits>192</bits>
+ <field>prime</field>
+ <file>composite192_pq2.csv</file>
+ <desc>r = 0x35efd8bad55038e6bd22db8b805</desc>
+ </curve>
+
+ <curve>
+ <id>pq/composite224</id>
+ <bits>224</bits>
+ <field>prime</field>
+ <file>composite224_pq.csv</file>
+ <desc>r = 0x1824ec370e405bfb5024db * 0x6a99de2a928e8f227e7a2ed33a555f24ef5</desc>
+ </curve>
+ <curve>
+ <id>pq/composite224/1</id>
+ <bits>224</bits>
+ <field>prime</field>
+ <file>composite224_pq1.csv</file>
+ <desc>r = 0x1824ec370e405bfb5024db</desc>
+ </curve>
+ <curve>
+ <id>pq/composite224/2</id>
+ <bits>224</bits>
+ <field>prime</field>
+ <file>composite224_pq2.csv</file>
+ <desc>r = 0x6a99de2a928e8f227e7a2ed33a555f24ef5</desc>
+ </curve>
+
+ <curve>
+ <id>pq/composite256</id>
+ <bits>256</bits>
+ <field>prime</field>
+ <file>composite256_pq.csv</file>
+ <desc>r = 0x743bc7ea193d40db * 0x220d23234534b240aac0efa70a3bc44e046c2431ad5a32d27</desc>
+ </curve>
+ <curve>
+ <id>pq/composite256/1</id>
+ <bits>256</bits>
+ <field>prime</field>
+ <file>composite256_pq1.csv</file>
+ <desc>r = 0x743bc7ea193d40db</desc>
+ </curve>
+ <curve>
+ <id>pq/composite256/2</id>
+ <bits>256</bits>
+ <field>prime</field>
+ <file>composite256_pq2.csv</file>
+ <desc>r = 0x220d23234534b240aac0efa70a3bc44e046c2431ad5a32d27</desc>
+ </curve>
</curves> \ No newline at end of file
diff --git a/src/cz/crcs/ectester/reader/test/CardCompositeCurvesSuite.java b/src/cz/crcs/ectester/reader/test/CardCompositeCurvesSuite.java
index d186b4a..d474638 100644
--- a/src/cz/crcs/ectester/reader/test/CardCompositeCurvesSuite.java
+++ b/src/cz/crcs/ectester/reader/test/CardCompositeCurvesSuite.java
@@ -8,11 +8,13 @@ import cz.crcs.ectester.common.ec.EC_Key;
import cz.crcs.ectester.common.output.TestWriter;
import cz.crcs.ectester.common.test.CompoundTest;
import cz.crcs.ectester.common.test.Test;
+import cz.crcs.ectester.common.util.CardUtil;
import cz.crcs.ectester.data.EC_Store;
import cz.crcs.ectester.reader.CardMngr;
import cz.crcs.ectester.reader.ECTesterReader;
import cz.crcs.ectester.reader.command.Command;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -36,15 +38,25 @@ public class CardCompositeCurvesSuite extends CardTestSuite {
* is revealed.
*/
Map<String, EC_Key> keys = EC_Store.getInstance().getObjects(EC_Key.class, "composite");
- for (EC_Key key : keys.values()) {
- EC_Curve curve = EC_Store.getInstance().getObject(EC_Curve.class, key.getCurve());
- Test allocate = CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_LOCAL, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS);
- Test set = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.ANY);
- Test generate = CommandTest.expect(new Command.Generate(this.card, ECTesterApplet.KEYPAIR_LOCAL), ExpectedValue.ANY);
- Command ecdhCommand = new Command.ECDH_direct(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH, key.flatten());
- Test ecdh = CommandTest.expect(ecdhCommand, ExpectedValue.FAILURE, "Card correctly rejected to do ECDH over a composite order curve.", "Card incorrectly does ECDH over a composite order curve, leaks bits of private key.");
+ List<Map.Entry<EC_Curve, List<EC_Key>>> mappedKeys = EC_Store.mapKeyToCurve(keys.values());
+ for (Map.Entry<EC_Curve, List<EC_Key>> curveKeys : mappedKeys) {
+ EC_Curve curve = curveKeys.getKey();
+ List<Test> tests = new LinkedList<>();
+ Test allocate = runTest(CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_LOCAL, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS));
+ if (!allocate.ok()) {
+ doTest(CompoundTest.all(ExpectedValue.SUCCESS, "No support for " + curve.getBits() + "b " + CardUtil.getKeyTypeString(curve.getField()) + ".", allocate));
+ continue;
+ }
+ tests.add(allocate);
+ for (EC_Key key : curveKeys.getValue()) {
+ Test set = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.ANY);
+ Test generate = CommandTest.expect(new Command.Generate(this.card, ECTesterApplet.KEYPAIR_LOCAL), ExpectedValue.ANY);
+ Command ecdhCommand = new Command.ECDH_direct(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH, key.flatten());
+ Test ecdh = CommandTest.expect(ecdhCommand, ExpectedValue.FAILURE, "Card correctly rejected to do ECDH over a composite order curve.", "Card incorrectly does ECDH over a composite order curve, leaks bits of private key.");
- doTest(CompoundTest.greedyAllTry(ExpectedValue.SUCCESS, "Composite test of " + curve.getId() + ", " + key.getDesc(), allocate, set, generate, ecdh));
+ tests.add(CompoundTest.greedyAllTry(ExpectedValue.SUCCESS, "Composite test of " + curve.getId() + ", " + key.getDesc(), set, generate, ecdh));
+ }
+ doTest(CompoundTest.all(ExpectedValue.SUCCESS, "Composite test of " + curve.getId() + ".", tests.toArray(new Test[0])));
new Command.Cleanup(this.card).send();
}
@@ -53,14 +65,30 @@ public class CardCompositeCurvesSuite extends CardTestSuite {
Map<String, EC_Curve> results = EC_Store.getInstance().getObjects(EC_Curve.class, "composite");
List<Map.Entry<String, List<EC_Curve>>> groupList = EC_Store.mapToPrefix(results.values());
List<EC_Curve> smallRCurves = groupList.stream().filter((e) -> e.getKey().equals("small")).findFirst().get().getValue();
- for (EC_Curve curve : smallRCurves) {
+ testGroup(smallRCurves, "Small generator order", ExpectedValue.FAILURE, "Card correctly rejected to do ECDH over a small order generator.", "Card incorrectly does ECDH over a small order generator.");
+
+ /* Also test having a G of large but composite order, R = p * q,
+ */
+ List<EC_Curve> pqCurves = groupList.stream().filter((e) -> e.getKey().equals("pq")).findFirst().get().getValue();
+ testGroup(pqCurves, null, ExpectedValue.ANY, "", "");
+ }
+
+ private void testGroup(List<EC_Curve> curves, String testName, ExpectedValue dhValue, String ok, String nok) throws Exception {
+ for (EC_Curve curve : curves) {
Test allocate = CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS);
Test set = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.ANY);
Test generate = CommandTest.expect(new Command.Generate(this.card, ECTesterApplet.KEYPAIR_BOTH), ExpectedValue.ANY);
- Test ecdh = CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), ExpectedValue.FAILURE, "Card correctly rejected to do ECDH over a small order generator.", "Card incorrectly does ECDH over a small order generator.");
+ Test ecdh = CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), dhValue, ok, nok);
- doTest(CompoundTest.greedyAllTry(ExpectedValue.SUCCESS, "Small generator order test of " + curve.getId() + ".", allocate, set, generate, ecdh));
+ String description;
+ if (testName == null) {
+ description = curve.getDesc() + " test of " + curve.getId() + ".";
+ } else {
+ description = testName + " test of " + curve.getId() + ".";
+ }
+ doTest(CompoundTest.greedyAllTry(ExpectedValue.SUCCESS, description, allocate, set, generate, ecdh));
new Command.Cleanup(this.card).send();
}
+
}
}