应用程序协议数据单元(APDU)命令和响应的结构是什么?

use*_*312 -2 iso javacard

我正在努力学习Java Card.我刚开始并没有找到很多资源.我的第一个问题是如何理解APDU命令.(例如ISO/IEC 7816-4中定义的那些)

例如,如果我看到一个字节模式,例如10101010我如何理解它的含义,特别是确定CLAINS,例如?

Abr*_*ham 17

APDU命令是以下列形式的二进制数队列:

CLA | INS | P1 | P2 | Lc | CData | 乐

前四个部分,即CLA,INS,P1P2在所有APDU命令中是强制性的,并且每个部分具有一个字节长度.这些单字节长度的部分分别代表Class,Instruction,Parameter1和Parameter2.

最后三个部分,即Lc,CDataLe是可选的.Lc是Nc的编码,它是CDATA字段长度的编码.Le是Ne的编码,然后编码可以发送的最大响应数据.根据这些部分的存在与否,我们有4个APDU命令案例,如下所示:

  • 情况1: CLA | INS | P1 | P2
  • 案例2: CLA | INS | P1 | P2 | Le
  • 情形3: CLA | INS | P1 | P2 | Lc | Data
  • 情形4: CLA | INS | P1 | P2 | Lc | Data | Le

对于不同的命令和不同的applet,CData的长度是不同的.根据CData的长度(即Lc)和可能发送的最大响应数据的长度(即Le),我们必须输入APDU命令:

  • Lc Le小于时,正常/短APDU命令0xFF
  • Lc 和/或 Le大于时,扩展长度APDU命令0xFF.

因此,对于这些部分的长度,我们有:

Lc:短APDU命令为1个字节,3个字节(它们指定此长度,因为它足够)用于扩展APDU命令.

数据:长度不同.

Le:和Lc一样.


我如何理解APDU命令?

回答:

编写applet时,可以指定applet对将来会收到的不同APDU命令的响应.卡经理也是一个小程序.它支持的命令在卡的规格/数据表中定义.通常,几乎所有卡都是GlobalPlatformISO7816兼容的,因此它们必须支持这些文档中定义的那些强制性APDU命令.例如,在ISO7816-4标准中0xA4定义为SELECT FILE命令,如果您看到xx A4 xx xx正在向Card Manager发送的APDU ,则可以断定它与之相关SELECT FILE.

请注意,您可以为不同小程序中的不同功能选择一个值.例如,在下面,Applet1将0x6990在接收00 B0 xx xxAPDU命令时返回,而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);
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

输出:

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)
Run Code Online (Sandbox Code Playgroud)

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);
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

输出:

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)
Run Code Online (Sandbox Code Playgroud)

因此,对您的问题(我如何理解APDU命令?)的最终答案是:

  • 你正在处理你的applet?

    您自己定义了支持的命令及其表单!

  • 您正在处理另一个小程序(例如卡经理)?

    您需要该applet的源代码或其文档,其中包含其支持的命令及其表单或该applet符合的标准/规范(例如,Card Manager的全局平台).

注意:我们对APDU响应几乎相同.

  • 我认为指定的CLA和INS是二进制的,而不是十六进制的.Lc是Nc的编码,它是CDATA字段长度的编码.Le是Ne的编码,然后编码可以发送的*maximum*响应数据.这在Java Card规范中目前也是错误的:) (2认同)

voj*_*jta 7

我担心这种"完整"的电子书根本不存在.老实说,我认为根本没有必要.如果您了解基本的Java语法,您会发现JavaCard非常容易学习(尽管使用起来很烦人).Javacard中缺少所有常见的困难(线程,GUI,IO,注释,模板,数据库......),标准库非常有限,您可以在几天内学习它们.

有一些很好的教程:

http://www.oracle.com/technetwork/java/embedded/javacard/overview/index.html http://javacard.vetilles.com/tutorial/

和一个非常好的SO问题:

如何开始使用Java卡?

回答你的问题:JavaCard只是一种用于编写名为applets的智能卡应用程序的语言.它处理所有应用程序逻辑,但不指定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).