【发布时间】:2015-06-29 11:01:03
【问题描述】:
我想向我的 JavaCard 小程序发送一个包含例如 24 个元素的随机字节数组,然后我的小程序应该使用特定方法更改该数组。例如该方法 XOR 每个元素与0x05 并在 APDU 响应中返回结果数组。
为了实现上述目标,到目前为止,我编写了以下程序:
package keyGeneratorPackage;
import javacard.framework.APDU;
import javacard.framework.ISO7816;
import javacard.framework.Applet;
import javacard.framework.ISOException;
import javacard.framework.JCSystem;
import javacard.framework.Util;
public class KeyGeneratorPackage extends Applet {
private static final byte HW_CLA = (byte) 0x80;
private static final byte HW_INS = (byte) 0x00;
public static void install(byte[] bArray, short bOffset, byte bLength) {
new keyGeneratorPackage.KeyGeneratorPackage().register(bArray, (short) (bOffset + 1),
bArray[bOffset]);
}
public void process(APDU apdu) {
if (selectingApplet()) {
return;
}
apdu.setIncomingAndReceive();
byte[] buffer = apdu.getBuffer();
byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA] & 0xFF);
byte INS = (byte) (buffer[ISO7816.OFFSET_INS] & 0xFF);
short lc = (short) (buffer[ISO7816.OFFSET_LC] & (short)0x00FF);
byte[] Data = JCSystem.makeTransientByteArray(lc, JCSystem.CLEAR_ON_DESELECT);
if (CLA != HW_CLA) {
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
}
switch (INS) {
case HW_INS: {
// copying the apdu data into byte array Data
Util.arrayCopy(buffer, ISO7816.OFFSET_CDATA, Data, (short) 0, lc);
getKey(apdu, Data);
}
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
private void getKey(APDU apdu, byte[] data) {
byte[] buffer = apdu.getBuffer();
short length = (short) data.length;
//prepareing the key array of same length of Data
byte[] key = JCSystem.makeTransientByteArray(length, JCSystem.CLEAR_ON_DESELECT);
generateKey(data, key);
Util.arrayCopyNonAtomic(key, (short) 0, buffer, (short) 0, (short) length);
apdu.setOutgoingAndSend((short) 0, length);
}
private byte[] generateKey(byte[] Data, byte[] key) {
short i;
for (i = 0; i < Data.length; i++) {
key[i] = (byte) (Data[i] ^ (byte)0x05);
}
return key;
}
}
编译并选择我的小程序后,我必须发送以下 APDU 命令:
>>> 80 00 00 00 18 11 22 33 44 55 66 77 88 99 10 20 30 40 50 60 70 80 90 b1 b2 b3 b4 b5 b6 b7 b8
我的小程序必须返回的预期数据是:
<<< 14 27 36 41 50 ... bd
我在安装这个小程序时遇到问题。
我无法将它安装到我的 Java 卡上,但我确信我的 applet 和我的卡之间的 Java Card 版本兼容性没有问题。无论如何,我的程序是用 Java Card Dev Kit 2.2.1 编译的。
值得注意的是,我创建了一个没有任何附加代码的默认 Java Card 项目,并且它成功安装在我的卡上。它也是由JavaCard Development kit 2.2.1版本编译的。
我使用 globalPlatformPro 安装了我的小程序,它在状态字中给了我0x6700 错误。
更新 1:
我输入了带有 -v -d 参数的安装命令。输出是:
E:\javacard\GlobalPlatformPro>gp -install E:\newPack.cap -v -d
# Detected readers from SunPCSC
[ ] Duali DE-ABCM Contactless Reader 0
[ ] Duali DE-ABCM Sam1 Reader 0
[*] Duali DE-ABCM Sam2 Reader 0
[ ] JAVACOS Virtual Contact Reader 0
[ ] JAVACOS Virtual Contactless Reader 1
SCardConnect("Duali DE-ABCM Sam2 Reader 0", T=*) -> T=0, 3B6B000080653140DC48428
3009000
SCardBeginTransaction("Duali DE-ABCM Sam2 Reader 0")
Reader: Duali DE-ABCM Sam2 Reader 0
ATR: 3B6B000080653140DC484283009000
More information about your card:
http://smartcard-atr.appspot.com/parse?ATR=3B6B000080653140DC484283009000
A>> T=0 (4+0000) 00A40400 00
A<< (0027+2) (73ms) 6F198408A000000003000000A50D9F6E064842928832319F6501FF 9000
Auto-detected ISD AID: A000000003000000
# ...
# Authentication Process Censored.
# ...
CAP file (v2.1) generated on Mon Jun 29 10:11:23 IRDT 2015
By Sun Microsystems Inc. converter 1.3 with JDK 1.7.0_09 (Oracle Corporation)
Package: newPack v1.2 with AID 1020304050
Applet: newApplet with AID 10203040500000
Import: A0000000620101 v1.2
A>> T=0 (4+0010) 84F28000 0A 4F0031993E2681C862DD 00
A<< (0011+2) (599ms) 08A000000003000000019E 9000
A>> T=0 (4+0010) 84F24000 0A 4F00EFCEFA0D825EAC3B 00
A<< (0011+2) (91ms) 08AABBCCDDEEFF00000700 9000
A>> T=0 (4+0010) 84F22000 0A 4F0050316231A15388BE 00
A<< (0143+2) (277ms) 08D156000027100106010008D156000027100101010006A000000151000
10007A0000000030000010008D156000027100102010007A0000000620201010007A000000062010
2010008A000000062010101010007A0000000620101010007A0000000620002010007A0000000620
003010007A0000000620001010008D156000027100108010006AABBCCDDEEFF0100 9000
A>> T=0 (4+0010) 84F21000 0A 4F00358E1689D8208F09 00
A<< (0176+2) (331ms) 08D15600002710010601000008D15600002710010101000006A00000015
10001000007A000000003000001000008D15600002710010201000007A000000062020101000007A
000000062010201000008A00000006201010101000007A000000062010101000007A000000062000
201000007A000000062000301000007A000000062000101000008D15600002710010801000109D15
60000271001080106AABBCCDDEEFF01000108AABBCCDDEEFF0000 9000
A>> T=0 (4+0026) 84E60200 1A 05102030405008A0000000030000000000005DC20F51A0D4CA2
9
A<< (0001+2) (474ms) 9000
A>> T=0 (4+0255) 84E80000 FF C482018E01000FDECAFFED010204020105102030405002001F0
00F001F000B000B003A000C00CA000A00150000008700000000000001010004000B01020107A0000
00062010103000B010710203040500000000806000C00800300FF0007010000001C0700CA0001101
88C00007A05308F00013D8C0002181D0441181D258B00037A0525188B000460037A198B00053B198
B00062D1A03251100FF535B321A04251100FF535B29041A07251100FF5329051605058D000728061
F10806A08116E008D0008160473001D0000000000091A0815060316058D00093B181915068C000A7
008116D008D00087A0533198B00062E1A9229041604AA59A4DD02FCF125
A<< (0000+2) (792ms) 6700
pro.javacard.gp.GPException: LOAD failed SW: 6700
at pro.javacard.gp.GlobalPlatform.check(GlobalPlatform.java:1092)
at pro.javacard.gp.GlobalPlatform.loadCapFile(GlobalPlatform.java:728)
at pro.javacard.gp.GlobalPlatform.loadCapFile(GlobalPlatform.java:686)
at pro.javacard.gp.GPTool.main(GPTool.java:453)
我的小程序有问题吗?有什么问题?
【问题讨论】:
-
当您在安装命令中使用
-d -v参数时,请添加安装过程的输出。即gp.exe -install E:\keyGeneratorPackage.cap -v -d的输出@ -
您是否尝试过使用相同的工具、读卡器和卡加载另一个 .cap 文件?一些读卡器和卡不喜欢数据部分长度为 255 的 APDU。如果可能,您可以为小程序安装设置较小的块大小。
-
我通过 gpj 成功安装了我的小程序。但是当我通过 Opensc 工具发送发送数据的命令并接收更改的数据时,它返回无效数据,这意味着命令不正确。有什么问题?我将使用我在 gpj 平台中收到的输出更新我的问题。
-
等等!您是否使用 GPJ(不是 GlobalPlatformPro)成功安装了上述小程序?
-
1 - 为什么你使用
new keyGeneratorPackage.KeyGeneratorPackage()只需使用new KeyGeneratorPackage()2 - 一些基于传输协议的Javacard在注册小程序方面有所不同,尝试注册不带参数的小程序并告诉我们结果使用@install方法中的987654331@,然后创建一个构造函数并在其中使用register(),不要忘记不要在register方法中发送任何参数