From bfb1202f83a36f086b69286060e7355777e83b61 Mon Sep 17 00:00:00 2001 From: J08nY Date: Mon, 30 Jul 2018 19:16:55 +0200 Subject: Find KPG algos a bit better in ECTesterStandalone. --- src/cz/crcs/ectester/reader/ECTesterReader.java | 1 - 1 file changed, 1 deletion(-) (limited to 'src/cz/crcs/ectester/reader/ECTesterReader.java') diff --git a/src/cz/crcs/ectester/reader/ECTesterReader.java b/src/cz/crcs/ectester/reader/ECTesterReader.java index 4a7d779..7bdf0f1 100644 --- a/src/cz/crcs/ectester/reader/ECTesterReader.java +++ b/src/cz/crcs/ectester/reader/ECTesterReader.java @@ -94,7 +94,6 @@ public class ECTesterReader { DESCRIPTION = "ECTesterReader " + VERSION + GIT_COMMIT + ", a javacard Elliptic Curve Cryptography support tester/utility."; CLI_HEADER = "\n" + DESCRIPTION + "\n\n"; - ; } private void run(String[] args) { -- cgit v1.2.3-70-g09d2 From b6d6766fef9b73db70bda8b6b398128ba5a41ab2 Mon Sep 17 00:00:00 2001 From: J08nY Date: Sat, 11 Aug 2018 21:52:48 +0200 Subject: Add various ECDSA tests. --- src/cz/crcs/ectester/common/ec/EC_Category.java | 21 +- src/cz/crcs/ectester/common/ec/EC_SigResult.java | 65 +++++ src/cz/crcs/ectester/common/util/CardUtil.java | 17 ++ src/cz/crcs/ectester/common/util/ECUtil.java | 4 + src/cz/crcs/ectester/data/EC_Store.java | 62 +++-- src/cz/crcs/ectester/data/categories.xml | 2 +- src/cz/crcs/ectester/data/cofactor/keys.xml | 4 +- src/cz/crcs/ectester/data/composite/keys.xml | 4 +- src/cz/crcs/ectester/data/degenerate/keys.xml | 4 +- src/cz/crcs/ectester/data/invalid/keys.xml | 4 +- src/cz/crcs/ectester/data/schema.xsd | 29 ++- src/cz/crcs/ectester/data/test/keys.xml | 4 +- src/cz/crcs/ectester/data/test/results.xml | 84 +++---- src/cz/crcs/ectester/data/twist/keys.xml | 4 +- src/cz/crcs/ectester/data/wrong/keys.xml | 16 ++ src/cz/crcs/ectester/data/wrong/results.xml | 140 +++++++++++ src/cz/crcs/ectester/data/wycheproof/keys.xml | 4 +- src/cz/crcs/ectester/data/wycheproof/results.xml | 272 ++++++++++----------- src/cz/crcs/ectester/reader/ECTesterReader.java | 8 +- .../ectester/reader/test/CardCofactorSuite.java | 23 +- .../ectester/reader/test/CardInvalidSuite.java | 21 +- .../ectester/reader/test/CardSignatureSuite.java | 45 ++++ .../crcs/ectester/reader/test/CardTwistSuite.java | 18 +- src/cz/crcs/ectester/reader/test/CommandTest.java | 19 ++ 24 files changed, 589 insertions(+), 285 deletions(-) create mode 100644 src/cz/crcs/ectester/common/ec/EC_SigResult.java create mode 100644 src/cz/crcs/ectester/data/wrong/keys.xml create mode 100644 src/cz/crcs/ectester/data/wrong/results.xml create mode 100644 src/cz/crcs/ectester/reader/test/CardSignatureSuite.java (limited to 'src/cz/crcs/ectester/reader/ECTesterReader.java') diff --git a/src/cz/crcs/ectester/common/ec/EC_Category.java b/src/cz/crcs/ectester/common/ec/EC_Category.java index 9c65f3b..8c58159 100644 --- a/src/cz/crcs/ectester/common/ec/EC_Category.java +++ b/src/cz/crcs/ectester/common/ec/EC_Category.java @@ -116,11 +116,24 @@ public class EC_Category { out.append(System.lineSeparator()); } - Map results = getObjects(EC_KAResult.class); - size = results.size(); + Map kaResults = getObjects(EC_KAResult.class); + size = kaResults.size(); if (size > 0) { - out.append(Colors.bold("\t\tResults: ")); - for (Map.Entry result : results.entrySet()) { + out.append(Colors.bold("\t\tResults(KA): ")); + for (Map.Entry result : kaResults.entrySet()) { + out.append(result.getKey()); + size--; + if (size > 0) + out.append(", "); + } + out.append(System.lineSeparator()); + } + + Map sigResults = getObjects(EC_SigResult.class); + size = sigResults.size(); + if (size > 0) { + out.append(Colors.bold("\t\tResults(SIG): ")); + for (Map.Entry result : sigResults.entrySet()) { out.append(result.getKey()); size--; if (size > 0) diff --git a/src/cz/crcs/ectester/common/ec/EC_SigResult.java b/src/cz/crcs/ectester/common/ec/EC_SigResult.java new file mode 100644 index 0000000..0595944 --- /dev/null +++ b/src/cz/crcs/ectester/common/ec/EC_SigResult.java @@ -0,0 +1,65 @@ +package cz.crcs.ectester.common.ec; + +import cz.crcs.ectester.common.util.CardUtil; + +/** + * A result of EC based Signature operation. + * + * @author Jan Jancar johny@neuromancer.sk + */ +public class EC_SigResult extends EC_Data { + private String sig; + private String curve; + private String signKey; + private String verifyKey; + + private String desc; + + public EC_SigResult(String sig, String curve, String signKey, String verifyKey) { + super(1); + this.sig = sig; + this.curve = curve; + this.signKey = signKey; + this.verifyKey = verifyKey; + } + + public EC_SigResult(String id, String sig, String curve, String signKey, String verifyKey) { + this(sig, curve, signKey, verifyKey); + this.id = id; + } + + public EC_SigResult(String id, String sig, String curve, String signKey, String verifyKey, String desc) { + this(id, sig, curve, signKey, verifyKey); + this.desc = desc; + } + + public String getSig() { + return sig; + } + + public byte getJavaCardSig() { + return CardUtil.getSig(sig); + } + + public String getCurve() { + return curve; + } + + public String getSignKey() { + return signKey; + } + + public String getVerifyKey() { + return verifyKey; + } + + public String getDesc() { + return desc; + } + + @Override + public String toString() { + return "<" + getId() + "> " + sig + " result over " + curve + ", " + signKey + " + " + verifyKey + (desc == null ? "" : ": " + desc) + System.lineSeparator() + super.toString(); + } + +} diff --git a/src/cz/crcs/ectester/common/util/CardUtil.java b/src/cz/crcs/ectester/common/util/CardUtil.java index a628d5b..e7b370c 100644 --- a/src/cz/crcs/ectester/common/util/CardUtil.java +++ b/src/cz/crcs/ectester/common/util/CardUtil.java @@ -14,6 +14,23 @@ import java.util.List; * @author Jan Jancar johny@neuromancer.sk */ public class CardUtil { + public static byte getSig(String name) { + switch (name) { + case "SHA1": + return EC_Consts.Signature_ALG_ECDSA_SHA; + case "SHA224": + return EC_Consts.Signature_ALG_ECDSA_SHA_224; + case "SHA256": + return EC_Consts.Signature_ALG_ECDSA_SHA_256; + case "SHA384": + return EC_Consts.Signature_ALG_ECDSA_SHA_384; + case "SHA512": + return EC_Consts.Signature_ALG_ECDSA_SHA_512; + default: + return EC_Consts.Signature_ALG_ECDSA_SHA; + } + } + public static byte getKA(String name) { switch (name) { case "DH": diff --git a/src/cz/crcs/ectester/common/util/ECUtil.java b/src/cz/crcs/ectester/common/util/ECUtil.java index 3c1f138..6c3ad58 100644 --- a/src/cz/crcs/ectester/common/util/ECUtil.java +++ b/src/cz/crcs/ectester/common/util/ECUtil.java @@ -210,4 +210,8 @@ public class ECUtil { ECPrivateKey privkey = new RawECPrivateKey(toScalar(kp), curve.toSpec()); return new KeyPair(pubkey, privkey); } + + public static byte[] toDERSignature(byte[] r, byte[] s) { + return ByteUtil.concatenate(new byte[]{0x30, (byte) (r.length + s.length + 4), 0x02, (byte) r.length}, r, new byte[]{0x02, (byte) s.length}, s); + } } diff --git a/src/cz/crcs/ectester/data/EC_Store.java b/src/cz/crcs/ectester/data/EC_Store.java index cb65402..3eaef27 100644 --- a/src/cz/crcs/ectester/data/EC_Store.java +++ b/src/cz/crcs/ectester/data/EC_Store.java @@ -203,27 +203,15 @@ public class EC_Store { if (direct instanceof Element) { Element elem = (Element) direct; - Node id = elem.getElementsByTagName("id").item(0); - Node ka = elem.getElementsByTagName("ka").item(0); - Node curve = elem.getElementsByTagName("curve").item(0); - Node onekey = elem.getElementsByTagName("onekey").item(0); - Node otherkey = elem.getElementsByTagName("otherkey").item(0); - - NodeList descc = elem.getElementsByTagName("desc"); - String descs = null; - if (descc.getLength() != 0) { - descs = descc.item(0).getTextContent(); + NodeList ids = elem.getElementsByTagName("id"); + if (ids.getLength() != 1) { + throw new SAXException("result no id?"); } + String id = ids.item(0).getTextContent(); - EC_KAResult kaResult = new EC_KAResult(id.getTextContent(), ka.getTextContent(), curve.getTextContent(), onekey.getTextContent(), otherkey.getTextContent(), descs); - - InputStream csv = parseDataElement(dir, elem); - if (!kaResult.readCSV(csv)) { - throw new IOException("Invalid csv data. " + id.getTextContent()); - } - csv.close(); + EC_Data result = parseResultlike(dir, elem); - objMap.put(id.getTextContent(), kaResult); + objMap.put(id, result); } else { throw new SAXException("?"); } @@ -234,6 +222,44 @@ public class EC_Store { return new EC_Category(name, dir, desc, objMap); } + private EC_Data parseResultlike(String dir, Element elem) throws SAXException, IOException { + String tag = elem.getTagName(); + Node id = elem.getElementsByTagName("id").item(0); + + NodeList descc = elem.getElementsByTagName("desc"); + String descs = null; + if (descc.getLength() != 0) { + descs = descc.item(0).getTextContent(); + } + + Node curve = elem.getElementsByTagName("curve").item(0); + + EC_Data result; + if (tag.equals("kaResult")) { + Node ka = elem.getElementsByTagName("ka").item(0); + Node onekey = elem.getElementsByTagName("onekey").item(0); + Node otherkey = elem.getElementsByTagName("otherkey").item(0); + + result = new EC_KAResult(id.getTextContent(), ka.getTextContent(), curve.getTextContent(), onekey.getTextContent(), otherkey.getTextContent(), descs); + } else if (tag.equals("sigResult")) { + Node sig = elem.getElementsByTagName("sig").item(0); + Node signkey = elem.getElementsByTagName("signkey").item(0); + Node verifykey = elem.getElementsByTagName("verifykey").item(0); + + result = new EC_SigResult(id.getTextContent(), sig.getTextContent(), curve.getTextContent(), signkey.getTextContent(), verifykey.getTextContent()); + } else { + throw new SAXException("?"); + } + + InputStream csv = parseDataElement(dir, elem); + if (!result.readCSV(csv)) { + throw new IOException("Invalid csv data. " + id.getTextContent()); + } + csv.close(); + + return result; + } + private EC_Params parseKeylike(String dir, Element elem) throws SAXException, IOException { Node id = elem.getElementsByTagName("id").item(0); Node curve = elem.getElementsByTagName("curve").item(0); diff --git a/src/cz/crcs/ectester/data/categories.xml b/src/cz/crcs/ectester/data/categories.xml index 38ce683..082f92c 100644 --- a/src/cz/crcs/ectester/data/categories.xml +++ b/src/cz/crcs/ectester/data/categories.xml @@ -77,7 +77,7 @@ wrong wrong - Wrong field curves. These should definitely give an error when used. Since the "prime" used for the field is not prime, and the field polynomials are also not irreducible. Simply put these parameters don't specify a valid elliptic curve. + Wrong field curves and other wrong parameters. These should definitely give an error when used. Since the "prime" used for the field is not prime, and the field polynomials are also not irreducible. Simply put these parameters don't specify a valid elliptic curve. test diff --git a/src/cz/crcs/ectester/data/cofactor/keys.xml b/src/cz/crcs/ectester/data/cofactor/keys.xml index 8cf19a1..b4c0c90 100644 --- a/src/cz/crcs/ectester/data/cofactor/keys.xml +++ b/src/cz/crcs/ectester/data/cofactor/keys.xml @@ -3,9 +3,7 @@ ]> + xsi:noNamespaceSchemaLocation="../schema.xsd"> cofactor128p2/0 diff --git a/src/cz/crcs/ectester/data/composite/keys.xml b/src/cz/crcs/ectester/data/composite/keys.xml index 8a98135..da770d8 100644 --- a/src/cz/crcs/ectester/data/composite/keys.xml +++ b/src/cz/crcs/ectester/data/composite/keys.xml @@ -1,8 +1,6 @@ + xsi:noNamespaceSchemaLocation="../schema.xsd"> composite128/1 0x746fa441b3a54d3c531bd59d119f400d,0x73aff68dbd96e1485cd2de0f6389cc70 diff --git a/src/cz/crcs/ectester/data/degenerate/keys.xml b/src/cz/crcs/ectester/data/degenerate/keys.xml index cbeecce..b999ca0 100644 --- a/src/cz/crcs/ectester/data/degenerate/keys.xml +++ b/src/cz/crcs/ectester/data/degenerate/keys.xml @@ -4,9 +4,7 @@ ]> + xsi:noNamespaceSchemaLocation="../schema.xsd">