上一章链接:ISO7816协议深度解析-简单易懂协议详解(四)-- T= 1
13. APDU报文结构
13.1APDU命令
APDU结构如下所示:
• 在命令APDU的数据字段中呈现的字节数用Lc表示。
• 在响应APDU的数据字段中期望的字节最大数用Le(期望数据的长度)来表示,当Le字段只包含0时,则要求有效数据字节的最大数。
9.2命令主体用的解码约定
在命令响应对中,命令报文和响应报文都可以包含有数据,于是引起了四种APDU结构。
1)情况1: Lc、Le都为空,则主体为空;
2)情况2: Lc为空,Le不为空,从而主体由Le字段组成;
3)情况3:Lc不为空,Le为空,从而主体由Lc字段及其后的数据字段组成;
4)情况4: Lc、Le均不为空,则主体由Lc字段,其后的数据字段及Le字段组成。
• 在情况1时,命令APDU的主体为空,这种命令APDU未运载长度字段。
• 在情况2、3和4时,命令APDU的主体由B1至Bn所表示的N字节组成,如下表所示。这种主体运载了1或2长度字段;B1是第一个长度字段的一部分。
表1 不空的主体
命令主体 |
---|
B1,B2,···,Bn(N字节) |
在卡能力中,在命令APDU内,卡说明了Lc字段和Le字段即可为短的(一个字节,默认值),也可为扩充的(显式语句)。因此,情况2,3和4即可为短的(一个字节用于每个长度字段)也可为补充的(Bn的值为‘00’,并且每个长度值都按2个其他字节进行编码)。
Le用的解码约定:
如果Le的值不为全空而按1个或2个字节进行编码,则Le的值等于该字节的值,他位于从1至255(或65535)的范围内;所有这些位的空值意味着Le的最大值为256(或65536)。表5示出了按照图4和表1中定义的四种情况及可能的Lc,Le扩展的命令APDU的编码。
9.3 APDU响应
APDU由下列内容组成,如图6所示。
• 有条件的可变长度主体;
• 必备的2字节尾标(SW1 SW2).
在响应APDU的数据字段中呈现的字节数用Lr来表示。尾标编码了处理“命令响应对”之后的接收实体的状态。如果该命令被放弃,则响应APDU是一个尾标,它按2个状态字节来编码差错条件。
表6 命令APDU内容
代码 | 名称 | 长度 | 描述 |
---|---|---|---|
CLA | 类别 | 1 | 指令的类别 |
INS | 指令 | 1 | 指令代码 |
P1 | 参数1 | 1 | 指令参数1 |
P2 | 参数2 | 1 | 指令参数2 |
Lc字段 | 长度 | 变量1或3 | 在命令的数据字段中呈现的字节数 |
数据字段 | 数据 | 变量 = Lc | 在命令的数据字段中发送的字节串 |
Le字段 | 长度 | 变量 <= 3 | 在向命令响应的数据字段中期望的字节最大数 |
表7 响应APDU内容
代码 | 名称 | 长度 | 描述 |
---|---|---|---|
数据字段 | 数据 | 变量 = Lr | 在响应的数据字段中收到的字节串 |
SW1 | 状态字节1 | 1 | 命令处理状态 |
SW2 | 状态字节2 | 1 | 命令处理受限字符 |
后续条规定了类别字节、指令字节、参数字节、数据字段字节和状态字节用的编码约定。除非另有规定,在这些字节中,RFU的比特都编码为0,并且RFU字节也都编码为‘00’。
9.4 CAL类别字节
表8 CLA的编码及含义
序号 | 值 | 含义 |
---|---|---|
1 | ox0X | 按照本规范定义,命令和响应的结构和编码(对于编码’X’ 见表9) |
2 | 0x10 ~ 0x7F | RFU |
3 | 0x8X 0x9X | 按照本规范定义,命令和响应的结构。’X’除外(对于编码’X’ 见表9)命令和响应的编码及含义是专有的。 |
4 | 0xAX | 除非通过应用上下文另有规定,按照本规范定义命令和响应的编码及含义(对于编码’X’ 见表9) |
5 | 0xB0 ~ 0xCF | 按照本规范定义,命令和响应的结构。 |
6 | 0xDO ~ 0xFE | 命令和响应的结构。 |
7 | 0xFF | 保留供PTS用 |
表9 当CLA = ‘0X’ ‘8X’ ‘9X’ 或’AX’时,半字节’X’的编码及含义
序号 | b4 b3 b2 b1 | 含义 |
---|---|---|
1 | X X – – | 安全报文(SM)格式 |
2 | 0 X – – | 没有SM |
3 | 0 0 – – | 没有SM或没有SM指示 |
4 | 0 1 – – | 专有的SM格式 |
5 | 1 X – – | 安全报文交换 |
6 | 1 0 – -- | 不被鉴别的命令首标 |
7 | 1 1 – -- | 被鉴别的命令首标 |
8 | – – X X | 逻辑信道号(当不使用逻辑信道号或逻辑信道号#0被选择时,b2b1 = 00) |
9.5 INS指令字节
表11 INS代码
9.5.1 ‘DC’ :Update Binary
9.5.2 ‘CA’:Get Data
Get DATA 命令可在当前上下文(例如,应用特定环境或当前DF)范围内用于检索一个原始数据对象或者包含在结构化数据对象中所包含的一个或多个数据对象。
9.6 参数字节 P1 P2
命令中的参数字节P1,P2可以具有任何值。若参数字节不提供进一步限定,则其应置为’00’.
9.7 数据字段字节 Lc
9.8 响应的状态字节 SW1-SW2**
表12 SW1–SW2的编码
SW1–SW2 | 操作类型 | 含义 |
---|---|---|
0x9000 | 正常的处理 | 无进一步限定 |
0x61XX | 正常的处理 | SW2指示仍然有效的响应字节数(见下面文本) |
0x62XX | 报警处理 | 非易失存储器状态不变化(在SW2中进一步的限定,见表13) |
0x63XX | 报警处理 | 非易失存储器状态不变化(在SW2中进一步的限定,见表13) |
0x64XX | 执行差错 | 非易失存储器状态不变化(SW2 = 00,其他值都是RFU) |
0x65XX | 执行差错 | 非易失存储器状态变化(在SW2中进一步的限定,见表15) |
0x66XX | 执行差错 | 保留供安全相关的发布使用(本规范本部分补定义) |
0x6700 | 校验差错 | 错误长度 |
0x68XX | 校验差错 | CLA的功能不被支持(在SW2中进一步的限定,见表16) |
0x69XX | 校验差错 | 不允许的命令(在SW2中进一步的限定,见表17) |
0x6AXX | 校验差错 | 错误的参数P1~P2(在SW2中进一步的限定,见表18) |
0x6B00 | 校验差错 | 错误的参数P1~P2 |
0x6CXX | 校验差错 | 错误的长度Le:SW2指示的准确的长度(见下面的文本) |
0x6D00 | 校验差错 | 指令代码不被支持或无效 |
0x6E00 | 校验差错 | 类别不被支持 |
0x6F00 | 校验差错 | 没有精确的诊断 |
表12 当SW1 = 62,SW2编码
SW2 | 含义 |
---|---|
0x00 | 没有信息被给出 |
0x81 | 返回数据的一部分可能被损坏 |
0x82 | 读出Le字节之前,文件/记录已结束 |
0x83 | 选择的文件无效 |
0x84 | FCI未按照5.1.5格式化 |
表14 当SWI = 0X63时,SW2编码
SW2 | 含义 |
---|---|
0x00 | 没有信息被给出 |
0x81 | 通过最后写入来填满文件 |
0xCX | 通过’X‘值(0~15)提供的计数器(正确的含义依赖于命令) |
表15 当SWI = 0X65时,SW2编码
SW2 | 含义 |
---|---|
0x00 | 没有信息被给出 |
0x81 | 存储器故障 |
表16 当SWI = 0X68时,SW2编码
SW2 | 含义 |
---|---|
0x00 | 没有信息被给出 |
0x81 | 逻辑信道不被支持 |
0x82 | 安全报文不被支持 |
表17 当SWI = 0X69时,SW2编码
SW2 | 含义 |
---|---|
0x00 | 没有信息被给出 |
0x81 | 命令与文件结构补兼容 |
0x82 | 安全状态不被满足 |
0x83 | 认证方法被阻塞 |
0x84 | 引用的数据无效 |
0x85 | 使用的条件不被满足 |
0x86 | 命令不被允许(无当前EF) |
0x87 | 期望的SM数据对象失踪 |
0x88 | SM数据对象不正确 |
表18 当SWI = 0X6A时,SW2编码
SW2 | 含义 |
---|---|
0x00 | 没有信息被给出 |
0x80 | 在数据字段中的不正确参数 |
0x81 | 功能不被支持 |
0x82 | 文件未找到 |
0x83 | 记录未找到 |
0x84 | 无足够的文件存储空间 |
0x85 | Lc与TLV结构不一致 |
0x86 | 不正确的参数P1~P2 |
0x87 | L与P1~P2不一致 |
0x88 | 引用的数据未找到 |
13 T=0 通信示例
本实例使用金思特电子的Kingst LA5016 usb 逻辑分析仪检测iso7816数据通讯。
下图是一个T=1中的INF字段(APDU)的解析参数。
参考资料:ISO7816-1234.pdf
ISO7816协议解析完成!