智能卡 APTU命令
一条命令APDU含有一个头标和一个本体。本体可有不同长度,或者在相关数据字段为空时,整个可以不存 在。
头标由四个数据元组成,它们是类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.APDU命令集
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)分类再次处理处理
智能卡 APTU命令的更多相关文章
- 智能卡 ATR解析
如果终端不支持IC卡支持的其它传输协议以及传输参数值,IC卡应该有能力用基本ATR定义的模式和终端进行交互. 终端如果无法满足IC卡回送ATR中定义的传输模式,将发送一个热复位信号,或将IC卡置为静止 ...
- windows7命令帮助大全
有关某个命令的详细信息,请键入 HELP 命令名ASSOC 显示或修改文件扩展名关联.ATTRIB 显示或更改文件属性.BREAK 设置或清除扩展式 CTRL+C 检查.BCDEDIT 设置启动数据库 ...
- Smartcard CA智能卡之调试
Integrated Circuit Card 集成电路卡,也叫CA卡或智能卡,将一个微电子芯片嵌入符合ISO 7816标准的卡基内,做成卡片形式,也是一个嵌入式小系统.由CPU,ROM,RAM及E ...
- 智能卡安全机制比较系列(三) MPCOS
MPCOS是金普斯早期推出的一款多应用支付芯片卡操作系统,支持ISO7816以及PCOS的数据格式和命令.MPCOS具有两级目录文件结构,即MF下可以有一级DF,每个DF下最多可创建63个EF. MP ...
- 智能卡安全机制比较系列(一)CardOS
自从智能卡开始进入人们的日常生活之后,大家对于智能卡的安全性普遍看好,但是不同公司的智能卡在安全机制的实现方面也存在很多的差异.对于智能卡应用开发和智能卡COS设计人员来说,如果能够更多地了解不同公司 ...
- windbg命令详解
DLL 该扩展仅在内核模式下使用,即使它是在Ext.dll中的. Windows NT 4.0 Ext.dll Windows 2000 Ext.dll Windows XP和之后 Ext.dll ...
- linux常用命令:yum 命令
用于添加/删除/更新RPM包,自动解决包的依赖问题以及系统更新升级. 1.命令格式: yum [参数] [软件名]2.命令功能: 功能: yum提供了查找.安装.删除某一个.一组甚至全 ...
- 智能卡操作系统COS概述
随着IC卡从简单的同步卡发展到异步卡,从简单的EPROM卡发展到内带微处理器的智能卡(又称CPU卡),对IC卡的各种要求越来越高.而卡本身所需要的各种管理工作也越来越复杂,因此就迫切地需要有一种工具来 ...
- java发展历程、常用dos命令与jDK工具使用
Java菜鸟学习之旅 1.勤敲代码 2.必须将课堂上讲的内容学到位 2.1 学到会用 2.2 在学会之前不要自作主张 2.3 当天课程当天完成 3.能说会道 3.1 善于表达 3.2 学会的都能讲 4 ...
随机推荐
- BZOJ3396: [Usaco2009 Jan]Total flow 水流
3396: [Usaco2009 Jan]Total flow 水流 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 45 Solved: 27[Sub ...
- Android ViewPager实现软件的第一次加载的滑动效果
public class MainActivity extends Activity { private ViewPager viewPager; private List<View> V ...
- HDU_2029——回文串的判断
Problem Description “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串.请写一个程序判断读入的字符串是否是“回文”. Input 输入包 ...
- 【2013南京区域赛】部分题解 hdu4802—4812
上周末打了一场训练赛,题目是13年南京区域赛的 这场题目有好几个本来应该是我擅长的,但是可能是太久没做比赛了各种小错误代码写的也丑各种warusn trush搞得人很不爽 全场题之一的1002也没有想 ...
- Spring中Ioc容器的注入方式
1 通过setter方法注入 bean类: package com.test; public class UserServiceImplement implements IUserService { ...
- <有序数组>转化为<按二分法遍历顺序排列的数组>(C++实现)
在进行参数试错时,通常将可能的参数由小到大排列一个个进行测试,这样的测试顺序很多时候不太合理,因此写了一个按二分法遍历顺序排列的算法,通常能更快的找到合适的参数.代码如下: /************ ...
- mac显示隐藏文件夹
~/Library/Preferences/com.apple.finder AppleShowAllFiles -bool true (true 改成 false 就可以不再显示隐藏文件)需要重启, ...
- J2EE基础总结(4)——JSP
什么是JSP JSP全名为Java Server Pages,中文名叫javaserver页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导.很多 ...
- uva 10626 - Buying Coke(记忆化搜索)
题目链接:10626 - Buying Coke 题目大意:给出要买可乐的数量, 以及1元,5元和10元硬币的数量, 每瓶可乐8元,每次照钱会按照最少硬币的方式找回, 问如何投币可使得投入的硬币数最少 ...
- Java 之文件目录操作
1.判断文件是否存在 File file = new File("d:\\study\\temp\\test.java"); boolean bl = file.exists(); ...