头标由四个数据元组成,它们是类CLA(ClAss)字节,命令INS(INStructic,n)字节和两个参数Pl和P2 (Parameters 1 and 2)字节,如图1所示。类字节仍旧用于识别应用和它们专有的命令组。例如,GSM使用 类字节‘AO’,而代码‘8X’则最常用于公司专用(私用)命令。相反,基于ISO的命令都用类字节‘OX’ 编码。标准另外规定了类字节用于识别安全报文和逻辑通道。虽然如此,仍然和前面所述把类字类当做应用 识别符使用是相容的。类字节的编码参见表1和表2
CLA | INS | P1 | P2 | Lc—段 | 数据段 | Le—段 |
头标 | 主体 |
图1 命令APDU的结构
表1 按照ISO/IEC 7816-4的最重要的类别字节(CLA)的编码
b8-b5 | b4 | b3 | b2 | b1 | 意义 |
... | ... | ... | X | X | 逻辑通道编号 |
... | 0 | 0 | ... | ... | 没有安全报文 |
... | 0 | 1 | ... | ... | 安全报文未遵照LSO,使用自己的方法 |
... | 1 | 0 | ... | ... | 安全报文未遵照LSO,头标不是真实的 |
... | 1 | 1 | ... | ... | 安全报文未遵照LSO,头标是真实的 |
‘0’ | ... | ... | ... | ... | 结构和编码遵照ISO/IIEC 7816-4 |
‘8’,‘9’ | ... | ... | ... | ... | 命令和应答具有用户专用的编码和含义(私用), |
‘A’ | ... | ... | ... | ... | 规定附加文件 |
‘F’ | 1 | 1 | 1 | 1 | 为PIS保留 |
在命令APDU中的下一个字节是指令字节,它对实际的命令编码。这个字节的几乎全部的地址空间都可以使 用,而惟一的限制是只可以使用偶编码。这是因为T=0协议允许在回送的命令字节中用把先前的字节增量1来 激活可编程电压。因此,命令字节永远是偶数的。
表2 关于类字节的适用概况的补充说明
类 | 适用范围 |
0X | 用于遵照ISO/IEC 7816-4的标准命令 |
80 | 用于遵照EN 1546-3的电子钱包 |
8X | 用于应用和企业专用命令 |
8X | 用于遵照EMV-2的具有芯片的信用卡 |
A0 | 用于遵照prETS300 608/GSM11.11的GXM移动电话和遵照EN726-3的标准 |
两个参数字节主要用来提供更多的关于指令字节选择命令的信息。于是,它们主要用来作为命令不同选项 的选择开关。例如,把它们用来选择SELECT FLE的不同选项或是规定READ BINARY的区距。
接着头标的下一段是本体,除有了长度规定之外,它可以被略去,本体承担了双重角色。首先,它规定了 送给卡的数据部分的长度(在Lc字段),以及由卡回送的数据部分的长度(在Le字段)。其次,它含有发送 给卡的有关命令的数据。如果Le字段之值为‘00’,则终端期待着卡传送这条命令最大可用数量的数据,这 是关于长度的数值规定的惟一例外。
Le和L字段通常为1字节长。然而能够把它们转换为每个有3字节长的字段,这样可用来表示高达65 536的长 度,因为第1字节中含有扩展符序列‘∞’,参见图2。标准已经规定这个三字节长度的规格是为将来的应用 的,但由于目前可用存储器大小的限制这一点尚未能实现。
前面所述命令APDU的各部分可以组合成四种一般的个案如图3所示。
00 | Le/Lc(MSB) | Le/Lc(LSB) |
字节1 | 字节2 | 字节3 |
1.1 ISO智能卡通用APDU命令集(详细介绍:ISO 7816标准(中文版).pdf中75~100页)
编号 | 指令名称 | CLA | INS | 功能描述 |
1 | READ BINARY | 00/04 | B0 | 读出带有透明结构的EF内容的一部分 |
2 | WRITE BINARY | | D0 | 将二进制值写入EF |
3 | UPDATE BINARY | 00/04 | D6 | 启动使用在命令APDU中给出的位来更新早已呈现在EF中的位 |
4 | ERASE BINARY | | 0E | 顺序地从给出的偏移开始将EF的内容的一部分置为其逻辑擦除的状态 |
5 | READ RECORD | 00/04 | B2 | 给出了EF的规定记录的内容或EF的一个记录开始部分的内容 |
6 | WRITE RECORD | | D2 | WRITE RECORD命令报文启动下列操作之一: |
7 | APPEND RECORD | 00/04 | E2 | 启动在线性结构EF的结束端添加记录或者在循环结构的EF内写记录号1 |
8 | UPDATE RECORD | 00/04 | DC | 启动使用命令APDU给出的位来更新特定记录 |
9 | GET DATA | | CA | 可在当前上下文(例如应用特定环境或当前DF)范围内用于检索一个原始数据对象或者包含在结构化数据对象中所包含的一个或多个数据对象 |
10 | PUT DATA | | DA | 可在当前上下文(例如应用特定环境或当前DF)范围内用于存储一个原始数据对象或者包含在结构化数据对象中的一个或多个数据对象正确的 存储功能(写一次和/或更新和/或添加)通过数据对象的定义和性质来引出 |
11 | SELECT FILE | 00 | A4 | 设置当前文件后续命令可以通过那个逻辑信道隐式地引用该当前文件 |
12 | VERIFY | 00/04 | 20 | 启动从接口设备送入卡内的验证数据与卡内存储的引用数据(例如口令)进行比较 |
13 | INTERNAL AUTHENTICATE | 00 | 88 | 启动卡使用从接口设备发送来的询问数据和在卡内存储的相关秘密(例如密钥)来计算鉴别数据 |
14 | EXTERNAL AUTHENTICATE | 00 | 82 | 使用卡计算的结果(是或否)有条件地来更新安全状态而该卡的计算是以该卡先前发出(例如通过GETCHALLENGE命令)的询问在卡内存储的可能的秘密密钥以及接口设备发送的鉴别数据为基础的 |
15 | GET CHALLENGE | 00 | 84 | 要求发出一个询问(例如随机数)以便用于安全相关的规程(例EXTERNAL AUTHENTICATE 命令) |
16 | MANAGE CHANNEL | | 70 | 打开和关闭逻辑信道 |
17 | GET RESPONSE | 00 | C0 | 用于从卡发送至接口设备用可用的协议不能传送的那一些的APDU(或APDU的一部分) |
18 | ENVOLOPE | 80 | C2 | 用来发送那些不能由有效协议来发送的APDU 或APDU的一部分或任何数据串 |
表6 ISO智能卡APDU命令集
命令格式:
1.READ BINARY的命令报文:
CLA | 00/04 |
INS | B0 |
P1-P2 | 见表下面说明 |
Lc字段 | 空 |
数据字段 | 空 |
Le字段 | 待读的字节数 |
说明:
如果在P1中b8=1, 则P1的b7和b6置为0(RFU若干位) P1的b5至b1是短EF标识
符并且P2是在从文件开始的数据单元中被读的第1个字节的偏移。
如果在P1中b8=0, 则P1_P2是在从文件开始的数据单元中被读的第1个字节的
偏移。
如果Le字段仅包含若干“0” 则对于短的长度在不超过256的范围内或者对扩充长
度在不超过65536的范围内所有字节(直到文件结束为止)应被读出。
READ BINARY的响应报文:
数据字段 | 读的字节(Le字节) |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
2.WRITE BINARY命令报文:
CLA | 00/04 |
INS | D0 |
P1-P2 | 见表下面说明 |
Lc字段 | 后续数据字段的长度 |
数据字段 | 待写的数据单元串 |
Le字段 | 空 |
说明:
如果在P1中b8=1, 则P1的b7和b6显域 0(RFU若干位) P1的b5至b1是短EF标识
符并且P2是在从文件开始的数据单元中被写的第1个字节的偏移。
如果在P1中b8=0, 则P1_P2是在从文件开始的数据单元中被写的第1个字节的
偏移。
WRITE BINARY的响应报文:
数据字段 | 空 |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
3.UPDATA BINARY命令报文:
CLA | 00/04 |
INS | D6 |
P1-P2 | 见表下面说明 |
Lc字段 | 后续数据字段的长度 |
数据字段 | 待写的数据单元串 |
Le字段 | 空 |
说明:
如果在P1中b8=1, 则P1的b7和b6置为0(RFU若干位), P1的b5至b1是短EF标识
符,并且P2是在从文件开始的数据单元中被更新的第1个字节的偏移。
如果在P1中b8=0, 则P1_P2是在从文件开始的数据单元中被更新的第1个字节
的偏移。
UPDATE BINARY的响应报文:
数据字段 | 空 |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
4 .ERASE BINARY命令报文:
CLA | 00/04 |
INS | 0E |
P1-P2 | 见表下面说明 |
Lc字段 | 空或02 |
数据字段 | 见下表说明 |
Le字段 | 空 |
说明:
如果在P1中b8=1, 则P1的b7和b6显示0(RFU若干位), P1的b5至b1是短EF标识
符,并且P2是在从文件开始的数据单元中被写的第1个字节的偏移。
如果在P1中b8=0, 则P1_P2是在从文件开始的数据单元中被写的第1个字节的
偏移。
如果数据字段呈现,它编码不被擦除的第1个数据单元的偏移,该偏移
应大于在P1 —P2中编码的一个偏移,当数据字段为空时,该命令擦除到该文件的结
束端。
ERASE BINARY的响应报文:
数据字段 | 空 |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
5.READ RECORD命令报文:
CLA | 00/04 |
INS | B2 |
P1-P2 | P1: 记录号或被读的第1个记录的标识符(‘00’表示当前记录); P2: 引用控制 |
Lc字段 | 空 |
数据字段 | 空 |
Le字段 | 被读字节数 |
READ RECORD的响应报文:
数据字段 | Le字节 |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
6.WRITE RECORD命令报文:
CLA | 00/04 |
INS | D2 |
P1-P2 | P1=‘00’指明当前记录 P1:所指定的记录号 |
Lc字段 | 后续数据字段的长度 |
数据字段 | 待写的记录 |
Le字段 | 空 |
WRITE RECORD的响应报文:
数据字段 | 空 |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
7.APPEND RECORD命令报文:
CLA | 00/04 |
INS | E2 |
P1-P2 | 只有P1 ‘00’是有效的 |
Lc字段 | 后续数据字段的长度 |
数据字段 | 待添加的记录 |
Le字段 | 空 |
APPEND RECORD的响应报文:
数据字段 | 空 |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
8.UPDATE RECORD命令报文:
CLA | 00/04 |
INS | DC |
P1-P2 | P1=‘00’指明当前记录 P1:所指定的记录号 |
Lc字段 | 后续数据字段的长度 |
数据字段 | 待更新的记录 |
Le字段 | 空 |
UPDATE RECORD的响应报文:
数据字段 | 空 |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
9.GET DATA命令报文:
CLA | 00/04 |
INS | CA |
P1-P2 | 见表1-9 |
Lc字段 | 空 |
数据字段 | 空 |
Le字段 | 在响应时期望的字节数 |
值 | 含义 |
‘0000’至‘003F | RFU(保留供将来使用) |
‘0040’至‘00FF’ | P2中的BER-TLV标签(1个字节) |
‘0100’至‘01FF’ | 应用数据(专有编码) |
‘0200’至‘02FF’ | P2中的简单TLV标签 |
‘0300’至‘3FFF’ | RFU(保留供将来使用) |
‘0400’至‘FFFF’ | P1-P2中的BER-TLV标签(2个字节) |
表1-9参数P1-P2的编码
GET DATA的响应报文:
数据字段 | Le字节 |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
10.PUT DATA命令报文:
CLA | 00/04 |
INS | DA |
P1-P2 | 见表1-9 |
Lc字段 | 后续数据字段的长度 |
数据字段 | 待写的参数和数据 |
Le字段 | 空 |
PUT DATA的响应报文:
数据字段 | 空 |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
11.SELECT FILE命令报文:
CLA | 00/04 |
INS | A4 |
P1-P2 | P1:选择控制; P2:选择选项 |
Lc字段 | 空或后续数据字段的长度 |
数据字段 | 如果存在下列内容则按照P1-P2 ——文件标识符 ——MF的路径 ——当前DF的路径 ——DF名称 |
Le字段 | 空或在响应时期望的数据最大长度
|
SELECT FILE的响应报文:
数据字段 | 信息按照P2(至多Le个字节) |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
12.VERIFY命令报文:
CLA | 00/04 |
INS | 20 |
P1-P2 | P1:‘00’(其他值为RFU) P2:引用数据的限定符 |
Lc字段 | 空或后续数据字段的长度 |
数据字段 | 空或验证数据 |
Le字段 | 空 |
VERIFY的响应报文:
数据字段 | 空 |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
13.INTERNAL AUTHENTICATE命令报文:
CLA | 00/04 |
INS | 88 |
P1-P2 | P1: 在卡内引用的算法 P2: 引用的秘钥 |
Lc字段 | 后续数据字段的长度 |
数据字段 | 鉴别相关的数据(例如询问) |
Le字段 | 在响应中期望的字节最大数 |
INTERNAL AUTHENTICATE的响应报文:
数据字段 | 鉴别相关的数据(例如对询问的响应) |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
14. EXTERNAL AUTHENTICATE命令报文:
CLA | 00/04 |
INS | 82 |
P1-P2 | P1: 在卡内引用的算法 P2: 引用的秘钥 |
Lc字段 | 空或后续数据字段的长度 |
数据字段 | 空或鉴别相关的数据(例如对询问的响应) |
Le字段 | 空 |
说明:
P1=‘00’表示没有信息被给出,在发出命令之前引用的算法为已知,或在数据
字段中提供。
P2=‘00’表示没有信息被给出,在发出命令之前引用的秘密为已知,或在数据
字段中提供。
EXTERNAL AUTHENTICATE的响应报文:
数据字段 | 空 |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
15.GET CHALLENGE命令报文:
CLA | 00/04 |
INS | 84 |
P1-P2 | ‘0000’(其他值为RFU) |
Lc字段 | 空 |
数据字段 | 空 |
Le字段 | 在响应中期望的最大字节数 |
GET CHALLENGE的响应报文:
数据字段 | 询问数据 |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
16.MANAGE CHANNEL命令报文:
CLA | 00/04 |
INS | 70 |
P1-P2 | P1=‘00’打开逻辑信道 P1=‘80’关闭逻辑信道(其他值为RFU) P2:‘00’ ‘01’ ‘02’ ‘03’(其他值为RFU) |
Lc字段 | 空 |
数据字段 | 空 |
Le字段 | ‘01’ 如果P1-P2=‘0000’; 空,如果P1-P2不等于‘0000’ |
说明:
P1的位b8用来表示开放功能或关闭功能;如果b8为“0” ,则MANAGE CHANNEL应打
开逻辑信道,如果b8为“1”, 则MANAGE CHANNEL应关闭逻辑信道。
MANAGE CHANNEL的响应报文:
数据字段 | 逻辑信道号,如果P1-P2=‘0000’; 空,如果P1-P2不等于‘0000’ |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
17.GET RESPONSE命令报文:
CLA | 00/04 |
INS | C0 |
P1-P2 | ‘0000’(其他值为RFU) |
Lc字段 | 空 |
数据字段 | 空 |
Le字段 | 在响应中期望的数据最大长度 |
GET RESPONSE的响应报文:
数据字段 | 按照Le的APDU(的一部分) |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
18.ENVELOPE命令报文:
CLA | 80 |
INS | C2 |
P1-P2 | ‘0000’(其他值为RFU) |
Lc字段 | 后续数据字段的长度 |
数据字段 | APDU(的一部分) |
Le字段 | 空或期望数据的长度 |
说明:
当对于发送数据串而言根据T=0来使用ENVELOPE命令时,在ENVELOPE命令
ADPU中的空数据字段意味着“数据串的结束”.
ENVELOPE的响应报文:
数据字段 | 空或按照Le的APDU(的一部分) |
SW1-SW2 | 状态字节:用来说明指令执行是否出错,由于什么原因出错 |
==============================================================
1.命令APDU
(1)必备的4字节首标(CLA INS P1 P2);
(2)有条件的可变长度主体
—在命令APDU的数据字段中呈现的字节数用Lc 来表示
—在响应APDU的数据字段中期望的字节最大数用Le (期望数据的长度)来表示 当Le 字段只包含0时 则要求有效数据字节的最大数
(3)Lc字段和Le字段
既可为短的(一个字节 默认值) 也可为扩充的(显式语句)
(4)Le 用的解码约定
—如果Le 的值不为全空而按1个或2个字节进行编码 则LE 的值等于该字节的值它位于从1至255(或65 535)的范围内;所有这些位的空值意味着Le 的最大值
为256(或65536)
2.响应APDU
(1)有条件的可变长度主体
(2)必备的2字节尾标(SW1 SW2)
—如果该命令被放弃 则响应APDU是一个尾标 它按2个状态字节来编码差错条件
3.命令编程
(1)命令字分两类讨论:1.命令长度大于5
2.命令长度等于5
(2)相应命令分4类: 1.响应大于2字节;2.响应等于2字节;3.响应等于1字节;4.响应等于0字节
(3)当响应状态字(第一个)和命令INS相等,按(1)分类再次处理处理