summaryrefslogtreecommitdiff
path: root/src/cz/crcs/ectester/common/util/CardUtil.java
diff options
context:
space:
mode:
authorJ08nY2018-07-29 18:34:58 +0200
committerJ08nY2018-07-29 18:34:58 +0200
commitd24630d759bb16f715564ab80a5d4447f57d03f2 (patch)
treec30699e723a8ed31ea354be7e76eb16c1b681f04 /src/cz/crcs/ectester/common/util/CardUtil.java
parentcb6c6b8b1274fe5a340c4317a4b015ea0ef15396 (diff)
parent07d0c8947ef0d0f4c0ae01c1d8699d24a892752d (diff)
downloadECTester-d24630d759bb16f715564ab80a5d4447f57d03f2.tar.gz
ECTester-d24630d759bb16f715564ab80a5d4447f57d03f2.tar.zst
ECTester-d24630d759bb16f715564ab80a5d4447f57d03f2.zip
Diffstat (limited to 'src/cz/crcs/ectester/common/util/CardUtil.java')
-rw-r--r--src/cz/crcs/ectester/common/util/CardUtil.java378
1 files changed, 258 insertions, 120 deletions
diff --git a/src/cz/crcs/ectester/common/util/CardUtil.java b/src/cz/crcs/ectester/common/util/CardUtil.java
index 8285d8b..a628d5b 100644
--- a/src/cz/crcs/ectester/common/util/CardUtil.java
+++ b/src/cz/crcs/ectester/common/util/CardUtil.java
@@ -4,8 +4,10 @@ import cz.crcs.ectester.applet.ECTesterApplet;
import cz.crcs.ectester.applet.EC_Consts;
import javacard.framework.ISO7816;
import javacard.security.CryptoException;
+import javacard.security.KeyPair;
-import static cz.crcs.ectester.applet.ECTesterApplet.*;
+import java.util.LinkedList;
+import java.util.List;
/**
* @author Petr Svenda petr@svenda.com
@@ -15,13 +17,19 @@ public class CardUtil {
public static byte getKA(String name) {
switch (name) {
case "DH":
- case "ECDH":
- return ECTesterApplet.KeyAgreement_ALG_EC_SVDP_DH;
+ return EC_Consts.KeyAgreement_ALG_EC_SVDP_DH;
case "DHC":
- case "ECDHC":
- return ECTesterApplet.KeyAgreement_ALG_EC_SVDP_DHC;
+ return EC_Consts.KeyAgreement_ALG_EC_SVDP_DHC;
+ case "DH_PLAIN":
+ return EC_Consts.KeyAgreement_ALG_EC_SVDP_DH_PLAIN;
+ case "DHC_PLAIN":
+ return EC_Consts.KeyAgreement_ALG_EC_SVDP_DHC_PLAIN;
+ case "PACE_GM":
+ return EC_Consts.KeyAgreement_ALG_EC_PACE_GM;
+ case "DH_PLAIN_XY":
+ return EC_Consts.KeyAgreement_ALG_EC_SVDP_DH_PLAIN_XY;
default:
- return ECTesterApplet.KeyAgreement_ALG_EC_SVDP_DH;
+ return EC_Consts.KeyAgreement_ALG_EC_SVDP_DH;
}
}
@@ -70,75 +78,102 @@ public class CardUtil {
}
public static String getSW(short sw) {
- switch (sw) {
- case ISO7816.SW_APPLET_SELECT_FAILED:
- return "APPLET_SELECT_FAILED";
- case ISO7816.SW_BYTES_REMAINING_00:
- return "BYTES_REMAINING";
- case ISO7816.SW_CLA_NOT_SUPPORTED:
- return "CLA_NOT_SUPPORTED";
- case ISO7816.SW_COMMAND_NOT_ALLOWED:
- return "COMMAND_NOT_ALLOWED";
- case ISO7816.SW_CONDITIONS_NOT_SATISFIED:
- return "CONDITIONS_NOT_SATISFIED";
- case ISO7816.SW_CORRECT_LENGTH_00:
- return "CORRECT_LENGTH";
- case ISO7816.SW_DATA_INVALID:
- return "DATA_INVALID";
- case ISO7816.SW_FILE_FULL:
- return "FILE_FULL";
- case ISO7816.SW_FILE_INVALID:
- return "FILE_INVALID";
- case ISO7816.SW_FILE_NOT_FOUND:
- return "FILE_NOT_FOUND";
- case ISO7816.SW_FUNC_NOT_SUPPORTED:
- return "FUNC_NOT_SUPPORTED";
- case ISO7816.SW_INCORRECT_P1P2:
- return "INCORRECT_P1P2";
- case ISO7816.SW_INS_NOT_SUPPORTED:
- return "INS_NOT_SUPPORTED";
- case ISO7816.SW_LOGICAL_CHANNEL_NOT_SUPPORTED:
- return "LOGICAL_CHANNEL_NOT_SUPPORTED";
- case ISO7816.SW_RECORD_NOT_FOUND:
- return "RECORD_NOT_FOUND";
- case ISO7816.SW_SECURE_MESSAGING_NOT_SUPPORTED:
- return "SECURE_MESSAGING_NOT_SUPPORTED";
- case ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED:
- return "SECURITY_STATUS_NOT_SATISFIED";
- case ISO7816.SW_UNKNOWN:
- return "UNKNOWN";
- case ISO7816.SW_WARNING_STATE_UNCHANGED:
- return "WARNING_STATE_UNCHANGED";
- case ISO7816.SW_WRONG_DATA:
- return "WRONG_DATA";
- case ISO7816.SW_WRONG_LENGTH:
- return "WRONG_LENGTH";
- case ISO7816.SW_WRONG_P1P2:
- return "WRONG_P1P2";
- case CryptoException.ILLEGAL_VALUE:
- return "ILLEGAL_VALUE";
- case CryptoException.UNINITIALIZED_KEY:
- return "UNINITIALIZED_KEY";
- case CryptoException.NO_SUCH_ALGORITHM:
- return "NO_SUCH_ALG";
- case CryptoException.INVALID_INIT:
- return "INVALID_INIT";
- case CryptoException.ILLEGAL_USE:
- return "ILLEGAL_USE";
- case ECTesterApplet.SW_SIG_VERIFY_FAIL:
- return "SIG_VERIFY_FAIL";
- case ECTesterApplet.SW_DH_DHC_MISMATCH:
- return "DH_DHC_MISMATCH";
- case ECTesterApplet.SW_KEYPAIR_NULL:
- return "KEYPAIR_NULL";
- case ECTesterApplet.SW_KA_NULL:
- return "KA_NULL";
- case ECTesterApplet.SW_SIGNATURE_NULL:
- return "SIGNATURE_NULL";
- case ECTesterApplet.SW_OBJECT_NULL:
- return "OBJECT_NULL";
+ int upper = (sw & 0xff00) >> 8;
+ int lower = (sw & 0xff);
+ switch (upper) {
+ case 0xf1:
+ return String.format("CryptoException(%d)", lower);
+ case 0xf2:
+ return String.format("SystemException(%d)", lower);
+ case 0xf3:
+ return String.format("PINException(%d)", lower);
+ case 0xf4:
+ return String.format("TransactionException(%d)", lower);
+ case 0xf5:
+ return String.format("CardRuntimeException(%d)", lower);
default:
- return "unknown";
+ switch (sw) {
+ case ISO7816.SW_APPLET_SELECT_FAILED:
+ return "APPLET_SELECT_FAILED";
+ case ISO7816.SW_BYTES_REMAINING_00:
+ return "BYTES_REMAINING";
+ case ISO7816.SW_CLA_NOT_SUPPORTED:
+ return "CLA_NOT_SUPPORTED";
+ case ISO7816.SW_COMMAND_NOT_ALLOWED:
+ return "COMMAND_NOT_ALLOWED";
+ case ISO7816.SW_CONDITIONS_NOT_SATISFIED:
+ return "CONDITIONS_NOT_SATISFIED";
+ case ISO7816.SW_CORRECT_LENGTH_00:
+ return "CORRECT_LENGTH";
+ case ISO7816.SW_DATA_INVALID:
+ return "DATA_INVALID";
+ case ISO7816.SW_FILE_FULL:
+ return "FILE_FULL";
+ case ISO7816.SW_FILE_INVALID:
+ return "FILE_INVALID";
+ case ISO7816.SW_FILE_NOT_FOUND:
+ return "FILE_NOT_FOUND";
+ case ISO7816.SW_FUNC_NOT_SUPPORTED:
+ return "FUNC_NOT_SUPPORTED";
+ case ISO7816.SW_INCORRECT_P1P2:
+ return "INCORRECT_P1P2";
+ case ISO7816.SW_INS_NOT_SUPPORTED:
+ return "INS_NOT_SUPPORTED";
+ case ISO7816.SW_LOGICAL_CHANNEL_NOT_SUPPORTED:
+ return "LOGICAL_CHANNEL_NOT_SUPPORTED";
+ case ISO7816.SW_RECORD_NOT_FOUND:
+ return "RECORD_NOT_FOUND";
+ case ISO7816.SW_SECURE_MESSAGING_NOT_SUPPORTED:
+ return "SECURE_MESSAGING_NOT_SUPPORTED";
+ case ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED:
+ return "SECURITY_STATUS_NOT_SATISFIED";
+ case ISO7816.SW_UNKNOWN:
+ return "UNKNOWN";
+ case ISO7816.SW_WARNING_STATE_UNCHANGED:
+ return "WARNING_STATE_UNCHANGED";
+ case ISO7816.SW_WRONG_DATA:
+ return "WRONG_DATA";
+ case ISO7816.SW_WRONG_LENGTH:
+ return "WRONG_LENGTH";
+ case ISO7816.SW_WRONG_P1P2:
+ return "WRONG_P1P2";
+ case CryptoException.ILLEGAL_VALUE:
+ return "ILLEGAL_VALUE";
+ case CryptoException.UNINITIALIZED_KEY:
+ return "UNINITIALIZED_KEY";
+ case CryptoException.NO_SUCH_ALGORITHM:
+ return "NO_SUCH_ALG";
+ case CryptoException.INVALID_INIT:
+ return "INVALID_INIT";
+ case CryptoException.ILLEGAL_USE:
+ return "ILLEGAL_USE";
+ case ECTesterApplet.SW_SIG_VERIFY_FAIL:
+ return "SIG_VERIFY_FAIL";
+ case ECTesterApplet.SW_DH_DHC_MISMATCH:
+ return "DH_DHC_MISMATCH";
+ case ECTesterApplet.SW_KEYPAIR_NULL:
+ return "KEYPAIR_NULL";
+ case ECTesterApplet.SW_KA_NULL:
+ return "KA_NULL";
+ case ECTesterApplet.SW_SIGNATURE_NULL:
+ return "SIGNATURE_NULL";
+ case ECTesterApplet.SW_OBJECT_NULL:
+ return "OBJECT_NULL";
+ case ECTesterApplet.SW_Exception:
+ return "Exception";
+ case ECTesterApplet.SW_ArrayIndexOutOfBoundsException:
+ return "ArrayIndexOutOfBoundsException";
+ case ECTesterApplet.SW_ArithmeticException:
+ return "ArithmeticException";
+ case ECTesterApplet.SW_ArrayStoreException:
+ return "ArrayStoreException";
+ case ECTesterApplet.SW_NullPointerException:
+ return "NullPointerException";
+ case ECTesterApplet.SW_NegativeArraySizeException:
+ return "NegativeArraySizeException";
+ default:
+ return "unknown";
+ }
}
}
@@ -151,46 +186,122 @@ public class CardUtil {
}
}
- public static String getCorruption(short corruptionType) {
- switch (corruptionType) {
- case EC_Consts.CORRUPTION_NONE:
- return "NONE";
- case EC_Consts.CORRUPTION_FIXED:
- return "FIXED";
- case EC_Consts.CORRUPTION_ONE:
- return "ONE";
- case EC_Consts.CORRUPTION_ZERO:
- return "ZERO";
- case EC_Consts.CORRUPTION_ONEBYTERANDOM:
- return "ONE_BYTE_RANDOM";
- case EC_Consts.CORRUPTION_FULLRANDOM:
- return "FULL_RANDOM";
- case EC_Consts.CORRUPTION_INCREMENT:
- return "INCREMENT";
- case EC_Consts.CORRUPTION_INFINITY:
- return "INFINITY";
- case EC_Consts.CORRUPTION_COMPRESS:
- return "COMPRESSED";
- case EC_Consts.CORRUPTION_MAX:
- return "MAX";
- default:
- return "unknown";
+ 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) {
+ 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";
}
}
public static String getKATypeString(byte kaType) {
switch (kaType) {
- case KeyAgreement_ALG_EC_SVDP_DH:
+ case EC_Consts.KeyAgreement_ALG_EC_SVDP_DH:
return "ALG_EC_SVDP_DH";
- case KeyAgreement_ALG_EC_SVDP_DH_PLAIN:
+ case EC_Consts.KeyAgreement_ALG_EC_SVDP_DH_PLAIN:
return "ALG_EC_SVDP_DH_PLAIN";
- case KeyAgreement_ALG_EC_PACE_GM:
+ case EC_Consts.KeyAgreement_ALG_EC_PACE_GM:
return "ALG_EC_PACE_GM";
- case KeyAgreement_ALG_EC_SVDP_DH_PLAIN_XY:
+ case EC_Consts.KeyAgreement_ALG_EC_SVDP_DH_PLAIN_XY:
return "ALG_EC_SVDP_DH_PLAIN_XY";
- case KeyAgreement_ALG_EC_SVDP_DHC:
+ case EC_Consts.KeyAgreement_ALG_EC_SVDP_DHC:
return "ALG_EC_SVDP_DHC";
- case KeyAgreement_ALG_EC_SVDP_DHC_PLAIN:
+ case EC_Consts.KeyAgreement_ALG_EC_SVDP_DHC_PLAIN:
return "ALG_EC_SVDP_DHC_PLAIN";
default:
return "unknown";
@@ -200,17 +311,17 @@ public class CardUtil {
public static byte getKAType(String kaTypeString) {
switch (kaTypeString) {
case "ALG_EC_SVDP_DH":
- return KeyAgreement_ALG_EC_SVDP_DH;
+ return EC_Consts.KeyAgreement_ALG_EC_SVDP_DH;
case "ALG_EC_SVDP_DH_PLAIN":
- return KeyAgreement_ALG_EC_SVDP_DH_PLAIN;
+ return EC_Consts.KeyAgreement_ALG_EC_SVDP_DH_PLAIN;
case "ALG_EC_PACE_GM":
- return KeyAgreement_ALG_EC_PACE_GM;
+ return EC_Consts.KeyAgreement_ALG_EC_PACE_GM;
case "ALG_EC_SVDP_DH_PLAIN_XY":
- return KeyAgreement_ALG_EC_SVDP_DH_PLAIN_XY;
+ return EC_Consts.KeyAgreement_ALG_EC_SVDP_DH_PLAIN_XY;
case "ALG_EC_SVDP_DHC":
- return KeyAgreement_ALG_EC_SVDP_DHC;
+ return EC_Consts.KeyAgreement_ALG_EC_SVDP_DHC;
case "ALG_EC_SVDP_DHC_PLAIN":
- return KeyAgreement_ALG_EC_SVDP_DHC_PLAIN;
+ return EC_Consts.KeyAgreement_ALG_EC_SVDP_DHC_PLAIN;
default:
return 0;
}
@@ -228,15 +339,15 @@ public class CardUtil {
public static String getSigTypeString(byte sigType) {
switch (sigType) {
- case Signature_ALG_ECDSA_SHA:
+ case EC_Consts.Signature_ALG_ECDSA_SHA:
return "ALG_ECDSA_SHA";
- case Signature_ALG_ECDSA_SHA_224:
+ case EC_Consts.Signature_ALG_ECDSA_SHA_224:
return "ALG_ECDSA_SHA_224";
- case Signature_ALG_ECDSA_SHA_256:
+ case EC_Consts.Signature_ALG_ECDSA_SHA_256:
return "ALG_ECDSA_SHA_256";
- case Signature_ALG_ECDSA_SHA_384:
+ case EC_Consts.Signature_ALG_ECDSA_SHA_384:
return "ALG_ECDSA_SHA_384";
- case Signature_ALG_ECDSA_SHA_512:
+ case EC_Consts.Signature_ALG_ECDSA_SHA_512:
return "ALG_ECDSA_SHA_512";
default:
return "unknown";
@@ -246,15 +357,15 @@ public class CardUtil {
public static byte getSigType(String sigTypeString) {
switch (sigTypeString) {
case "ALG_ECDSA_SHA":
- return Signature_ALG_ECDSA_SHA;
+ return EC_Consts.Signature_ALG_ECDSA_SHA;
case "ALG_ECDSA_SHA_224":
- return Signature_ALG_ECDSA_SHA_224;
+ return EC_Consts.Signature_ALG_ECDSA_SHA_224;
case "ALG_ECDSA_SHA_256":
- return Signature_ALG_ECDSA_SHA_256;
+ return EC_Consts.Signature_ALG_ECDSA_SHA_256;
case "ALG_ECDSA_SHA_384":
- return Signature_ALG_ECDSA_SHA_384;
+ return EC_Consts.Signature_ALG_ECDSA_SHA_384;
case "ALG_ECDSA_SHA_512":
- return Signature_ALG_ECDSA_SHA_512;
+ return EC_Consts.Signature_ALG_ECDSA_SHA_512;
default:
return 0;
}
@@ -269,4 +380,31 @@ public class CardUtil {
}
return sigType;
}
+
+ public static String getKeyTypeString(byte keyClass) {
+ switch (keyClass) {
+ case KeyPair.ALG_EC_FP:
+ return "ALG_EC_FP";
+ case KeyPair.ALG_EC_F2M:
+ return "ALG_EC_F2M";
+ default:
+ return "";
+ }
+ }
+
+ public static String getParameterString(short params) {
+ String what = "";
+ if (params == EC_Consts.PARAMETERS_DOMAIN_F2M || params == EC_Consts.PARAMETERS_DOMAIN_FP) {
+ what = "curve";
+ } else if (params == EC_Consts.PARAMETER_W) {
+ what = "pubkey";
+ } else if (params == EC_Consts.PARAMETER_S) {
+ what = "privkey";
+ } else if (params == EC_Consts.PARAMETERS_KEYPAIR) {
+ what = "keypair";
+ } else {
+ what = getParams(params);
+ }
+ return what;
+ }
}