aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJ08nY2018-04-28 19:33:48 +0200
committerJ08nY2018-04-28 19:33:48 +0200
commitd61af849107b1f872bdd01438d6c406db3d24124 (patch)
treeddb0e588a87668e60f93d5238caffd07457c52e9 /src
parent3b0d002c7987297d90e450def097cd8cdb65444c (diff)
downloadECTester-d61af849107b1f872bdd01438d6c406db3d24124.tar.gz
ECTester-d61af849107b1f872bdd01438d6c406db3d24124.tar.zst
ECTester-d61af849107b1f872bdd01438d6c406db3d24124.zip
Diffstat (limited to 'src')
-rw-r--r--src/cz/crcs/ectester/common/output/BaseTextTestWriter.java4
-rw-r--r--src/cz/crcs/ectester/data/EC_Store.java1
-rw-r--r--src/cz/crcs/ectester/data/categories.xml40
-rw-r--r--src/cz/crcs/ectester/data/degenerate/brainpool.xml317
-rw-r--r--src/cz/crcs/ectester/data/degenerate/keys.xml16
-rw-r--r--src/cz/crcs/ectester/data/degenerate/secg.xml628
-rw-r--r--src/cz/crcs/ectester/reader/ECTesterReader.java7
-rw-r--r--src/cz/crcs/ectester/reader/test/CardDegenerateCurvesSuite.java55
8 files changed, 1049 insertions, 19 deletions
diff --git a/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java b/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java
index 43928ff..1b85f36 100644
--- a/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java
+++ b/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java
@@ -27,7 +27,9 @@ public abstract class BaseTextTestWriter implements TestWriter {
@Override
public void begin(TestSuite suite) {
output.println("═══ Running test suite: " + suite.getName() + " ═══");
- output.println("═══ " + suite.getDescription());
+ for (String d : suite.getDescription().split("\n")) {
+ output.println("═══ " + d);
+ }
DateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
Date date = new Date();
output.println("═══ Date: " + dateFormat.format(date));
diff --git a/src/cz/crcs/ectester/data/EC_Store.java b/src/cz/crcs/ectester/data/EC_Store.java
index 426dcd9..63a0275 100644
--- a/src/cz/crcs/ectester/data/EC_Store.java
+++ b/src/cz/crcs/ectester/data/EC_Store.java
@@ -40,6 +40,7 @@ public class EC_Store {
dbf.setSchema(sch);
dbf.setNamespaceAware(true);
dbf.setIgnoringComments(true);
+ dbf.setXIncludeAware(true);
dbf.setIgnoringElementContentWhitespace(true);
db = dbf.newDocumentBuilder();
db.setErrorHandler(new ErrorHandler() {
diff --git a/src/cz/crcs/ectester/data/categories.xml b/src/cz/crcs/ectester/data/categories.xml
index 3451588..0e1b142 100644
--- a/src/cz/crcs/ectester/data/categories.xml
+++ b/src/cz/crcs/ectester/data/categories.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<categories xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="schema.xsd">
+ <!-- Standard curves -->
<category>
<name>anomalous</name>
<directory>anomalous</directory>
@@ -32,38 +33,45 @@
<desc>GOST R 34.10-2001: RFC5832</desc>
</category>
<category>
- <name>composite</name>
- <directory>composite</directory>
- <desc>Composite order curves, with points of very small order pregenerated.</desc>
- </category>
- <category>
- <name>wrong</name>
- <directory>wrong</directory>
- <desc>Wrong field curves. These should definitely give an error when used. Since the "prime" used for the field are not prime, and the field polynomials are also not irreducible. Simply put these parameters don't specify a valid elliptic curve.</desc>
+ <name>x962</name>
+ <directory>x962</directory>
+ <desc>ANSI X9.62 example curves.</desc>
</category>
+
+ <!-- Custom curves -->
<category>
<name>invalid</name>
<directory>invalid</directory>
- <desc></desc>
+ <desc>Invalid curves and points on them for common standard named curves.</desc>
</category>
<category>
<name>twist</name>
<directory>twist</directory>
- <desc></desc>
+ <desc>Points on quadratic twists of common standard named curves.</desc>
+ </category>
+ <category>
+ <name>degenerate</name>
+ <directory>degenerate</directory>
+ <desc>Points on degenerate curves for common standard named curves.</desc>
</category>
<category>
<name>cofactor</name>
<directory>cofactor</directory>
- <desc></desc>
+ <desc>Curves of order n * p, with p prime and n in {2,4,8,16,32,64,128}. Generator of order p, with points on the subgroup of order n.</desc>
+ </category>
+ <category>
+ <name>composite</name>
+ <directory>composite</directory>
+ <desc>Composite order curves, with points of very small order pre-generated.</desc>
+ </category>
+ <category>
+ <name>wrong</name>
+ <directory>wrong</directory>
+ <desc>Wrong field curves. These should definitely give an error when used. Since the "prime" used for the field are not prime, and the field polynomials are also not irreducible. Simply put these parameters don't specify a valid elliptic curve.</desc>
</category>
<category>
<name>test</name>
<directory>test</directory>
<desc>Test vectors</desc>
</category>
- <category>
- <name>x962</name>
- <directory>x962</directory>
- <desc>ANSI X9.62 example curves.</desc>
- </category>
</categories> \ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/degenerate/brainpool.xml b/src/cz/crcs/ectester/data/degenerate/brainpool.xml
new file mode 100644
index 0000000..9dc860a
--- /dev/null
+++ b/src/cz/crcs/ectester/data/degenerate/brainpool.xml
@@ -0,0 +1,317 @@
+<pubkey>
+ <id>brainpoolP160r1/0</id>
+ <inline>0x0000000000000000000000000000000000000000,0xe95e4a5f737059dc60dfc7ad95b3d8139515620e</inline>
+ <curve>brainpool/brainpoolP160r1</curve>
+ <desc>degenerate order = 2</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP160r1/1</id>
+ <inline>0x0000000000000000000000000000000000000000,0x3290e9c18a987fec8da975f2433060ce9a5d67a4</inline>
+ <curve>brainpool/brainpoolP160r1</curve>
+ <desc>degenerate order = 3</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP160r1/2</id>
+ <inline>0x0000000000000000000000000000000000000000,0xb70d585c2b880eb1dfdf91e77b37f1b755c8f73d</inline>
+ <curve>brainpool/brainpoolP160r1</curve>
+ <desc>degenerate order = 7</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP160r1/3</id>
+ <inline>0x0000000000000000000000000000000000000000,0xd6dcfdaf8654e853148d03b11a346873bda99f78</inline>
+ <curve>brainpool/brainpoolP160r1</curve>
+ <desc>degenerate order = 53</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP160r1/4</id>
+ <inline>0x0000000000000000000000000000000000000000,0x132024d2fa2b15b992fd336077f7da8644367c84</inline>
+ <curve>brainpool/brainpoolP160r1</curve>
+ <desc>degenerate order = 82977018063719683</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP160r1/5</id>
+ <inline>0x0000000000000000000000000000000000000000,0x5cad9ba4b9e18c1d1167683b8d2e89340cb7391f</inline>
+ <curve>brainpool/brainpoolP160r1</curve>
+ <desc>degenerate order = 136095069548351808925828417</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP160r1/gen</id>
+ <inline>0x0000000000000000000000000000000000000000,0x0000000000000000000000000000000000000003</inline>
+ <curve>brainpool/brainpoolP160r1</curve>
+ <desc>generator of Fp^*</desc>
+</pubkey>
+
+<pubkey>
+ <id>brainpoolP192r1/0</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0xc302f41d932a36cda7a3463093d18db78fce476de1a86296</inline>
+ <curve>brainpool/brainpoolP192r1</curve>
+ <desc>degenerate order = 2</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP192r1/1</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0xc2d59e85f6c3b8e1f01fc05f5185f332c44928215c7713b2</inline>
+ <curve>brainpool/brainpoolP192r1</curve>
+ <desc>degenerate order = 3</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP192r1/2</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0x5e649a10e22dbb7f226426a753c977dc23ed974d33107dde</inline>
+ <curve>brainpool/brainpoolP192r1</curve>
+ <desc>degenerate order = 7</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP192r1/3</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0x87c26e71982b23eb6e9df053ad929f67dbd26566729d303e</inline>
+ <curve>brainpool/brainpoolP192r1</curve>
+ <desc>degenerate order = 51326679042491</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP192r1/4</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0x28bd61f0833fb3c4106cbba35c74280bdb897ffb4ef1663d</inline>
+ <curve>brainpool/brainpoolP192r1</curve>
+ <desc>degenerate order = 2218130291019312052925190546351456293022253</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP192r1/gen</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0x000000000000000000000000000000000000000000000007</inline>
+ <curve>brainpool/brainpoolP192r1</curve>
+ <desc>generator of Fp^*</desc>
+</pubkey>
+
+<pubkey>
+ <id>brainpoolP224r1/0</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0xd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe</inline>
+ <curve>brainpool/brainpoolP224r1</curve>
+ <desc>degenerate order = 2</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP224r1/1</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0x5d0ee8269faa5766328ef18457528c874c408f5dd8b9991c005894ae</inline>
+ <curve>brainpool/brainpoolP224r1</curve>
+ <desc>degenerate order = 3</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP224r1/2</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0x9fae816f63ae358d9ab07d30aed377ca63572c8b1cb1f982af33496c</inline>
+ <curve>brainpool/brainpoolP224r1</curve>
+ <desc>degenerate order = 5</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP224r1/3</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0x1dfa7dc36ec72696d874d99b8b09013ce924820fdecaa1bd9cd09b7e</inline>
+ <curve>brainpool/brainpoolP224r1</curve>
+ <desc>degenerate order = 11</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP224r1/4</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0x5267eb8a73ff20d570e131f6a0a33558c3a85cbecb51d7e4f4104132</inline>
+ <curve>brainpool/brainpoolP224r1</curve>
+ <desc>degenerate order = 89</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP224r1/5</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0x92d82ad4ea31d2c90853b5a0da3f3dd233ebfbee9ef3e4eb4269846f</inline>
+ <curve>brainpool/brainpoolP224r1</curve>
+ <desc>degenerate order = 257</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP224r1/6</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0xc09fd12cf48c63d65e152f6a208bb2ab4eb003e1d9ddeb17d599a54c</inline>
+ <curve>brainpool/brainpoolP224r1</curve>
+ <desc>degenerate order = 1091</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP224r1/7</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0x6af88537440e290df74852480f628ce983f542958c08768592e44dfa</inline>
+ <curve>brainpool/brainpoolP224r1</curve>
+ <desc>degenerate order = 2713</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP224r1/8</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0x6e85c24f03a0dbdd4e4ddfe8a3c7b335f7bfeb83d6fecf3a9c1c23e6</inline>
+ <curve>brainpool/brainpoolP224r1</curve>
+ <desc>degenerate order = 6553</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP224r1/9</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0xb60e89dbc1fedacb81b2e172db5ec0b7ad6b797786582113b56d6955</inline>
+ <curve>brainpool/brainpoolP224r1</curve>
+ <desc>degenerate order = 1322801685354439</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP224r1/10</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0x6634b0f61120124365dc719bc583a9821a027bea6dd3b6366d216be3</inline>
+ <curve>brainpool/brainpoolP224r1</curve>
+ <desc>degenerate order = 13036179062997789943375385313119191</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP224r1/gen</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0x00000000000000000000000000000000000000000000000000000003</inline>
+ <curve>brainpool/brainpoolP224r1</curve>
+ <desc>generator of Fp^*</desc>
+</pubkey>
+
+<pubkey>
+ <id>brainpoolP256r1/0</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0xa9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376</inline>
+ <curve>brainpool/brainpoolP256r1</curve>
+ <desc>degenerate order = 2</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP256r1/1</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0x88dbe84830c188e78ac83f1107fbd561631bdc35d59ec7fb8ed568b12eb8dbab</inline>
+ <curve>brainpool/brainpoolP256r1</curve>
+ <desc>degenerate order = 5</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP256r1/2</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0x295770494572e605f3a972816bf9c65701efe08c180da9736ad216400553b2ea</inline>
+ <curve>brainpool/brainpoolP256r1</curve>
+ <desc>degenerate order = 23</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP256r1/3</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0x817663dd4fecc333507f8d78f9605b24196d7e212d0184f277768751c2ec4c46</inline>
+ <curve>brainpool/brainpoolP256r1</curve>
+ <desc>degenerate order = 1667</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP256r1/4</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0x716b3a9abe12db2eeb97c18ecb121d31eed98538c62d35fc5a28ba9b930d4ae5</inline>
+ <curve>brainpool/brainpoolP256r1</curve>
+ <desc>degenerate order = 149459</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP256r1/5</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0x2ddf09c88fb6f4d0ffa124121cc3a3cd34254e45a2361f4ba3c2cef5e9098d5f</inline>
+ <curve>brainpool/brainpoolP256r1</curve>
+ <desc>degenerate order = 17543087</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP256r1/6</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0x029af8201d9619fb12bc9238dbeeed0629fc221438893b6ca92b44d7459a9bfb</inline>
+ <curve>brainpool/brainpoolP256r1</curve>
+ <desc>degenerate order = 3059213862715144055733503214373292934438943635608167530247</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP256r1/gen</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0x000000000000000000000000000000000000000000000000000000000000000b</inline>
+ <curve>brainpool/brainpoolP256r1</curve>
+ <desc>generator of Fp^*</desc>
+</pubkey>
+
+<pubkey>
+ <id>brainpoolP320r1/0</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000000000000000000000000000,0xd35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26</inline>
+ <curve>brainpool/brainpoolP320r1</curve>
+ <desc>degenerate order = 2</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP320r1/1</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000000000000000000000000000,0x762fa9e1988fdb911a91a2ee9938e0c667364417df5b2a1d470dfcb2386fc42bec7c67b3595dcd8e</inline>
+ <curve>brainpool/brainpoolP320r1</curve>
+ <desc>degenerate order = 11</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP320r1/2</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000000000000000000000000000,0x04fe1e15fa803fdb486be596b00abc53feb2eeeb9081d5b2a539e333646138d298d36b588bfbd041</inline>
+ <curve>brainpool/brainpoolP320r1</curve>
+ <desc>degenerate order = 13</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP320r1/3</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000000000000000000000000000,0x595c3f8fddf0bca7f722d69a59d0cf269bea1e5f1e5b0ed7ad0ae6341a30ef8733865deb5996bb37</inline>
+ <curve>brainpool/brainpoolP320r1</curve>
+ <desc>degenerate order = 59</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP320r1/4</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000000000000000000000000000,0x85de1d0bfec99e087e3315a045261dfa7ad55e035575d61d858c7b4dc807df052b2dbfa803374020</inline>
+ <curve>brainpool/brainpoolP320r1</curve>
+ <desc>degenerate order = 196907</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP320r1/5</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000000000000000000000000000,0x044664f95553a4e4204b3c584eed7eb3c91ae92c8ee7dc9ee37e7cc067b58688c42fa8f26f3ad828</inline>
+ <curve>brainpool/brainpoolP320r1</curve>
+ <desc>degenerate order = 146208281456251399783</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP320r1/6</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000000000000000000000000000,0x0d728bc8ccd9b7fd249f959dad0b57ff028e7858deff4cf9c9d65b11e3b5bbd01b6f568be5910dd6</inline>
+ <curve>brainpool/brainpoolP320r1</curve>
+ <desc>degenerate order = 2307908307480288228542246803936276549862379769663891118114524423</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP320r1/gen</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000000000000000000000000000,0x00000000000000000000000000000000000000000000000000000000000000000000000000000005</inline>
+ <curve>brainpool/brainpoolP320r1</curve>
+ <desc>generator of Fp^*</desc>
+</pubkey>
+
+<pubkey>
+ <id>brainpoolP384r1/0</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x8cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52</inline>
+ <curve>brainpool/brainpoolP384r1</curve>
+ <desc>degenerate order = 2</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP384r1/1</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x70269a7b61909d9fbdc89c77a359c168b31f40d488f4a817f2811d0aeda71aec407ecb8d2d561af30e52ab55bb126ae9</inline>
+ <curve>brainpool/brainpoolP384r1</curve>
+ <desc>degenerate order = 3</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP384r1/2</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x3ef4b5a9b5525a600cdfd481ff13dbeacb9f25f29af360d0e9bed208a4b650f9a26bbe89248d3bf7bc5cfd1bf1108054</inline>
+ <curve>brainpool/brainpoolP384r1</curve>
+ <desc>degenerate order = 5</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP384r1/3</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x8ca0a25e4fbf0d7b69585acdd9cb26f2cc2e6036061a960c9f342c0c2f2bef9ce8d410df3da73f2955f82dc6cfede0f6</inline>
+ <curve>brainpool/brainpoolP384r1</curve>
+ <desc>degenerate order = 11</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP384r1/4</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x7ca77491eca28a1dd1667da80aa95ecbe84ba9e379e12d1d30482790c43dcd59a0e0e2e8fad09dac4ead54b18e4911b2</inline>
+ <curve>brainpool/brainpoolP384r1</curve>
+ <desc>degenerate order = 79</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP384r1/5</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x34d6057691520ed040a958956ee8821efffa9f4827f8507b9f7d86ffdccee6a09a866839b9b631fae9b330ece487a1fb</inline>
+ <curve>brainpool/brainpoolP384r1</curve>
+ <desc>degenerate order = 734647</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP384r1/6</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x8c1e0c36b3dd4de379143acb43f078cb211543f95d85405fbcc2474f6c88701d5aece6c92d8d21e2b7b42be1e7da67b3</inline>
+ <curve>brainpool/brainpoolP384r1</curve>
+ <desc>degenerate order = 27093605140967</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP384r1/7</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x7d712d6ebcceb876c1f40263ad5c952cf2264c660c17d4567a24dfb776cd94182560094ab0f1353341851079bfdf99bd</inline>
+ <curve>brainpool/brainpoolP384r1</curve>
+ <desc>degenerate order = 3012146720727260651</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP384r1/8</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x84cf53d9ffa36b9300dcf53a1db4030f5afba0c2b5299685620432993772359358ccef721662b7d6b679207517b52817</inline>
+ <curve>brainpool/brainpoolP384r1</curve>
+ <desc>degenerate order = 13857381403312519376221497559214358876512960238914501360589056738895920081</desc>
+</pubkey>
+<pubkey>
+ <id>brainpoolP384r1/gen</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003</inline>
+ <curve>brainpool/brainpoolP384r1</curve>
+ <desc>generator of Fp^*</desc>
+</pubkey>
+
+<!-- Points for brainpoolP512r1 and brainpoolP512t1 are missing
+ due to the large size of the base field and it being hard
+ to factor (p - 1). -->
+
+
diff --git a/src/cz/crcs/ectester/data/degenerate/keys.xml b/src/cz/crcs/ectester/data/degenerate/keys.xml
new file mode 100644
index 0000000..cbeecce
--- /dev/null
+++ b/src/cz/crcs/ectester/data/degenerate/keys.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE keys [
+ <!ENTITY secg SYSTEM "degenerate/secg.xml">
+ <!ENTITY brainpool SYSTEM "degenerate/brainpool.xml">
+ ]>
+<keys xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="../schema.xsd"
+ category="degenerate"
+ desc="">
+ <!--
+ This is messy and what not, but Java XML api doesn't support
+ the XInclude selector necessary to make this work nicely, so XInclude is out...
+ -->
+ &secg;
+ &brainpool;
+</keys> \ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/degenerate/secg.xml b/src/cz/crcs/ectester/data/degenerate/secg.xml
new file mode 100644
index 0000000..7d6bce8
--- /dev/null
+++ b/src/cz/crcs/ectester/data/degenerate/secg.xml
@@ -0,0 +1,628 @@
+<pubkey>
+ <id>secp112r1/0</id>
+ <inline>0x0000000000000000000000000000,0xdb7c2abf62e35e668076bead208a</inline>
+ <curve>secg/secp112r1</curve>
+ <desc>degenerate order = 2</desc>
+</pubkey>
+<pubkey>
+ <id>secp112r1/1</id>
+ <inline>0x0000000000000000000000000000,0x75087e0bcdb604d9ca3a0998a8f6</inline>
+ <curve>secg/secp112r1</curve>
+ <desc>degenerate order = 23</desc>
+</pubkey>
+<pubkey>
+ <id>secp112r1/2</id>
+ <inline>0x0000000000000000000000000000,0x9ceca7fd3423a8580f4d8be19b71</inline>
+ <curve>secg/secp112r1</curve>
+ <desc>degenerate order = 452873</desc>
+</pubkey>
+<pubkey>
+ <id>secp112r1/3</id>
+ <inline>0x0000000000000000000000000000,0x250b6a43ac8a790cf22b7cdb36bd</inline>
+ <curve>secg/secp112r1</curve>
+ <desc>degenerate order = 213692946505768378488901547</desc>
+</pubkey>
+<pubkey>
+ <id>secp112r1/gen</id>
+ <inline>0x0000000000000000000000000000,0x0000000000000000000000000005</inline>
+ <curve>secg/secp112r1</curve>
+ <desc>generator of Fp^*</desc>
+</pubkey>
+
+<pubkey>
+ <id>secp128r1/0</id>
+ <inline>0x00000000000000000000000000000000,0xfffffffdfffffffffffffffffffffffe</inline>
+ <curve>secg/secp128r1</curve>
+ <desc>degenerate order = 2</desc>
+</pubkey>
+<pubkey>
+ <id>secp128r1/1</id>
+ <inline>0x00000000000000000000000000000000,0x0a50650222aa47d2cd1077082c2b77a1</inline>
+ <curve>secg/secp128r1</curve>
+ <desc>degenerate order = 3</desc>
+</pubkey>
+<pubkey>
+ <id>secp128r1/2</id>
+ <inline>0x00000000000000000000000000000000,0x5acdd440659ebf4945f5e131da2097c4</inline>
+ <curve>secg/secp128r1</curve>
+ <desc>degenerate order = 7</desc>
+</pubkey>
+<pubkey>
+ <id>secp128r1/3</id>
+ <inline>0x00000000000000000000000000000000,0x86ba614538631a14c10485c80d2e52aa</inline>
+ <curve>secg/secp128r1</curve>
+ <desc>degenerate order = 2700653704464143955832110573370478657</desc>
+</pubkey>
+<pubkey>
+ <id>secp128r1/gen</id>
+ <inline>0x00000000000000000000000000000000,0x00000000000000000000000000000003</inline>
+ <curve>secg/secp128r1</curve>
+ <desc>generator of Fp^*</desc>
+</pubkey>
+
+<pubkey>
+ <id>secp160r2/0</id>
+ <inline>0x0000000000000000000000000000000000000000,0xfffffffffffffffffffffffffffffffeffffac72</inline>
+ <curve>secg/secp160r2</curve>
+ <desc>degenerate order = 2</desc>
+</pubkey>
+<pubkey>
+ <id>secp160r2/1</id>
+ <inline>0x0000000000000000000000000000000000000000,0x9ba48cba5ebcb9b6bd33b92830b2a2e0e192f10a</inline>
+ <curve>secg/secp160r2</curve>
+ <desc>degenerate order = 3</desc>
+</pubkey>
+<pubkey>
+ <id>secp160r2/2</id>
+ <inline>0x0000000000000000000000000000000000000000,0x508a8264d56922add3cd40482649d840497476e8</inline>
+ <curve>secg/secp160r2</curve>
+ <desc>degenerate order = 5</desc>
+</pubkey>
+<pubkey>
+ <id>secp160r2/3</id>
+ <inline>0x0000000000000000000000000000000000000000,0x36aec30a63930538841d0324a54aecf4f89bf859</inline>
+ <curve>secg/secp160r2</curve>
+ <desc>degenerate order = 7</desc>
+</pubkey>
+<pubkey>
+ <id>secp160r2/4</id>
+ <inline>0x0000000000000000000000000000000000000000,0xd2204d87c083aa9062de5c195c88de10d5f82f39</inline>
+ <curve>secg/secp160r2</curve>
+ <desc>degenerate order = 113</desc>
+</pubkey>
+<pubkey>
+ <id>secp160r2/5</id>
+ <inline>0x0000000000000000000000000000000000000000,0xaf2fb7626db439a172b14b80a13f4f871d0aaf97</inline>
+ <curve>secg/secp160r2</curve>
+ <desc>degenerate order = 61588775277324185343602394973294691093621473</desc>
+</pubkey>
+<pubkey>
+ <id>secp160r2/gen</id>
+ <inline>0x0000000000000000000000000000000000000000,0x0000000000000000000000000000000000000002</inline>
+ <curve>secg/secp160r2</curve>
+ <desc>generator of Fp^*</desc>
+</pubkey>
+
+<pubkey>
+ <id>secp160r1/0</id>
+ <inline>0x0000000000000000000000000000000000000000,0xffffffffffffffffffffffffffffffff7ffffffe</inline>
+ <curve>secg/secp160r1</curve>
+ <desc>degenerate order = 2</desc>
+</pubkey>
+<pubkey>
+ <id>secp160r1/1</id>
+ <inline>0x0000000000000000000000000000000000000000,0x5286e47bcbf86e7587ca6053773787924c765eb8</inline>
+ <curve>secg/secp160r1</curve>
+ <desc>degenerate order = 3</desc>
+</pubkey>
+<pubkey>
+ <id>secp160r1/2</id>
+ <inline>0x0000000000000000000000000000000000000000,0x6c391d32e5649a5a9fdd84584abc45d0e3604ad0</inline>
+ <curve>secg/secp160r1</curve>
+ <desc>degenerate order = 19</desc>
+</pubkey>
+<pubkey>
+ <id>secp160r1/3</id>
+ <inline>0x0000000000000000000000000000000000000000,0x26c2e1fa26e422ee36b7cdf067cd73278d1d2da4</inline>
+ <curve>secg/secp160r1</curve>
+ <desc>degenerate order = 115901</desc>
+</pubkey>
+<pubkey>
+ <id>secp160r1/4</id>
+ <inline>0x0000000000000000000000000000000000000000,0xffcb6408974e4377c57bd619ef22e839bc025fe1</inline>
+ <curve>secg/secp160r1</curve>
+ <desc>degenerate order = 6030259</desc>
+</pubkey>
+<pubkey>
+ <id>secp160r1/5</id>
+ <inline>0x0000000000000000000000000000000000000000,0x14cc0ef773488d788c437edb4e462689cb9e6004</inline>
+ <curve>secg/secp160r1</curve>
+ <desc>degenerate order = 104179991</desc>
+</pubkey>
+<pubkey>
+ <id>secp160r1/6</id>
+ <inline>0x0000000000000000000000000000000000000000,0xbdaa241dd40b0d7df97b00b41170fcb4a6fdabf9</inline>
+ <curve>secg/secp160r1</curve>
+ <desc>degenerate order = 176070659401435712181211511</desc>
+</pubkey>
+<pubkey>
+ <id>secp160r1/gen</id>
+ <inline>0x0000000000000000000000000000000000000000,0x0000000000000000000000000000000000000003</inline>
+ <curve>secg/secp160r1</curve>
+ <desc>generator of Fp^*</desc>
+</pubkey>
+
+<pubkey>
+ <id>secp192r1/0</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0xfffffffffffffffffffffffffffffffefffffffffffffffe</inline>
+ <curve>secg/secp192r1</curve>
+ <desc>degenerate order = 2</desc>
+</pubkey>
+<pubkey>
+ <id>secp192r1/1</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0x2f9fe7a38e825c1f01de3418bc1d118d66ed4626e89a9b62</inline>
+ <curve>secg/secp192r1</curve>
+ <desc>degenerate order = 59</desc>
+</pubkey>
+<pubkey>
+ <id>secp192r1/2</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0x9fbf41aed6e2e0ef99359b0316f6645402f602a520af5e3f</inline>
+ <curve>secg/secp192r1</curve>
+ <desc>degenerate order = 149309</desc>
+</pubkey>
+<pubkey>
+ <id>secp192r1/3</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0x8c89aea49b8b009d7f0d0e3af71bdd9bba9fbde0fabc5f9e</inline>
+ <curve>secg/secp192r1</curve>
+ <desc>degenerate order = 11393611</desc>
+</pubkey>
+<pubkey>
+ <id>secp192r1/4</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0xbfc817a4572bbd90b5a1b7bdcc3f2822d79fc8445541b033</inline>
+ <curve>secg/secp192r1</curve>
+ <desc>degenerate order = 108341181769254293</desc>
+</pubkey>
+<pubkey>
+ <id>secp192r1/5</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0xef8804cd3326d6354ecc3ec957019d8fde73325cf7ffd877</inline>
+ <curve>secg/secp192r1</curve>
+ <desc>degenerate order = 288626509448065367648032903</desc>
+</pubkey>
+<pubkey>
+ <id>secp192r1/gen</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0x00000000000000000000000000000000000000000000000b</inline>
+ <curve>secg/secp192r1</curve>
+ <desc>generator of Fp^*</desc>
+</pubkey>
+
+<pubkey>
+ <id>secp192k1/0</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0xfffffffffffffffffffffffffffffffffffffffeffffee36</inline>
+ <curve>secg/secp192k1</curve>
+ <desc>degenerate order = 2</desc>
+</pubkey>
+<pubkey>
+ <id>secp192k1/1</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0xbb85691939b869c1d087f601554b96b80cb4f55b35f433c2</inline>
+ <curve>secg/secp192k1</curve>
+ <desc>degenerate order = 3</desc>
+</pubkey>
+<pubkey>
+ <id>secp192k1/2</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0x52bc2dde06d9be0fca70e761d5f395852750edf7e5ded184</inline>
+ <curve>secg/secp192k1</curve>
+ <desc>degenerate order = 7</desc>
+</pubkey>
+<pubkey>
+ <id>secp192k1/3</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0x0e79be49b05f5ac28e2ac611eeafb14a4c75900d643ff5fe</inline>
+ <curve>secg/secp192k1</curve>
+ <desc>degenerate order = 11</desc>
+</pubkey>
+<pubkey>
+ <id>secp192k1/4</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0xc06c0ad9b66541332b54f95c96021bfb6d6edfccc3c01c6a</inline>
+ <curve>secg/secp192k1</curve>
+ <desc>degenerate order = 1295233555201613</desc>
+</pubkey>
+<pubkey>
+ <id>secp192k1/5</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0xf73770178fa1a34019c04218683af4621b41b80e9669f2a5</inline>
+ <curve>secg/secp192k1</curve>
+ <desc>degenerate order = 10489845818524887021689201254173392444641</desc>
+</pubkey>
+<pubkey>
+ <id>secp192k1/gen</id>
+ <inline>0x000000000000000000000000000000000000000000000000,0x000000000000000000000000000000000000000000000003</inline>
+ <curve>secg/secp192k1</curve>
+ <desc>generator of Fp^*</desc>
+</pubkey>
+
+<pubkey>
+ <id>secp224r1/0</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0xffffffffffffffffffffffffffffffff000000000000000000000000</inline>
+ <curve>secg/secp224r1</curve>
+ <desc>degenerate order = 2</desc>
+</pubkey>
+<pubkey>
+ <id>secp224r1/1</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0x94353937171b8337606664f1900be8995691cf49934d5551cc5ace29</inline>
+ <curve>secg/secp224r1</curve>
+ <desc>degenerate order = 3</desc>
+</pubkey>
+<pubkey>
+ <id>secp224r1/2</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0xa2bd9c773c593dd8031caa9a1d9f6483b4731af7167d6d795e0d9e9f</inline>
+ <curve>secg/secp224r1</curve>
+ <desc>degenerate order = 5</desc>
+</pubkey>
+<pubkey>
+ <id>secp224r1/3</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0xf15055c151148708a733ec4650e58279fb849e792c4af526f029729a</inline>
+ <curve>secg/secp224r1</curve>
+ <desc>degenerate order = 17</desc>
+</pubkey>
+<pubkey>
+ <id>secp224r1/4</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0xef92abfcfef7401f48b092a12e1abd4834f0de67a8fabccfec740794</inline>
+ <curve>secg/secp224r1</curve>
+ <desc>degenerate order = 257</desc>
+</pubkey>
+<pubkey>
+ <id>secp224r1/5</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0x3acd587a1347c0b6b0e94dc195e63cae7bd568649255ea00f8c3f844</inline>
+ <curve>secg/secp224r1</curve>
+ <desc>degenerate order = 641</desc>
+</pubkey>
+<pubkey>
+ <id>secp224r1/6</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0x7515e65e8ab6e99753c979b6b111d4dd7f9a5cc17ef79d43924b38a9</inline>
+ <curve>secg/secp224r1</curve>
+ <desc>degenerate order = 65537</desc>
+</pubkey>
+<pubkey>
+ <id>secp224r1/7</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0x872df407d9718cf23e4a9b3da9226accec9cf29f4fb1d287f222c841</inline>
+ <curve>secg/secp224r1</curve>
+ <desc>degenerate order = 274177</desc>
+</pubkey>
+<pubkey>
+ <id>secp224r1/8</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0x3012a7ffd8177bfdc61e62209414d3ec85bf25334e231f9dec255211</inline>
+ <curve>secg/secp224r1</curve>
+ <desc>degenerate order = 6700417</desc>
+</pubkey>
+<pubkey>
+ <id>secp224r1/9</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0xf366138e28cf4ac57586d5759a79949fa71225114a8925cf21a2ae35</inline>
+ <curve>secg/secp224r1</curve>
+ <desc>degenerate order = 67280421310721</desc>
+</pubkey>
+<pubkey>
+ <id>secp224r1/gen</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000,0x00000000000000000000000000000000000000000000000000000016</inline>
+ <curve>secg/secp224r1</curve>
+ <desc>generator of Fp^*</desc>
+</pubkey>
+
+<pubkey>
+ <id>secp256r1/0</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0xffffffff00000001000000000000000000000000fffffffffffffffffffffffe</inline>
+ <curve>secg/secp256r1</curve>
+ <desc>degenerate order = 2</desc>
+</pubkey>
+<pubkey>
+ <id>secp256r1/1</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0x4d6ea8928adb86cf62388a8e0ef623312e68c59bdef3e53fd964598eb819acce</inline>
+ <curve>secg/secp256r1</curve>
+ <desc>degenerate order = 3</desc>
+</pubkey>
+<pubkey>
+ <id>secp256r1/2</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0x0dc5b3bf9607f9854b836abbd19428f556a1cea2ebb7a71e3e71710ffa4f2b0e</inline>
+ <curve>secg/secp256r1</curve>
+ <desc>degenerate order = 5</desc>
+</pubkey>
+<pubkey>
+ <id>secp256r1/3</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0x04b8252e44493fb6f06c6b88e3c665c9f0d470cc964557955b267519f531a262</inline>
+ <curve>secg/secp256r1</curve>
+ <desc>degenerate order = 17</desc>
+</pubkey>
+<pubkey>
+ <id>secp256r1/4</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0xd18ddce5e27dd6a457c4ab955e351bb61b4d8d796ef679744fc0554baa8d8fc2</inline>
+ <curve>secg/secp256r1</curve>
+ <desc>degenerate order = 257</desc>
+</pubkey>
+<pubkey>
+ <id>secp256r1/5</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0xa319d26b19bcd46157ff4f68c57b3a3f780dd35a9df3dd4a4991ea6fffa0d54e</inline>
+ <curve>secg/secp256r1</curve>
+ <desc>degenerate order = 641</desc>
+</pubkey>
+<pubkey>
+ <id>secp256r1/6</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0xc0875c9f1d579d82da2e2e3bf14cb1f836852a2349501fd82ded6f8e772301c7</inline>
+ <curve>secg/secp256r1</curve>
+ <desc>degenerate order = 1531</desc>
+</pubkey>
+<pubkey>
+ <id>secp256r1/7</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0xef45524f9bdfa9473bb8020719dbc64297b7f80ea1939fb69041e799d3d5c977</inline>
+ <curve>secg/secp256r1</curve>
+ <desc>degenerate order = 65537</desc>
+</pubkey>
+<pubkey>
+ <id>secp256r1/8</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0x69214c4575b40595c02c63b57fb6de6ce6bb01e34c4a7a4cfa38fa917d3b5f74</inline>
+ <curve>secg/secp256r1</curve>
+ <desc>degenerate order = 490463</desc>
+</pubkey>
+<pubkey>
+ <id>secp256r1/9</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0xc01fe1a04efa7f9e140ccea80e206c138fa68f40900d0b75b36241e4a05f8d40</inline>
+ <curve>secg/secp256r1</curve>
+ <desc>degenerate order = 6700417</desc>
+</pubkey>
+<pubkey>
+ <id>secp256r1/10</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0xcf8f641aa234fe4b4e4d2620abc597a13300e19bcfa247ec3c33123ce7d719cb</inline>
+ <curve>secg/secp256r1</curve>
+ <desc>degenerate order = 835945042244614951780389953367877943453916927241</desc>
+</pubkey>
+<pubkey>
+ <id>secp256r1/gen</id>
+ <inline>0x0000000000000000000000000000000000000000000000000000000000000000,0x0000000000000000000000000000000000000000000000000000000000000006</inline>
+ <curve>secg/secp256r1</curve>
+ <desc>generator of Fp^*</desc>
+</pubkey>
+
+<pubkey>
+ <id>secp256k1/0</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000000000000000,0x0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e</inline>
+ <curve>secg/secp256k1</curve>
+ <desc>degenerate order = 2</desc>
+</pubkey>
+<pubkey>
+ <id>secp256k1/1</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000000000000000,0x0000851695d49a83f8ef919bb86153cbcb16630fb68aed0a766a3ec693d68e6afa40</inline>
+ <curve>secg/secp256k1</curve>
+ <desc>degenerate order = 3</desc>
+</pubkey>
+<pubkey>
+ <id>secp256k1/2</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000000000000000,0x0000a2ab335e7a5b9784e9425431411a8f02a1e39029745c0d2567e7b217154fe2cb</inline>
+ <curve>secg/secp256k1</curve>
+ <desc>degenerate order = 7</desc>
+</pubkey>
+<pubkey>
+ <id>secp256k1/3</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000000000000000,0x000068105a205ec4e9ceb2b1dd5285ab623cf09e207bad567e15482d24e582ff833f</inline>
+ <curve>secg/secp256k1</curve>
+ <desc>degenerate order = 13441</desc>
+</pubkey>
+<pubkey>
+ <id>secp256k1/4</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000000000000000,0x0000212e9abc82e8709493c087cd14e2ebd253ecf3cd0abd68a2b7b766fcc2aa4ca6</inline>
+ <curve>secg/secp256k1</curve>
+ <desc>degenerate order = 205115282021455665897114700593932402728804164701536103180137503955397371</desc>
+</pubkey>
+<pubkey>
+ <id>secp256k1/gen</id>
+ <inline>0x00000000000000000000000000000000000000000000000000000000000000000000,0x00000000000000000000000000000000000000000000000000000000000000000003</inline>
+ <curve>secg/secp256k1</curve>
+ <desc>generator of Fp^*</desc>
+</pubkey>
+
+<pubkey>
+ <id>secp384r1/0</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe</inline>
+ <curve>secg/secp384r1</curve>
+ <desc>degenerate order = 2</desc>
+</pubkey>
+<pubkey>
+ <id>secp384r1/1</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0xad23fbead5a22478b4da040e57fea836a345078a37cb2c7045c3daf1de0db10dbda32da13fd3da4dcf3d95150e3522c8</inline>
+ <curve>secg/secp384r1</curve>
+ <desc>degenerate order = 19</desc>
+</pubkey>
+<pubkey>
+ <id>secp384r1/2</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x83eb94214f07c841569b4da60430f7fc19aef03de2d2812d91ae40f9b2a7f5a83262b640fa4b31995a93869f71109783</inline>
+ <curve>secg/secp384r1</curve>
+ <desc>degenerate order = 67</desc>
+</pubkey>
+<pubkey>
+ <id>secp384r1/3</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0xb3538721ea2a7edbae6973a8efb8f5109f49af10882e02239c90c7581c7f00f4cd892daede62ca75dd89971cedb618f0</inline>
+ <curve>secg/secp384r1</curve>
+ <desc>degenerate order = 807145746439</desc>
+</pubkey>
+<pubkey>
+ <id>secp384r1/4</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0xab5c6abb2811893a9a7c4d0331e755786b1555daa209b805aec474a742d0cfd02c511e764f764543b394c6c7f89865e5</inline>
+ <curve>secg/secp384r1</curve>
+ <desc>degenerate order = 19173790298027098165721053155794528970226934547887232785722672956982046098136719667167519737147526097</desc>
+</pubkey>
+<pubkey>
+ <id>secp384r1/gen</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013</inline>
+ <curve>secg/secp384r1</curve>
+ <desc>generator of Fp^*</desc>
+</pubkey>
+
+<pubkey>
+ <id>secp521r1/0</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 2</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/1</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x0032749246cef38c558b84265cbe9454c5b08624d5cb14a69636a701122712fcae5faafa042ad6c33247520b119fd582bcd5a02f43e801348f88f734ddb0b41f5b39</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 3</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/2</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x01257bef538f850baff583c2dccc5da15be046297570d85a4dfa580a1fe9534b616321c5fb944fe9a7927ad420147aba2b6793e1a7ec25556c21ba0c60d1f29f7e93</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 5</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/3</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x01f2f4b8697ed47692e132c92228e98f0dfe1d7b868852a7d76cf9f5c08ade0dfb5033be7c9dca15b8aa68fab9a01b35abd28b490ae8f8fcfa1a2bd50bcecbca89bc</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 11</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/4</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x001836c4a3a70b921586e1194e0a17cb438619edb43846933957b7a9dc09d0f447c6a0d3163cf3a5bc8ba2b4a55658e70602dc3512021d48ece14cd625e7ac7f5985</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 17</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/5</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x01736df798237091ff59864f3fd212e01b6c496869bdc020beabf83bf656abf6fcce4c6286ea5caf1002401e1f272b1321850ad1d38e9e66abd68be0e79ad6834daa</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 31</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/6</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x011d3bf2a0312f01791ff702149a1616abb9e7cfa93f1ec4c7b9612c5204dfa8a76fcbb24a370774a2f615d98caf2964f87658de9c619b778343275a257cde6c7bab</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 41</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/7</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x0085a52672e46236148b9485bcede803ffab149344b77a389c7537bb94b9df1b3a3854192fa512c6da411653f93d8db663fd4586beef48cd05208f38870fcd763f59</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 53</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/8</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x01f5a1f4766a51e254ac60b54635b79f5830543199fdb957c0e161640a0f74a3fa85cced7857f26bd4be935b06d9fa535d9948f3bcbf1d2dadff3125c8807a21a6d6</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 131</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/9</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x00dc13e71619071f58005d54b6b16682be219d85946ea9d199f81591f795003a508b5ea8e7a392450bc2da15673d0deb35d56ac9c10ab0887a1bdcbfd0c86d9d0213</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 157</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/10</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 521</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/11</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x00309b3c9a4b45feef07448138eccff629e43e28acdb4fec0e08b0dff64e7292a076a9c733f209232968d60a7d9b7c08026865300f0c355f92021e9238b0558b483f</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 1613</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/12</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x00662f3ca82bbfc958876666a9902a96f3437fb0999c8fa28490d8a51c89a1822d576ec48085e14bd55b6cf5cd89903cbe83b3eeef30ec38e1c885222ffc954e8b84</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 2731</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/13</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x00f50e74a0ed52f6181c9a1c070de5f693c3d409e4e3bb668935b45d2a2cffcd4daabc6797d8914f18cdd44a13de1b71ca14fea6e611848495ced1f719395eed453f</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 8191</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/14</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x0156f644f4d1c482f9c79e122733067cac22834fdb56ddec5e486bbd2e61bda8ec451cce3db115e8424793bc754744fc448b8100015a4f6b8a46b5dd38efec521841</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 42641</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/15</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x018c5c75b44635605ab7f529f86851e323612933fe10cbc72a806c2bafb86e85d254246e1c7468466cc8663cd1cc3aa44ff15ad808e729df4e75fb23da6374d48e8b</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 51481</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/16</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x0043c1af0a225ffebeb76cf2d98e0480691871125d1c65304789110f60941a8e3b6265fbe338f584569f0245984050cc94afc190bcc1abc143c557609644cf10f3cf</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 61681</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/17</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x00391b1adb891ad8156a8056781c9f665eb51cd4fa6837fc2a7d7d31f7161a7b94b52a7697f24e956b4eec6956d483f52efad14f581360bc8091544932bc14767a3a</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 409891</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/18</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x01757c67f02f8b94f08642e00d4032a721d13a34243686fbb4cec8c0472bbda45fba8ab338b4afd7bac07260b4e8a21a8997eaee01cb5928f605ce0587138fde3e8c</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 858001</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/19</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x009297636ecc72ad872103c99fd3ed0ee94d24af2051d87d77a96df45b52ff26df768d8ddc0ce6e53d24ac482f9b3cc7b6ebf25601a47ce9ba95052a5dc80e4c79e5</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 5746001</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/20</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x0130713f9de95587ba4272d1a5e996beee9530e10bd5c15e3e531a9f7ae59e0587106db1802309f49b5812e8811aa667d0ce9b838d814e984caf2833e2144dfc57b7</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 7623851</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/21</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x00d08a1bd1285c19d86a1a4fd85f378bcd09a83addfdcc7e392fa9d8f9fa00b3d4af8887aff110f565c50cbc3b99bd7e5d55e051eeea5772cafb6bcec9e936de4955</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 34110701</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/22</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x00791d7f3bf9c19a1b61f8f262a2e60a22fa9adfdcc0d6afeffab8068fbd91bc079188ba0365c0fe86c92073e244294a0da331ba36ccd01dcf323e92b16d11ca2b39</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 308761441</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/23</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x0066fd8474256e396de2160ee4590caccdec49c5d099e12c7e405315a92dfb21e8277549d8d291744d79b841e8e1e86d5273fe07d3f56fed6f1c1220c2c217c289ef</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 2400573761</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/24</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x01e5be0afc4fa36bc186c73de3ab924e6572d2b239887cf028af290befab2b168e7333f78a80f66525d5bd1534c8fab6b002c5ce2ac2279c1dc0f356dc199ff98c42</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 65427463921</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/25</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x019d8298bbd7449ff8e27bb3cd2243c182bd8dee40b287e903b1da711cf8f90f21b8ab497aba68fa6f252998a16eea60f6ec0a747f58dbf34e5e4544e7b392fb96ce</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 108140989558681</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/26</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x01243fb23685cf51dcab5d05385275f63fd3eb2225aeb2ae3e0e0260d09e84c6a7f655ece1b14e54b17aa512c55ed94168a203bf70c908e1934f8b6fc04f971cdbfc</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 145295143558111</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/27</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x01f803543c1ed5ed182210105552c99b8df0b740f67423a960cd35327914efbf2ae2d4debd0116ffa6d726f9727123f3a2083c8f4633a6a6531afcea86b72a301c6c</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>degenerate order = 173308343918874810521923841</desc>
+</pubkey>
+<pubkey>
+ <id>secp521r1/gen</id>
+ <inline>0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003</inline>
+ <curve>secg/secp521r1</curve>
+ <desc>generator of Fp^*</desc>
+</pubkey>
diff --git a/src/cz/crcs/ectester/reader/ECTesterReader.java b/src/cz/crcs/ectester/reader/ECTesterReader.java
index e982721..0a3031b 100644
--- a/src/cz/crcs/ectester/reader/ECTesterReader.java
+++ b/src/cz/crcs/ectester/reader/ECTesterReader.java
@@ -247,7 +247,7 @@ public class ECTesterReader {
actions.addOption(Option.builder("ln").longOpt("list-named").desc("Print the list of supported named curves and keys.").hasArg().argName("what").optionalArg(true).build());
actions.addOption(Option.builder("e").longOpt("export").desc("Export the defaut curve parameters of the card(if any).").build());
actions.addOption(Option.builder("g").longOpt("generate").desc("Generate [amount] of EC keys.").hasArg().argName("amount").optionalArg(true).build());
- actions.addOption(Option.builder("t").longOpt("test").desc("Test ECC support. [test_suite]:\n- default:\n- invalid:\n- twist:\n- cofactor:\n- wrong:\n- composite:\n- test-vectors:").hasArg().argName("test_suite").optionalArg(true).build());
+ actions.addOption(Option.builder("t").longOpt("test").desc("Test ECC support. [test_suite]:\n- default:\n- invalid:\n- twist:\n- degenerate:\n- cofactor:\n- wrong:\n- composite:\n- test-vectors:").hasArg().argName("test_suite").optionalArg(true).build());
actions.addOption(Option.builder("dh").longOpt("ecdh").desc("Do EC KeyAgreement (ECDH...), [count] times.").hasArg().argName("count").optionalArg(true).build());
actions.addOption(Option.builder("dsa").longOpt("ecdsa").desc("Sign data with ECDSA, [count] times.").hasArg().argName("count").optionalArg(true).build());
@@ -429,6 +429,9 @@ public class ECTesterReader {
case "invalid":
suite = new CardInvalidCurvesSuite(writer, cfg, cardManager);
break;
+ case "degenerate":
+ suite = new CardDegenerateCurvesSuite(writer, cfg, cardManager);
+ break;
case "twist":
suite = new CardTwistTestSuite(writer, cfg, cardManager);
break;
@@ -764,7 +767,7 @@ public class ECTesterReader {
}
testSuite = cli.getOptionValue("test", "default").toLowerCase();
- String[] tests = new String[]{"default", "composite", "invalid", "test-vectors", "wrong", "twist", "cofactor"};
+ String[] tests = new String[]{"default", "composite", "invalid", "degenerate", "test-vectors", "wrong", "twist", "cofactor"};
if (!Arrays.asList(tests).contains(testSuite)) {
System.err.println("Unknown test suite " + testSuite + ". Should be one of: " + Arrays.toString(tests));
return false;
diff --git a/src/cz/crcs/ectester/reader/test/CardDegenerateCurvesSuite.java b/src/cz/crcs/ectester/reader/test/CardDegenerateCurvesSuite.java
new file mode 100644
index 0000000..81c2fbf
--- /dev/null
+++ b/src/cz/crcs/ectester/reader/test/CardDegenerateCurvesSuite.java
@@ -0,0 +1,55 @@
+package cz.crcs.ectester.reader.test;
+
+import cz.crcs.ectester.applet.ECTesterApplet;
+import cz.crcs.ectester.applet.EC_Consts;
+import cz.crcs.ectester.common.ec.EC_Curve;
+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.Result;
+import cz.crcs.ectester.common.test.Test;
+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;
+
+/**
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public class CardDegenerateCurvesSuite extends CardTestSuite {
+
+ public CardDegenerateCurvesSuite(TestWriter writer, ECTesterReader.Config cfg, CardMngr cardManager) {
+ super(writer, cfg, cardManager, "degenerate", "The degenerate suite tests whether the card rejects points outside of the curve during ECDH.\n" +
+ "The tested points lie on a part of the plane for which some Edwards, Hessian and Huff form addition formulas work.");
+ }
+
+ @Override
+ protected void runTests() throws Exception {
+ Map<String, EC_Key.Public> pubkeys = EC_Store.getInstance().getObjects(EC_Key.Public.class, "degenerate");
+ List<Map.Entry<EC_Curve, List<EC_Key.Public>>> curveList = EC_Store.mapToCurve(pubkeys.values());
+ for (Map.Entry<EC_Curve, List<EC_Key.Public>> e : curveList) {
+ EC_Curve curve = e.getKey();
+ List<EC_Key.Public> keys = e.getValue();
+
+ Test allocate = CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), Result.ExpectedValue.SUCCESS);
+ Test set = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.ExpectedValue.SUCCESS);
+ Test generate = CommandTest.expect(new Command.Generate(this.card, ECTesterApplet.KEYPAIR_LOCAL), Result.ExpectedValue.SUCCESS);
+
+ Test prepare = CompoundTest.all(Result.ExpectedValue.SUCCESS, "Prepare and generate keypair on " + curve.getId(), allocate, set, generate);
+
+ List<Test> ecdhTests = new LinkedList<>();
+ for (EC_Key.Public pub : keys) {
+ 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, pub.flatten());
+ ecdhTests.add(CommandTest.expect(ecdhCommand, Result.ExpectedValue.FAILURE, "Card correctly rejected point on degenerate curve.", "Card incorrectly accepted point on degenerate curve."));
+ }
+ Test ecdh = CompoundTest.all(Result.ExpectedValue.SUCCESS, "Perform ECDH with degenerate public points", ecdhTests.toArray(new Test[0]));
+
+ doTest(CompoundTest.greedyAllTry(Result.ExpectedValue.SUCCESS, "Degenerate curve test of " + curve.getId(), prepare, ecdh));
+ new Command.Cleanup(this.card).send();
+ }
+ }
+}