我正在尝试学习 Java Card 。我刚开始并没有找到很多资源。我的第一个问题是如何理解APDU命令。 (例如ISO / IEC 7816-4中定义的那些)
例如,如果我看到一个字节模式,例如 10101010
,我该如何理解其含义,特别是确定 CLA
例如,强>或 INS
?
答案 0 :(得分:14)
APDU命令是以下列形式的二进制数队列:
CLA | INS | P1 | P2 | Lc | CData |勒
前四个部分,即 CLA , INS , P1 和 P2 在所有APDU命令中都是必需的并且每个都有一个字节长度。这些单字节长度的部分分别代表Class,Instruction,Parameter1和Parameter2。
最后三个部分,即 Lc , CData 和 Le 是可选的.Lc是Nc的编码,它是编码CDATA字段的长度。 Le是Ne的编码,然后编码可以发送的最大响应数据。根据这些部分的存在与否,我们有4个APDU命令案例,如下所示:
CLA | INS | P1 | P2
CLA | INS | P1 | P2 | Le
CLA | INS | P1 | P2 | Lc | Data
CLA | INS | P1 | P2 | Lc | Data | Le
对于不同的命令和不同的applet,CData的长度是不同的。根据CData的长度(即Lc)和可能发送的最大响应数据的长度(即Le),我们必须输入APDU命令:
0xFF
< / LI>
0xFF
时因此,对于这些部分的长度,我们有:
Lc :短APDU命令为1个字节,3个字节(它们指定此长度,因为它足够)用于扩展APDU命令。
数据:长度不同。
Le :与 Lc 相同。
我如何理解APDU命令?
答案:
编写applet时,可以指定applet对将来会收到的不同APDU命令的响应。卡经理也是一个小程序。它支持的命令在卡的规格/数据表中定义。通常,几乎所有卡都符合GlobalPlatform和ISO7816,因此它们必须支持这些文档中定义的强制APDU命令。例如,由于0xA4
在ISO7816-4标准中被定义为 SELECT FILE 命令,如果您看到像xx A4 xx xx
这样的APDU正在向Card Manager发送,您可以得出结论与SELECT FILE
。
请注意,您可以为不同小程序中的不同功能选择一个值。例如,在下面的例子中,Applet1将在0x6990
APDU命令的接收中返回00 B0 xx xx
,而Applet2将在接收到相同命令时返回0x6991
:
Applet1:
public class SOQ extends Applet {
private SOQ() {
}
public static void install(byte bArray[], short bOffset, byte bLength)
throws ISOException {
new SOQ().register();
}
public void process(APDU arg0) throws ISOException {
byte buffer[] = arg0.getBuffer();
if(buffer[ISO7816.OFFSET_CLA] == (byte) 0x00 &&buffer[ISO7816.OFFSET_INS] == (byte) 0xB0){
ISOException.throwIt((short)0x6990);
}
}
}
输出:
OpenSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00B00000 -s 00B00
100
Using reader with a card: ACS CCID USB Reader 0
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00
Received (SW1=0x90, SW2=0x90)
Sending: 00 B0 00 00
Received (SW1=0x69, SW2=0x90)
Sending: 00 B0 01 00
Received (SW1=0x69, SW2=0x90)
Applet2:
public class SOQ extends Applet {
private SOQ() {
}
public static void install(byte bArray[], short bOffset, byte bLength)
throws ISOException {
new SOQ().register();
}
public void process(APDU arg0) throws ISOException {
byte buffer[] = arg0.getBuffer();
if(buffer[ISO7816.OFFSET_CLA] == (byte) 0x00 && buffer[ISO7816.OFFSET_INS] == (byte) 0xB0){
ISOException.throwIt((short)0x6991);
}
}
}
输出:
OpenSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00B00000 -s 00B00
100
Using reader with a card: ACS CCID USB Reader 0
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00
Received (SW1=0x90, SW2=0x00)
Sending: 00 B0 00 00
Received (SW1=0x69, SW2=0x91)
Sending: 00 B0 01 00
Received (SW1=0x69, SW2=0x91)
所以对你的问题(我如何理解APDU命令?)的最终答案是:
您正在处理您的小程序?
您自己定义了支持的命令及其表单!
您正在处理其他小程序(例如,卡片管理员)?
您需要该applet的源代码或其文档,其中包含其支持的命令及其表单或该applet符合的标准/规范(例如,Card Manager的全球平台)。
注意:APDU响应几乎相同。
答案 1 :(得分:7)
恐怕这种“完整”的电子书根本就不存在。老实说,我认为根本没有必要。如果您了解基本的Java语法,您会发现JavaCard非常容易学习(尽管使用起来很烦人)。 Javacard中缺少所有常见的困难(线程,GUI,IO,注释,模板,数据库等),标准库非常有限,您可以在几天内学习它们。
有一些很好的教程:
http://www.oracle.com/technetwork/java/embedded/javacard/overview/index.html http://javacard.vetilles.com/tutorial/
和一个非常好的SO问题:
How to get started with Java Cards?
回答你的问题:JavaCard只是一种用于编写名为applet的智能卡应用程序的语言。它处理所有应用程序逻辑,但不指定APDU格式。那是因为JavaCard并不是唯一的智能卡技术。 APDU格式在ISO7816标准中指定,我建议您仔细阅读。它无法免费下载,但您可以在此处找到最重要的部分:
http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816-4_5_basic_organizations.aspx
你会发现,你的APDU命令包含一个标题:
00A404000E
和数据部分:
63616C63756C61746F722E617070
。
标题指定应调用的函数:
00
- 类字节(CLA,00表示“发送到逻辑通道0的行业间命令”)
A4
- 指令字节(INS,A4表示“SELECT applet命令”)
04
- 参数1(P1)
00
- 参数2(P2)
0E
- 数据部分的长度(Lc)
并且数据部分包含应该选择以供将来使用的applet的标识符(在您的情况下,它是ASCII编码的字符串“calculator.app”btw)。