diff options
| author | J08nY | 2017-04-19 21:56:39 +0200 |
|---|---|---|
| committer | J08nY | 2017-04-19 21:56:39 +0200 |
| commit | 3aaead661e2b23b5e5811a3a06daed61db638a72 (patch) | |
| tree | 41312c609ca39d3f8f3fed306130f87a09f61da8 | |
| parent | 3e1290ca718aadf6dd2f920107493f2cd8f874ab (diff) | |
| download | ECTester-3aaead661e2b23b5e5811a3a06daed61db638a72.tar.gz ECTester-3aaead661e2b23b5e5811a3a06daed61db638a72.tar.zst ECTester-3aaead661e2b23b5e5811a3a06daed61db638a72.zip | |
| -rw-r--r-- | !uploader/ectester.cap | bin | 14353 -> 14586 bytes | |||
| -rw-r--r-- | dist/ECTester.jar | bin | 322457 -> 323844 bytes | |||
| -rw-r--r-- | src/cz/crcs/ectester/applet/ECKeyGenerator.java | 12 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/applet/ECKeyTester.java | 27 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/applet/ECTesterApplet.java | 8 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/applet/ECUtil.java | 24 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/applet/EC_Consts.java | 1 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/data/EC_Store.java | 23 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/data/schema.xsd | 4 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/data/test/results.xml | 10 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/ECTester.java | 5 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/Response.java | 4 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/TestSuite.java | 1 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/Util.java | 18 |
14 files changed, 103 insertions, 34 deletions
diff --git a/!uploader/ectester.cap b/!uploader/ectester.cap Binary files differindex 1e7235d..ea66c8f 100644 --- a/!uploader/ectester.cap +++ b/!uploader/ectester.cap diff --git a/dist/ECTester.jar b/dist/ECTester.jar Binary files differindex 58f44b9..adfa6d4 100644 --- a/dist/ECTester.jar +++ b/dist/ECTester.jar diff --git a/src/cz/crcs/ectester/applet/ECKeyGenerator.java b/src/cz/crcs/ectester/applet/ECKeyGenerator.java index a36bd0c..a602ab1 100644 --- a/src/cz/crcs/ectester/applet/ECKeyGenerator.java +++ b/src/cz/crcs/ectester/applet/ECKeyGenerator.java @@ -40,7 +40,7 @@ public class ECKeyGenerator { public short clearPair(KeyPair keypair, byte key) { try { - sw = ECUtil.nullCheck(keypair); + sw = ECUtil.keypairCheck(keypair); if ((key & EC_Consts.KEY_PUBLIC) != 0) keypair.getPublic().clearKey(); if ((key & EC_Consts.KEY_PRIVATE) != 0) keypair.getPrivate().clearKey(); } catch (CardRuntimeException ce) { @@ -55,7 +55,7 @@ public class ECKeyGenerator { */ public short generatePair(KeyPair keypair) { try { - sw = ECUtil.nullCheck(keypair); + sw = ECUtil.keypairCheck(keypair); keypair.genKeyPair(); } catch (CardRuntimeException ce) { sw = ce.getReason(); @@ -156,7 +156,7 @@ public class ECKeyGenerator { */ public short setParameter(KeyPair keypair, byte key, short param, byte[] data, short offset, short length) { try { - sw = ECUtil.nullCheck(keypair); + sw = ECUtil.keypairCheck(keypair); ECPublicKey ecPublicKey = (ECPublicKey) keypair.getPublic(); ECPrivateKey ecPrivateKey = (ECPrivateKey) keypair.getPrivate(); @@ -281,7 +281,7 @@ public class ECKeyGenerator { public short exportParameter(KeyPair keypair, byte key, short param, byte[] outputBuffer, short outputOffset) { short length = 0; try { - sw = ECUtil.nullCheck(keypair); + sw = ECUtil.keypairCheck(keypair); ECPublicKey ecPublicKey = (ECPublicKey) keypair.getPublic(); ECPrivateKey ecPrivateKey = (ECPrivateKey) keypair.getPrivate(); @@ -390,8 +390,8 @@ public class ECKeyGenerator { */ public short copyCurve(KeyPair from, KeyPair to, short params, byte[] buffer, short offset) { try { - sw = ECUtil.nullCheck(from); - sw = ECUtil.nullCheck(to); + sw = ECUtil.keypairCheck(from); + sw = ECUtil.keypairCheck(to); short param = EC_Consts.PARAMETER_FP; while (param <= EC_Consts.PARAMETER_K) { diff --git a/src/cz/crcs/ectester/applet/ECKeyTester.java b/src/cz/crcs/ectester/applet/ECKeyTester.java index c4b58e0..aac4656 100644 --- a/src/cz/crcs/ectester/applet/ECKeyTester.java +++ b/src/cz/crcs/ectester/applet/ECKeyTester.java @@ -53,8 +53,9 @@ public class ECKeyTester { private short testKA(KeyAgreement ka, KeyPair privatePair, KeyPair publicPair, byte[] pubkeyBuffer, short pubkeyOffset, byte[] outputBuffer, short outputOffset, byte corruption) { short length = 0; try { - sw = ECUtil.nullCheck(privatePair); - sw = ECUtil.nullCheck(publicPair); + sw = ECUtil.kaCheck(ka); + sw = ECUtil.keypairCheck(privatePair); + sw = ECUtil.keypairCheck(publicPair); ka.init(privatePair.getPrivate()); short pubkeyLength = ((ECPublicKey) publicPair.getPublic()).getW(pubkeyBuffer, pubkeyOffset); @@ -113,7 +114,7 @@ public class ECKeyTester { * @param corruption * @return */ - public short testECDH_ECDHC(KeyPair privatePair, KeyPair publicPair, byte[] pubkeyBuffer, short pubkeyOffset, byte[] outputBuffer, short outputOffset, byte corruption) { + public short testBOTH(KeyPair privatePair, KeyPair publicPair, byte[] pubkeyBuffer, short pubkeyOffset, byte[] outputBuffer, short outputOffset, byte corruption) { short ecdhLength = testECDH(privatePair, publicPair, pubkeyBuffer, pubkeyOffset, outputBuffer, outputOffset, corruption); if (sw != ISO7816.SW_NO_ERROR) { return ecdhLength; @@ -131,6 +132,23 @@ public class ECKeyTester { } /** + * + * @param privatePair + * @param publicPair + * @param pubkeyBuffer + * @param pubkeyOffset + * @param outputBuffer + * @param outputOffset + * @param corruption + * @return + */ + public short testANY(KeyPair privatePair, KeyPair publicPair, byte[] pubkeyBuffer, short pubkeyOffset, byte[]outputBuffer, short outputOffset, byte corruption) { + short ecdhLength = testECDH(privatePair, publicPair, pubkeyBuffer, pubkeyOffset, outputBuffer, outputOffset, corruption); + if (sw == ISO7816.SW_NO_ERROR) + return ecdhLength; + return testECDHC(privatePair, publicPair, pubkeyBuffer, pubkeyOffset, outputBuffer, outputOffset, corruption); + } + /** * Uses {@code signKey} to sign data from {@code inputBuffer} at {@code inputOffset} with {@code inputOffset}. * Then checks for correct signature length. * Then tries verifying the data with {@code verifyKey}. @@ -145,9 +163,10 @@ public class ECKeyTester { * @return signature length */ public short testECDSA(ECPrivateKey signKey, ECPublicKey verifyKey, byte[] inputBuffer, short inputOffset, short inputLength, byte[] sigBuffer, short sigOffset) { - sw = ISO7816.SW_NO_ERROR; short length = 0; try { + sw = ECUtil.signCheck(ecdsaSignature); + ecdsaSignature.init(signKey, Signature.MODE_SIGN); length = ecdsaSignature.sign(inputBuffer, inputOffset, inputLength, sigBuffer, sigOffset); diff --git a/src/cz/crcs/ectester/applet/ECTesterApplet.java b/src/cz/crcs/ectester/applet/ECTesterApplet.java index f802233..88d1b8c 100644 --- a/src/cz/crcs/ectester/applet/ECTesterApplet.java +++ b/src/cz/crcs/ectester/applet/ECTesterApplet.java @@ -65,6 +65,9 @@ public class ECTesterApplet extends Applet { public static final short SW_SIG_VERIFY_FAIL = (short) 0x0ee1; public static final short SW_DH_DHC_MISMATCH = (short) 0x0ee2; public static final short SW_KEYPAIR_NULL = (short) 0x0ee3; + public static final short SW_KA_NULL = (short) 0x0ee4; + public static final short SW_SIGNATURE_NULL = (short) 0x0ee5; + public static final short SW_OBJECT_NULL = (short) 0x0ee6; private static final short ARRAY_LENGTH = (short) 0xff; @@ -558,7 +561,10 @@ public class ECTesterApplet extends Applet { secretLength = keyTester.testECDHC(priv, pub, ramArray, (short) 0, ramArray2, (short) 0, corruption); break; case EC_Consts.KA_BOTH: - secretLength = keyTester.testECDH_ECDHC(priv, pub, ramArray, (short) 0, ramArray2, (short) 0, corruption); + secretLength = keyTester.testBOTH(priv, pub, ramArray, (short) 0, ramArray2, (short) 0, corruption); + break; + case EC_Consts.KA_ANY: + secretLength = keyTester.testANY(priv, pub, ramArray, (short) 0, ramArray2, (short)0, corruption); break; default: ISOException.throwIt(ISO7816.SW_FUNC_NOT_SUPPORTED); diff --git a/src/cz/crcs/ectester/applet/ECUtil.java b/src/cz/crcs/ectester/applet/ECUtil.java index e7e4a8a..5d5c4d2 100644 --- a/src/cz/crcs/ectester/applet/ECUtil.java +++ b/src/cz/crcs/ectester/applet/ECUtil.java @@ -2,16 +2,34 @@ package cz.crcs.ectester.applet; import javacard.framework.ISO7816; import javacard.framework.ISOException; +import javacard.security.KeyAgreement; import javacard.security.KeyPair; +import javacard.security.Signature; /** * @author Jan Jancar johny@neuromancer.sk */ public class ECUtil { - static short nullCheck(KeyPair keyPair) { - if (keyPair == null) - ISOException.throwIt(ECTesterApplet.SW_KEYPAIR_NULL); + private static short nullCheck(Object obj, short sw) { + if (obj == null) + ISOException.throwIt(sw); return ISO7816.SW_NO_ERROR; } + + static short objCheck(Object obj) { + return nullCheck(obj, ECTesterApplet.SW_OBJECT_NULL); + } + + static short keypairCheck(KeyPair keyPair) { + return nullCheck(keyPair, ECTesterApplet.SW_KEYPAIR_NULL); + } + + static short kaCheck(KeyAgreement keyAgreement) { + return nullCheck(keyAgreement, ECTesterApplet.SW_KA_NULL); + } + + static short signCheck(Signature signature) { + return nullCheck(signature, ECTesterApplet.SW_SIGNATURE_NULL); + } } diff --git a/src/cz/crcs/ectester/applet/EC_Consts.java b/src/cz/crcs/ectester/applet/EC_Consts.java index 534d552..1334541 100644 --- a/src/cz/crcs/ectester/applet/EC_Consts.java +++ b/src/cz/crcs/ectester/applet/EC_Consts.java @@ -64,6 +64,7 @@ public class EC_Consts { public static final byte KA_ECDH = 0x01; public static final byte KA_ECDHC = 0x02; public static final byte KA_BOTH = KA_ECDH | KA_ECDHC; + public static final byte KA_ANY = 0x04; public static RandomData randomData = null; diff --git a/src/cz/crcs/ectester/data/EC_Store.java b/src/cz/crcs/ectester/data/EC_Store.java index ccd3586..906eb8d 100644 --- a/src/cz/crcs/ectester/data/EC_Store.java +++ b/src/cz/crcs/ectester/data/EC_Store.java @@ -227,11 +227,22 @@ public class EC_Store { descs = descc.item(0).getTextContent(); } - byte kab; - if (ka.getTextContent().equals("DH")) { - kab = EC_Consts.KA_ECDH; - } else { - kab = EC_Consts.KA_ECDHC; + byte kab = EC_Consts.KA_ANY; + switch (ka.getTextContent()) { + case "DH": + case "ECDH": + kab = EC_Consts.KA_ECDH; + break; + case "DHC": + case "ECDHC": + kab = EC_Consts.KA_ECDHC; + break; + case "ANY": + kab = EC_Consts.KA_ANY; + break; + case "BOTH": + kab = EC_Consts.KA_BOTH; + break; } EC_KAResult kaResult = new EC_KAResult(id.getTextContent(), kab, curve.getTextContent(), onekey.getTextContent(), otherkey.getTextContent(), descs); @@ -254,7 +265,7 @@ public class EC_Store { } private EC_Params parseKeylike(String dir, Element elem) throws SAXException, IOException { - Node file = elem.getElementsByTagName("file").item(0); + Node id = elem.getElementsByTagName("id").item(0); Node curve = elem.getElementsByTagName("curve").item(0); NodeList desc = elem.getElementsByTagName("desc"); diff --git a/src/cz/crcs/ectester/data/schema.xsd b/src/cz/crcs/ectester/data/schema.xsd index 33b9acd..2fe7892 100644 --- a/src/cz/crcs/ectester/data/schema.xsd +++ b/src/cz/crcs/ectester/data/schema.xsd @@ -61,7 +61,11 @@ <xs:simpleType name="kaType"> <xs:restriction base="xs:string"> <xs:enumeration value="DH"/> + <xs:enumeration value="ECDH"/> <xs:enumeration value="DHC"/> + <xs:enumeration value="ECDHC"/> + <xs:enumeration value="BOTH"/> + <xs:enumeration value="ANY"/> </xs:restriction> </xs:simpleType> diff --git a/src/cz/crcs/ectester/data/test/results.xml b/src/cz/crcs/ectester/data/test/results.xml index e382cd4..1146500 100644 --- a/src/cz/crcs/ectester/data/test/results.xml +++ b/src/cz/crcs/ectester/data/test/results.xml @@ -133,7 +133,7 @@ </result> <result> <id>p192-dhc</id> - <ka>DHC</ka> + <ka>ANY</ka> <file>nist/p192-dhc-sha1.csv</file> <curve>nist/P-192</curve> <onekey>test/p192-A</onekey> @@ -141,7 +141,7 @@ </result> <result> <id>p224-dhc</id> - <ka>DHC</ka> + <ka>ANY</ka> <file>nist/p224-dhc-sha1.csv</file> <curve>nist/P-224</curve> <onekey>test/p224-A</onekey> @@ -149,7 +149,7 @@ </result> <result> <id>p256-dhc</id> - <ka>DHC</ka> + <ka>ANY</ka> <file>nist/p256-dhc-sha1.csv</file> <curve>nist/P-256</curve> <onekey>test/p256-A</onekey> @@ -157,7 +157,7 @@ </result> <result> <id>p384-dhc</id> - <ka>DHC</ka> + <ka>ANY</ka> <file>nist/p384-dhc-sha1.csv</file> <curve>nist/P-384</curve> <onekey>test/p384-A</onekey> @@ -165,7 +165,7 @@ </result> <result> <id>p521-dhc</id> - <ka>DHC</ka> + <ka>ANY</ka> <file>nist/p521-dhc-sha1.csv</file> <curve>nist/P-521</curve> <onekey>test/p521-A</onekey> diff --git a/src/cz/crcs/ectester/reader/ECTester.java b/src/cz/crcs/ectester/reader/ECTester.java index 8afda17..9191b70 100644 --- a/src/cz/crcs/ectester/reader/ECTester.java +++ b/src/cz/crcs/ectester/reader/ECTester.java @@ -471,10 +471,7 @@ public class ECTester { List<Response> test = Command.sendAll(commands); if (suite != null) { - List<Test> tests = suite.run(cardManager); - for (Test t : tests) { - System.out.println(t); - } + suite.run(cardManager); } systemOutLogger.println(Response.toString(test, cfg.testSuite)); diff --git a/src/cz/crcs/ectester/reader/Response.java b/src/cz/crcs/ectester/reader/Response.java index e5b8c1c..89dce9c 100644 --- a/src/cz/crcs/ectester/reader/Response.java +++ b/src/cz/crcs/ectester/reader/Response.java @@ -140,9 +140,7 @@ public abstract class Response { out.append(prefix); String message = r.toString(); - String full = r.toString(message); - - out.append(full); + out.append(message); if (i < responses.size() - 1) { out.append("\n"); } diff --git a/src/cz/crcs/ectester/reader/TestSuite.java b/src/cz/crcs/ectester/reader/TestSuite.java index 892e853..56e0a4a 100644 --- a/src/cz/crcs/ectester/reader/TestSuite.java +++ b/src/cz/crcs/ectester/reader/TestSuite.java @@ -63,6 +63,7 @@ public abstract class TestSuite { } public static class TestVectors extends TestSuite { + public TestVectors(EC_Store dataStore, ECTester.Config cfg) { super(dataStore, cfg, "test"); } diff --git a/src/cz/crcs/ectester/reader/Util.java b/src/cz/crcs/ectester/reader/Util.java index 3a6a8ae..6fe3b8e 100644 --- a/src/cz/crcs/ectester/reader/Util.java +++ b/src/cz/crcs/ectester/reader/Util.java @@ -157,6 +157,9 @@ public class Util { case ECTesterApplet.SW_SIG_VERIFY_FAIL: case ECTesterApplet.SW_DH_DHC_MISMATCH: case ECTesterApplet.SW_KEYPAIR_NULL: + case ECTesterApplet.SW_KA_NULL: + case ECTesterApplet.SW_SIGNATURE_NULL: + case ECTesterApplet.SW_OBJECT_NULL: return "ECTesterApplet"; default: return "?"; @@ -259,6 +262,15 @@ public class Util { case ECTesterApplet.SW_KEYPAIR_NULL: str = "KEYPAIR_NULL"; break; + case ECTesterApplet.SW_KA_NULL: + str = "KA_NULL"; + break; + case ECTesterApplet.SW_SIGNATURE_NULL: + str = "SIGNATURE_NULL"; + break; + case ECTesterApplet.SW_OBJECT_NULL: + str = "OBJECT_NULL"; + break; default: str = "unknown"; break; @@ -303,13 +315,15 @@ public class Util { public static String getKA(byte ka) { String algo = ""; - if ((ka & EC_Consts.KA_ECDH) != 0) { + if ((ka & EC_Consts.KA_ECDH) != 0 || ka == EC_Consts.KA_ANY) { algo += "ECDH"; } if (ka == EC_Consts.KA_BOTH) { algo += "+"; + } else if (ka == EC_Consts.KA_ANY) { + algo += "/"; } - if ((ka & EC_Consts.KA_ECDHC) != 0) { + if ((ka & EC_Consts.KA_ECDHC) != 0 || ka == EC_Consts.KA_ANY) { algo += "ECDHC"; } return algo; |
