Chinaunix首页 | 论坛 | 博客
  • 博客访问: 584209
  • 博文数量: 165
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1554
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-23 22:57
个人简介

我本仁慈,奈何苍天不许

文章分类

全部博文(165)

文章存档

2018年(1)

2016年(33)

2015年(5)

2014年(34)

2013年(92)

分类: 嵌入式

2016-08-05 15:49:39

原文地址:智能卡 APTU命令 作者:夜添香

    一条命令APDU含有一个头标和一个本体。本体可有不同长度,或者在相关数据字段为空时,整个可以不存 在。

 头标由四个数据元组成,它们是类CLAClAss)字节,命令INSINStructicn)字节和两个参数PlP2 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.11GXM移动电话和遵照EN726-3的标准


  两个参数字节主要用来提供更多的关于指令字节选择命令的信息。于是,它们主要用来作为命令不同选项 的选择开关。例如,把它们用来选择SELECT FLE的不同选项或是规定READ BINARY的区距。

  接着头标的下一段是本体,除有了长度规定之外,它可以被略去,本体承担了双重角色。首先,它规定了 送给卡的数据部分的长度(在Lc字段),以及由卡回送的数据部分的长度(在Le字段)。其次,它含有发送 给卡的有关命令的数据。如果Le字段之值为‘00’,则终端期待着卡传送这条命令最大可用数量的数据,这 是关于长度的数值规定的惟一例外。

  LeL字段通常为1字节长。然而能够把它们转换为每个有3字节长的字段,这样可用来表示高达65 536的长 度,因为第1字节中含有扩展符序列‘∞’,参见图2。标准已经规定这个三字节长度的规格是为将来的应用 的,但由于目前可用存储器大小的限制这一点尚未能实现。

  前面所述命令APDU的各部分可以组合成四种一般的个案如图3所示。

00

Le/LcMSB

Le/LcLSB

字节1

字节2

字节3

1.APDU命令集


1.1 ISO智能卡通用APDU命令集(详细介绍:ISO 7816标准(中文版).pdf75~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命令报文启动下列操作之一:
写一次记录;
对早已呈现在卡内的记录数据字节与在命令APDU中给出的记录数据字节进行逻辑“或”运算;
对早已呈现在卡内的记录数据字节与在命令APDU中给出的记录数据字节进行逻辑“和”运算

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

启动卡使用从接口设备发送来的询问数据和在卡内存储的相关秘密(例如密钥)来计算鉴别数据
当该相关秘密被连接到MF时命令可以用来鉴别整个卡
当该相关秘密被连接到另一个DF时命令可以用来鉴别那个DF

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)分类再次处理处理

阅读(1434) | 评论(0) | 转发(0) |
0

上一篇:nrf51822裸机教程-PPI

下一篇:智能卡 ATR解析

给主人留下些什么吧!~~