aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJ08nY2018-06-27 22:00:59 +0200
committerJ08nY2018-06-27 22:00:59 +0200
commit662cc82a470a833a11e19a2dc8c1ce0e79c35935 (patch)
tree774d36ba7ceeead7897136900c9be485e4c4ae2e /src
parent46f3b1218d55ea856986cd7afb4804152c230c4f (diff)
downloadECTester-662cc82a470a833a11e19a2dc8c1ce0e79c35935.tar.gz
ECTester-662cc82a470a833a11e19a2dc8c1ce0e79c35935.tar.zst
ECTester-662cc82a470a833a11e19a2dc8c1ce0e79c35935.zip
Diffstat (limited to 'src')
-rw-r--r--src/cz/crcs/ectester/applet/EC_Consts.java6
-rw-r--r--src/cz/crcs/ectester/common/test/BaseTestable.java7
-rw-r--r--src/cz/crcs/ectester/common/test/CompoundTest.java7
-rw-r--r--src/cz/crcs/ectester/common/test/SimpleTest.java15
-rw-r--r--src/cz/crcs/ectester/common/test/Test.java7
-rw-r--r--src/cz/crcs/ectester/common/util/CardUtil.java129
-rw-r--r--src/cz/crcs/ectester/reader/command/Command.java10
-rw-r--r--src/cz/crcs/ectester/reader/test/CardWrongCurvesSuite.java27
-rw-r--r--src/cz/crcs/ectester/standalone/ECTesterStandalone.java1
9 files changed, 174 insertions, 35 deletions
diff --git a/src/cz/crcs/ectester/applet/EC_Consts.java b/src/cz/crcs/ectester/applet/EC_Consts.java
index c24283a..3f3ddb6 100644
--- a/src/cz/crcs/ectester/applet/EC_Consts.java
+++ b/src/cz/crcs/ectester/applet/EC_Consts.java
@@ -995,6 +995,7 @@ public class EC_Consts {
public static final short TRANSFORMATION_INFINITY = (short) 0x80;
public static final short TRANSFORMATION_COMPRESS = (short) 0x0100;
public static final short TRANSFORMATION_COMPRESS_HYBRID = (short) 0x0200;
+ public static final short TRANSFORMATION_04_MASK = (short) 0x0400;
// toX962 FORM types
public static final byte X962_UNCOMPRESSED = (byte) 0x00;
@@ -1333,7 +1334,7 @@ public class EC_Consts {
}
short transformationMask = TRANSFORMATION_FIXED;
- while (transformationMask <= TRANSFORMATION_COMPRESS) {
+ while (transformationMask <= TRANSFORMATION_04_MASK) {
short transformationPart = (short) (transformationMask & transformation);
switch (transformationPart) {
case (short) 0:
@@ -1408,6 +1409,9 @@ public class EC_Consts {
buffer[offset] += 4;
}
break;
+ case TRANSFORMATION_04_MASK:
+ buffer[offset] = 4;
+ break;
default:
ISOException.throwIt(ISO7816.SW_FUNC_NOT_SUPPORTED);
}
diff --git a/src/cz/crcs/ectester/common/test/BaseTestable.java b/src/cz/crcs/ectester/common/test/BaseTestable.java
index 4863abc..3c304d9 100644
--- a/src/cz/crcs/ectester/common/test/BaseTestable.java
+++ b/src/cz/crcs/ectester/common/test/BaseTestable.java
@@ -3,7 +3,7 @@ package cz.crcs.ectester.common.test;
/**
* @author Jan Jancar johny@neuromancer.sk
*/
-public abstract class BaseTestable implements Testable {
+public abstract class BaseTestable implements Testable, Cloneable {
protected boolean hasRun;
protected boolean ok;
protected boolean error;
@@ -36,4 +36,9 @@ public abstract class BaseTestable implements Testable {
error = false;
errorCause = null;
}
+
+ @Override
+ protected BaseTestable clone() throws CloneNotSupportedException {
+ return (BaseTestable) super.clone();
+ }
}
diff --git a/src/cz/crcs/ectester/common/test/CompoundTest.java b/src/cz/crcs/ectester/common/test/CompoundTest.java
index 607dadb..ba4ad4f 100644
--- a/src/cz/crcs/ectester/common/test/CompoundTest.java
+++ b/src/cz/crcs/ectester/common/test/CompoundTest.java
@@ -10,7 +10,7 @@ import java.util.function.Function;
*
* @author Jan Jancar johny@neuromancer.sk
*/
-public class CompoundTest extends Test {
+public class CompoundTest extends Test implements Cloneable {
private Function<Test[], Result> resultCallback;
private Consumer<Test[]> runCallback;
private Test[] tests;
@@ -206,4 +206,9 @@ public class CompoundTest extends Test {
public String getDescription() {
return description;
}
+
+ @Override
+ public CompoundTest clone() throws CloneNotSupportedException {
+ return (CompoundTest) super.clone();
+ }
}
diff --git a/src/cz/crcs/ectester/common/test/SimpleTest.java b/src/cz/crcs/ectester/common/test/SimpleTest.java
index 85f1072..d2b3e94 100644
--- a/src/cz/crcs/ectester/common/test/SimpleTest.java
+++ b/src/cz/crcs/ectester/common/test/SimpleTest.java
@@ -4,11 +4,17 @@ package cz.crcs.ectester.common.test;
* @param <T>
* @author Jan Jancar johny@neuromancer.sk
*/
-public abstract class SimpleTest<T extends BaseTestable> extends Test {
+public abstract class SimpleTest<T extends BaseTestable> extends Test implements Testable {
protected T testable;
protected TestCallback<T> callback;
public SimpleTest(T testable, TestCallback<T> callback) {
+ if (testable == null) {
+ throw new IllegalArgumentException("testable is null.");
+ }
+ if (callback == null) {
+ throw new IllegalArgumentException("callback is null.");
+ }
this.testable = testable;
this.callback = callback;
}
@@ -22,4 +28,11 @@ public abstract class SimpleTest<T extends BaseTestable> extends Test {
testable.run();
result = callback.apply(testable);
}
+
+ @Override
+ public SimpleTest clone() throws CloneNotSupportedException {
+ SimpleTest clone = (SimpleTest) super.clone();
+ clone.testable = testable.clone();
+ return clone;
+ }
}
diff --git a/src/cz/crcs/ectester/common/test/Test.java b/src/cz/crcs/ectester/common/test/Test.java
index 055ec1c..8bf9502 100644
--- a/src/cz/crcs/ectester/common/test/Test.java
+++ b/src/cz/crcs/ectester/common/test/Test.java
@@ -7,7 +7,7 @@ import static cz.crcs.ectester.common.test.Result.Value;
*
* @author Jan Jancar johny@neuromancer.sk
*/
-public abstract class Test implements Testable {
+public abstract class Test implements Testable, Cloneable {
protected boolean hasRun;
protected boolean hasStarted;
protected Result result;
@@ -58,6 +58,11 @@ public abstract class Test implements Testable {
public abstract String getDescription();
@Override
+ public Test clone() throws CloneNotSupportedException {
+ return (Test) super.clone();
+ }
+
+ @Override
public void run() {
if (hasRun)
return;
diff --git a/src/cz/crcs/ectester/common/util/CardUtil.java b/src/cz/crcs/ectester/common/util/CardUtil.java
index 26fdb78..a628d5b 100644
--- a/src/cz/crcs/ectester/common/util/CardUtil.java
+++ b/src/cz/crcs/ectester/common/util/CardUtil.java
@@ -6,6 +6,9 @@ import javacard.framework.ISO7816;
import javacard.security.CryptoException;
import javacard.security.KeyPair;
+import java.util.LinkedList;
+import java.util.List;
+
/**
* @author Petr Svenda petr@svenda.com
* @author Jan Jancar johny@neuromancer.sk
@@ -183,32 +186,106 @@ public class CardUtil {
}
}
+ public static String getParams(short params) {
+ if (params == 0) {
+ return "";
+ }
+ List<String> ps = new LinkedList<>();
+ short paramMask = EC_Consts.PARAMETER_FP;
+ while (paramMask <= EC_Consts.PARAMETER_S) {
+ short paramValue = (short) (paramMask & params);
+ if (paramValue != 0) {
+ switch (paramValue) {
+ case EC_Consts.PARAMETER_FP:
+ ps.add("P");
+ break;
+ case EC_Consts.PARAMETER_F2M:
+ ps.add("2^M");
+ break;
+ case EC_Consts.PARAMETER_A:
+ ps.add("A");
+ break;
+ case EC_Consts.PARAMETER_B:
+ ps.add("B");
+ break;
+ case EC_Consts.PARAMETER_G:
+ ps.add("G");
+ break;
+ case EC_Consts.PARAMETER_R:
+ ps.add("R");
+ break;
+ case EC_Consts.PARAMETER_K:
+ ps.add("K");
+ break;
+ case EC_Consts.PARAMETER_W:
+ ps.add("W");
+ break;
+ case EC_Consts.PARAMETER_S:
+ ps.add("S");
+ break;
+ }
+ }
+ paramMask = (short) (paramMask << 1);
+ }
+
+ if (ps.size() != 0) {
+ return "[" + String.join(",", ps) + "]";
+ } else {
+ return "unknown";
+ }
+ }
+
public static String getTransformation(short transformationType) {
- switch (transformationType) {
- case EC_Consts.TRANSFORMATION_NONE:
- return "NONE";
- case EC_Consts.TRANSFORMATION_FIXED:
- return "FIXED";
- case EC_Consts.TRANSFORMATION_ONE:
- return "ONE";
- case EC_Consts.TRANSFORMATION_ZERO:
- return "ZERO";
- case EC_Consts.TRANSFORMATION_ONEBYTERANDOM:
- return "ONE_BYTE_RANDOM";
- case EC_Consts.TRANSFORMATION_FULLRANDOM:
- return "FULL_RANDOM";
- case EC_Consts.TRANSFORMATION_INCREMENT:
- return "INCREMENT";
- case EC_Consts.TRANSFORMATION_INFINITY:
- return "INFINITY";
- case EC_Consts.TRANSFORMATION_COMPRESS:
- return "COMPRESSED";
- case EC_Consts.TRANSFORMATION_COMPRESS_HYBRID:
- return "HYBRID";
- case EC_Consts.TRANSFORMATION_MAX:
- return "MAX";
- default:
- return "unknown";
+ if (transformationType == 0) {
+ return "NONE";
+ }
+ List<String> names = new LinkedList<>();
+ short transformationMask = 1;
+ while (transformationMask <= EC_Consts.TRANSFORMATION_04_MASK) {
+ short transformationValue = (short) (transformationMask & transformationType);
+ if (transformationValue != 0) {
+ switch (transformationValue) {
+ case EC_Consts.TRANSFORMATION_FIXED:
+ names.add("FIXED");
+ break;
+ case EC_Consts.TRANSFORMATION_ONE:
+ names.add("ONE");
+ break;
+ case EC_Consts.TRANSFORMATION_ZERO:
+ names.add("ZERO");
+ break;
+ case EC_Consts.TRANSFORMATION_ONEBYTERANDOM:
+ names.add("ONE_BYTE_RANDOM");
+ break;
+ case EC_Consts.TRANSFORMATION_FULLRANDOM:
+ names.add("FULL_RANDOM");
+ break;
+ case EC_Consts.TRANSFORMATION_INCREMENT:
+ names.add("INCREMENT");
+ break;
+ case EC_Consts.TRANSFORMATION_INFINITY:
+ names.add("INFINITY");
+ break;
+ case EC_Consts.TRANSFORMATION_COMPRESS:
+ names.add("COMPRESSED");
+ break;
+ case EC_Consts.TRANSFORMATION_COMPRESS_HYBRID:
+ names.add("HYBRID");
+ break;
+ case EC_Consts.TRANSFORMATION_04_MASK:
+ names.add("MASK(O4)");
+ break;
+ case EC_Consts.TRANSFORMATION_MAX:
+ names.add("MAX");
+ break;
+ }
+ }
+ transformationMask = (short) ((transformationMask) << 1);
+ }
+ if (names.size() != 0) {
+ return String.join(" + ", names);
+ } else {
+ return "unknown";
}
}
@@ -325,6 +402,8 @@ public class CardUtil {
what = "privkey";
} else if (params == EC_Consts.PARAMETERS_KEYPAIR) {
what = "keypair";
+ } else {
+ what = getParams(params);
}
return what;
}
diff --git a/src/cz/crcs/ectester/reader/command/Command.java b/src/cz/crcs/ectester/reader/command/Command.java
index 8af2218..b3af731 100644
--- a/src/cz/crcs/ectester/reader/command/Command.java
+++ b/src/cz/crcs/ectester/reader/command/Command.java
@@ -25,7 +25,7 @@ import java.util.List;
/**
* @author Jan Jancar johny@neuromancer.sk
*/
-public abstract class Command {
+public abstract class Command implements Cloneable {
CommandAPDU cmd;
CardMngr cardManager;
@@ -49,6 +49,11 @@ public abstract class Command {
public abstract String getDescription();
+ @Override
+ protected Command clone() throws CloneNotSupportedException {
+ return (Command) super.clone();
+ }
+
/**
* @param keyPair which keyPair/s (local/remote) to set curve domain parameters on
@@ -442,6 +447,7 @@ public abstract class Command {
@Override
public String getDescription() {
+ String stringParams = CardUtil.getParams(params);
String transform = CardUtil.getTransformation(transformation);
String pair;
@@ -450,7 +456,7 @@ public abstract class Command {
} else {
pair = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair";
}
- return String.format("Transform params of %s, %s", pair, transform);
+ return String.format("Transform params %s of %s, %s", stringParams, pair, transform);
}
}
diff --git a/src/cz/crcs/ectester/reader/test/CardWrongCurvesSuite.java b/src/cz/crcs/ectester/reader/test/CardWrongCurvesSuite.java
index 6768591..4bf38f2 100644
--- a/src/cz/crcs/ectester/reader/test/CardWrongCurvesSuite.java
+++ b/src/cz/crcs/ectester/reader/test/CardWrongCurvesSuite.java
@@ -107,8 +107,31 @@ public class CardWrongCurvesSuite extends CardTestSuite {
EC_Params compositeData = new EC_Params(EC_Consts.PARAMETER_FP, new byte[][]{compositeBytes});
Test composite = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, compositeData.getParams(), compositeData.flatten()), "Set p = product of two primes.", "ECDH with p = q * s.");
- Test wrong = CompoundTest.all(ExpectedValue.SUCCESS, "Tests with corrupted prime parameter.", prime0, prime1, primePower, composite);
- doTest(CompoundTest.all(ExpectedValue.SUCCESS, "Tests of " + keyLength + "b " + CardUtil.getKeyTypeString(KeyPair.ALG_EC_FP), setup, wrong));
+ Test wrongPrime = CompoundTest.all(ExpectedValue.SUCCESS, "Tests with corrupted prime parameter.", prime0, prime1, primePower, composite);
+
+ Test resetSetup = CompoundTest.all(ExpectedValue.SUCCESS, "Reset keypair.", set.clone());
+
+ Test zeroG = ecdhTest(new Command.Transform(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.KEY_BOTH, EC_Consts.PARAMETER_G, EC_Consts.TRANSFORMATION_INFINITY), "Set G = inifnity.", "ECDH with G = infinity.");
+ Test randomG = ecdhTest(new Command.Transform(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.KEY_BOTH, EC_Consts.PARAMETER_G, (short) (EC_Consts.TRANSFORMATION_FULLRANDOM | EC_Consts.TRANSFORMATION_04_MASK)), "Set G = random non-point/point-like.", "ECDH with non-point G.");
+ Test wrongG = CompoundTest.all(ExpectedValue.SUCCESS, "Tests with corrupted G parameter.", zeroG, randomG);
+
+ byte[] originalR = new byte[keyLength];
+ EC_Consts.getCurveParameter(curve, EC_Consts.PARAMETER_R, originalR, (short) 0);
+ BigInteger originalBigR = new BigInteger(1, originalR);
+ BigInteger nextPrimeR = originalBigR.nextProbablePrime();
+ byte[] nextRBytes = ECUtil.toByteArray(nextPrimeR, keyLength);
+ EC_Params nextRData = new EC_Params(EC_Consts.PARAMETER_R, new byte[][]{nextRBytes});
+ Test primeWrongR = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, nextRData.getParams(), nextRData.flatten()), "Set R = some prime (but [r]G != infinity).", "ECDH with wrong R, prime.");
+ byte[] nonprimeRBytes = nextRBytes.clone();
+ nonprimeRBytes[0] ^= 1;
+ EC_Params nonprimeWrongRData = new EC_Params(EC_Consts.PARAMETER_R, new byte[][]{nonprimeRBytes});
+ Test nonprimeWrongR = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, nonprimeWrongRData.getParams(), nonprimeWrongRData.flatten()), "Set R = some composite (but [r]G != infinity).", "ECDH with wrong R, composite.");
+
+ Test wrongR = CompoundTest.all(ExpectedValue.SUCCESS, "Tests with corrupted R parameter.", primeWrongR, nonprimeWrongR);
+
+
+
+ doTest(CompoundTest.all(ExpectedValue.SUCCESS, "Tests of " + keyLength + "b " + CardUtil.getKeyTypeString(KeyPair.ALG_EC_FP), setup, wrongPrime, resetSetup, wrongG, resetSetup.clone(), wrongR, resetSetup.clone()));
}
/*
diff --git a/src/cz/crcs/ectester/standalone/ECTesterStandalone.java b/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
index 92a3a27..c223af6 100644
--- a/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
+++ b/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
@@ -233,7 +233,6 @@ public class ECTesterStandalone {
System.out.println("\t\t- Curves: " + String.join(", ", curves));
}
System.out.println();
- System.out.println(lib.getProvider().entrySet());
}
}
}