diff options
Diffstat (limited to 'src/simpleapdu/SimpleAPDU.java')
| -rw-r--r-- | src/simpleapdu/SimpleAPDU.java | 81 |
1 files changed, 77 insertions, 4 deletions
diff --git a/src/simpleapdu/SimpleAPDU.java b/src/simpleapdu/SimpleAPDU.java index 240a1cf..d1e6ff1 100644 --- a/src/simpleapdu/SimpleAPDU.java +++ b/src/simpleapdu/SimpleAPDU.java @@ -1,6 +1,9 @@ package simpleapdu; import applets.SimpleECCApplet; +import javacard.framework.ISO7816; +import javacard.security.CryptoException; +import javacard.security.KeyPair; import javax.smartcardio.ResponseAPDU; /** @@ -24,6 +27,12 @@ public class SimpleAPDU { private static byte GENERATEKEY[] = {(byte) 0xB0, (byte) 0x5A, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00}; private static byte RESPONDDATA[] = {(byte) 0xB0, (byte) 0x5B, (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x00, (byte) 0x30}; + private static byte TESTECSUPPORTALL[] = {(byte) 0xB0, (byte) 0x5E, (byte) 0x00, (byte) 0x00, (byte) 0x00}; + + static short getShort(byte[] array, int offset) { + return (short) (((array[offset] & 0xFF) << 8) | (array[offset + 1] & 0xFF)); + } + public static void main(String[] args) { try { // @@ -62,10 +71,8 @@ public class SimpleAPDU { // Select our application on card cardManager.sendAPDU(SELECT_SIMPLEAPPLET); - for (int i = 0; i < 10; i++) { - cardManager.sendAPDU(GENERATEKEY); - } - cardManager.sendAPDU(RESPONDDATA); + ResponseAPDU resp = cardManager.sendAPDU(TESTECSUPPORTALL); + PrintECSupport(resp); cardManager.DisconnectFromCard(); } else { @@ -75,4 +82,70 @@ public class SimpleAPDU { System.out.println("Exception : " + ex); } } + + static String getPrintError(short code) { + if (code == ISO7816.SW_NO_ERROR) { + return "OK\t(0x9000)"; + } + else { + String codeStr = "unknown"; + if (code == CryptoException.ILLEGAL_VALUE) { + codeStr = "ILLEGAL_VALUE"; + } + if (code == CryptoException.UNINITIALIZED_KEY) { + codeStr = "UNINITIALIZED_KEY"; + } + if (code == CryptoException.NO_SUCH_ALGORITHM) { + codeStr = "NO_SUCH_ALG"; + } + if (code == CryptoException.INVALID_INIT) { + codeStr = "INVALID_INIT"; + } + if (code == CryptoException.ILLEGAL_USE) { + codeStr = "ILLEGAL_USE"; + } + if (code == SimpleECCApplet.SW_SKIPPED) { + codeStr = "skipped"; + } + return String.format("fail\t(%s,\t0x%4x)", codeStr, code); + } + } + static int VerifyPrintResult(String message, byte expectedTag, byte[] buffer, int bufferOffset) { + assert (buffer[bufferOffset] == expectedTag); + bufferOffset++; + short resCode = getShort(buffer, bufferOffset); + bufferOffset += 2; + System.out.println(String.format("%-40s%s", message, getPrintError(resCode))); + return bufferOffset; + } + static void PrintECSupport(ResponseAPDU resp) { + byte[] buffer = resp.getData(); + + int bufferOffset = 0; + while (bufferOffset < buffer.length) { + assert(buffer[bufferOffset] == SimpleECCApplet.ECTEST_SEPARATOR); + bufferOffset++; + String ecType = "unknown"; + if (buffer[bufferOffset] == KeyPair.ALG_EC_FP) { + ecType = "ALG_EC_FP"; + } + if (buffer[bufferOffset] == KeyPair.ALG_EC_F2M) { + ecType = "ALG_EC_F2M"; + } + System.out.println(String.format("%-40s%s", "EC type:", ecType)); + bufferOffset++; + short keyLen = getShort(buffer, bufferOffset); + System.out.println(String.format("%-40s%d bits", "EC key length (bits):", keyLen)); + bufferOffset += 2; + + bufferOffset = VerifyPrintResult("KeyPair object allocation:", SimpleECCApplet.ECTEST_ALLOCATE_KEYPAIR, buffer, bufferOffset); + bufferOffset = VerifyPrintResult("Generate key with def curve:", SimpleECCApplet.ECTEST_GENERATE_KEYPAIR_DEFCURVE, buffer, bufferOffset); + bufferOffset = VerifyPrintResult("Set valid custom curve:", SimpleECCApplet.ECTEST_SET_VALIDCURVE, buffer, bufferOffset); + bufferOffset = VerifyPrintResult("Generate key with valid curve:", SimpleECCApplet.ECTEST_GENERATE_KEYPAIR_CUSTOMCURVE, buffer, bufferOffset); + bufferOffset = VerifyPrintResult("Set invalid custom curve:", SimpleECCApplet.ECTEST_SET_INVALIDCURVE, buffer, bufferOffset); + bufferOffset = VerifyPrintResult("Generate key with invalid curve:", SimpleECCApplet.ECTEST_GENERATE_KEYPAIR_INVALIDCUSTOMCURVE, buffer, bufferOffset); + + System.out.println(); + } + } } |
