APDU应用协议数据单元
0.PDU(ProtocolDataUnit)
协议数据单元。对等层次直接传递的数据单位。物理层的PDU是数据位(bit),数据链路层的PDU是数据帧(frame),网络层的PDU是数据包(packet),传输层的PDU是数据段(segment),其他更高层次的PDU是数据(data)。在分层网络模型,例如OSI参考模型中,传系统的每层都将建立PDU。PDU包含来自上层的信息,以及当前层的实体附加信息。然后该PDU被传送到下一较低的层。
1.APDU(ApplicationProtocolDataUnit)
应用协议数据单元。是智能卡与智能卡读卡器之间传送的信息单元,像智能卡发送的指令。(IOS/IEC 7816-4规范定义)
1.1 APDU
- 命令APDU (由读卡器像卡片发出),包含4字节的头(CLA, INS, P1, P2)和0-255字节的数据。
- 响应APDU (由卡片像读卡器发送),包含必须的2字节状态字和0-256字节数据。
- 格式:
命令APDU(Command APDU)
字段名 | 长度(Byte) | 说明 |
---|---|---|
CLA | 1 | 【指令类型】–指示命令的类型,例如行业间命令或专有命令 |
INS | 1 | 【指令代码】–指示特定的命令,例如 ”写数据”命令 |
P1-P2 | 2 | 【指令参数】–该命令APDU的指令参数,如指明文件偏移地址以在偏移地址写入数据 |
Lc | 0,1或3 | 【Data长度】–指明命令APDU中携带的数据(Command data)字节数(Nc) |
Command data | Nc | 【数据】–Nc字节的数据 |
Le | 0, 1, 2或3 | 【希望响应数据最大字节数】–指明预期响应数据的最大字节数(Ne) |
- 必选部分:CLA, INS, P1, P2 CLA确定APDU类别,INS确定具体执行的命令,P1 P2为参数
- 可选部分:Lc Data Le
响应APDU(Response APDU)
字段名 | 长度(Byte) | 说明 |
---|---|---|
Response data | Nr(最大为Ne) | 响应数据 |
SW1-SW2(响应后缀) | 2 | 命令处理状态,例如 0x 9000表示成功 |
1.2 命令APDU的四种组成格式
由“命令头"(CLA INS P1 P2)和"命令体"(Lc Data Le)组成。可分为四种情况:
- case1 : CLA INS P1 P2
命令中没有数据送到卡(Lc)中,也没有数据从卡中返回(Le)。
不含安全报文的命令:CLA | INS | P1 | P2
含安全报文的命令 :CLA | INS | P1 | P2 | Lc | MAC (Lc=MAC的长度,4字节) - case2 : CLA INS P1 P2 Le
命令中没有数据送到卡( Lc)中,有数据从卡中返回( Le)。
不含安全报文的命令: CLA | INS | P1 | P2 | Le
含安全报文的命令: CLA | INS | P1 | P2 | Lc | MAC | Le - case3 : CLA INS P1 P2 Lc Data
命令中有数据送到卡( Lc)中,没有数据从卡中返回( Le)。
不含安全报文的命令: CLA | INS | P1 | P2 | Lc | Data
含安全报文的命令: CLA | INS | P1 | P2 | Lc | Data+MAC (Lc=Data长度+MAC长度) - case4 : CLA INS P1 P2 Lc Data Le
命令中既有数据送到卡( Lc)中,也有数据从卡中返回( Le)。
不含安全报文的命令: CLA | INS | P1 | P2 | Lc | Data | Le
含安全报文的命令: CLA | INS | P1 | P2 | Lc | Data+MAC | Le
1.3通用APDU指令集
指令名称 | CLA | INS | 含义 |
---|---|---|---|
READ BINARY | 00/04 | B0 | 读出带有透明结构的EF内容的一部分 |
WRITE BINARY | D0 | 将二进制值写入 EF | |
UPDATE BINARY | 00/04 | D6 | 启动使用在命令 APDU 中给出的位来更新早已呈现在EF中的位 |
ERASE BINARY | 0E | 顺序地从给出的偏移开始,将 EF 的内容的一部分置为其逻辑擦除的状态 | |
READ RECORD | 00/04 | B2 | 给出了EF的规定记录的内容或EF的一个记录开始部分的内容 |
WRITE RECORD | D2 | WRITE RECORD命令报文启动下列操作之一:a. 写一次记录;b. 对早已呈现在卡内的记录数据字节与在命令 APDU 中给出的记录数据字节进行逻辑“或”运算;c. 对早已呈现在卡内的记录数据字节与在命令 APDU 中给出的记录数据字节进行逻辑“和”运算 | |
APPEND RECORD | 00/04 | E2 | 启动在线性结构 EF 的结束端添加记录,或者在循环结构的 EF 内写记录号 1 |
UPDATE RECORD | 00/04 | DC | 启动使用命令 APDU 给出的位来更新特定记录 |
GET DATA | CA | 可在当前上下文(例如应用特定环境或当前 DF )范围内用于检索一个原始数据对象,或者包含在结构化数据对象中所包含的一个或多个数据对象 | |
PUT DATA | DA | 可在当前上下文(例如应用特定环境或当前 DF )范围内用于存储一个原始数据对象,或者包含在结构化数据对象中的一个或多个数据对象正确的存储功能(写一次和/或更新和/或添加)通过数据对象的定义和性质来引出 | |
SELECT FILE | 00 | A4 | 设置当前文件后续命令可以通过那个逻辑信道隐式地引用该当前文件 |
VERIFY | 00/04 | 20 | 启动从接口设备送入卡内的验证数据与卡内存储的引用数据(例如口令)进行比较 |
INTERNAL AUTHENTICATE | 00 | 88 | 启动卡使用从接口设备发送来的询问数据和在卡内存储的相关秘密(例如密钥)来计算鉴别数据,当该相关秘密被连接到 MF 时,命令可以用来鉴别整个卡当该相关秘密被连接到另一个 DF 时命令可以用来鉴别那个 DF。 |
EXTERNAL AUTHENTICATE | 00 | 82 | 使用卡计算的结果(是或否)有条件地来更新安全状态而该卡的计算是以该卡先前发出(例如通过 GETCHALLENGE 命令)的询问在卡内存储的可能的秘密密钥以及接口设备发送的鉴别数据为基础的 |
GET CHALLENGE | 00 | 84 | 要求发出一个询问(例如随机数)以便用于安全相关的规程(例EXTERNAL AUTHENTICATE 命令) |
MANAGE CHANNEL | 70 | 打开和关闭逻辑信道 | |
GET RESPONSE | 00 | C0 | 用于从卡发送至接口设备用可用的协议不能传送的那一些的 APDU (或APDU的一部分) |
ENVOLOPE | 80 | C2 | 用来发送那些不能由有效协议来发送的 APDU 或 APDU 的一部分或任何数据串 |
1.4响应APDU格式
由响应数据(Data)和状态字(SW1 SW2 --卡片执行命令的返回值)组成。
常用的SW1-SW2值:
SW1 SW2 | 含义 |
---|---|
9000 | 执行成功 |
6100 | 数据被截断 |
6200 | 警告,信息未提供 |
6281 | 警告,回送数据可能出错 |
6282 | 警告,文件长度小于Le |
6283 | 应用无效 |
6284 | FCI格式与P2指定的不符 |
6300 | 认证失败 |
63Cx | 校验失败(x-允许重试次数) |
6400 | 原因不明 |
6581 | 内存失败 |
6700 | 长度不对 |
6900 | 不能处理 |
6901 | 命令不接受(无效状态) |
6981 | 命令与文件结构不相容,当前文件非所需文件 |
6982 | 要PIN验证 |
6983 | 文件无效,PIN被锁定 |
6984 | 数据无效,随机数无效,引用的数据无效 |
6985 | 条件不满足 |
6986 | 不允许该命令 |
6982 | 安全条件不满足 |
6987 | 安全消息丢失 |
6988 | 安全消息不正确 |
6999 | 应用选择失败 |
6A80 | 数据错误 |
6A81 | 功能不支持 |
6A82 | 文件找不到 |
6A83 | 记录找不到 |
6A84 | 没有足够的空间 |
6A86 | 不正确的参数(P1,P2) |
6A88 | 引用数据没找到 |
6B00 | 错误的参数 (P1,P2) |
6C00 | 长度错误 (Le) |
6D00 | INS不支持 |
6E00 | CLA 不支持 |
6F00 | 未知错误 |
9301 | 资金不足 |
9302 | MAC无效 |
9303 | 应用被永久锁定 |
9401 | 交易金额不足 |
9402 | 交易计数器达到最大值 |
9403 | 密钥索引不支持 |
9406 | 所需MAC不可用 |
SW1 SW2状态码:
正常处理 | 警告错误 | 执行错误 | 检测错误 |
---|---|---|---|
61XX或者9000 | 62XX或者63XX | 64XX或者65XX | 67XX直到6FXX |