# APDU #

定义:APDU(ApplicationProtocolDataUnit--应用协议数据单元)。协议数据单元PDU(ProtocolDataUnit)是指对等层次之间传递的数据单位。协议数据单元(ProtocolDataUnit)物理层的PDU是数据位(bit),数据链路层的PDU是数据帧(frame),网络层的PDU是数据包(packet),传输层的PDU是数据段(segment),其他更高层次的PDU是数据(data)。

APDU命令与响应格式

命令格式

  • APDU命令由命令头和命令体组成: CLA | INS | P1 | P2 | Lc | DATA | Le
  • 命令头: CLA | INS | P1 | P2
  • 命令体: Lc | DATA | Le

    命令各字段含义

  • CLA:命令报文的类别字节
  • P1: 参数 1
  • P2:参数 2
  • Lc:Data的长度(含4字节mac)
  • Data:在命令的数据字段中发送的字节串
  • Le:在向命令响应的数据字段中期望的字节最大数

    命令可分为四种情况:

  • Case1 | CLA INS P1 P2
  • Case2 | CLA INS P1 P2 Le
  • Case3 | CLA INS P1 P2 Lc Data
  • Case4 | CLA INS P1 P2 Lc Data Le

    Case1

  • 这种情况时,命令中没有数据送到卡( Lc)中,也没有数据从卡中返回( Le)。
  • 不含安全报文的命令: CLA | INS | P1 | P2
  • 含安全报文的命令: CLA | INS | P1 | P2 | Lc | MAC
  • 注: Lc = MAC 的长度, 4 字节。

    Case2

  • 这种情况时,命令中没有数据送到卡( Lc)中,有数据从卡中返回( Le)。
  • 不含安全报文的命令: CLA | INS | P1 | P2 | Le
  • 含安全报文的命令: CLA | INS | P1 | P2 | Lc | MAC | Le
  • 注: Lc = MAC 的长度, 4 字节。

    Case3

  • 这种情况时,命令中有数据送到卡( Lc)中,没有数据从卡中返回( Le)。
  • 不含安全报文的命令: CLA | INS | P1 | P2 | Lc | Data
  • 含安全报文的命令: CLA | INS | P1 | P2 | Lc | Data+MAC
  • 注: Lc = 数据的长度 + MAC 的长度( 4 字节)。

    Case4

  • 这种情况时,命令中既有数据送到卡( Lc)中,也有数据从卡中返回( Le)。
  • 不含安全报文的命令: CLA | INS | P1 | P2 | Lc | Data | Le
  • 含安全报文的命令: CLA | INS | P1 | P2 | Lc | Data+MAC | Le
  • 注: Lc = 数据的长度 + MAC 的长度( 4 字节)。

    响应格式

    格式1

  • | Data | SW1 SW2 |

格式2

  • | SW1 SW2 |

响应各字段含义

  • Data:在响应的数据字段中收到的字节串
  • SW1:状态字 1
  • SW2:状态字 2

APDU格式详解

APDU定义了主机和卡之间交互的数据格式,绝大部分卡片遵循此数据格式,当然为了保密或其它原因是可以自定义新的数据格式。APDU分为发送命令(C-APDU)和返回命令(R-APDU)。

一、C-APDU元素说明:

发送命令(C-APDU)的格式如下,包含一个必须头部段和一个可选数据段:

  1. CLA(1字节):用于命令类别的标示,传输安全控制,传输信道说明等。
比特值 说明
0XXXXXXX 为ISO规定的指令类别,0x00,0x04(线路保护)等
1XXXXXXX 为私有自定义指令类别,0x80,0x84(线路保护)等

2.INS(1字节):用于指明CLA字段中标示的指令类中的一个特定指令。

3.P1(1字节):指令参数1,如没有填0x00。

4.P2(1字节):指令参数2,如没有填0x00。

5.LC(1字节):这个可选的字段是命令的数据字段的字节数。

6.LE(1字节):这个可选的字段指定在期望响应的数据字段中的极限字节数。

7.四种C-APDU结构如下:

二、R-APDU元素说明:

返回命令(R-APDU)的格式如下,包含一个可选数据段和一个必须状态值:

数据字段(可变长度,由APDU命令中的LE确定):这个可选择的字段包含卡片返回的数据。

SW1(1字节):这个必要的字段是状态字1。

SW2(1字节):这个必要的字段是状态字2。

SW1-SW2成功一般为9000,其他值为某种状态、警告或者错误!

常用SW1-SW2值:

9000: 执行成功

6100: 数据被截断

6283: 应用无效

6300: 认证失败

6400: 原因不明

6700: 长度不对

6982: 需要PIN验证

6983: 文件无效

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: 未知错误


参考博客:

APDU的更多相关文章

  1. 如何把apdu[decode_len]打印出来

    memcpy(data, &apdu[decode_len], apdu_len - decode_len);    int i = 0;    for(i=0;i<apdu_len;i ...

  2. PBOC APDU命令解析【转】

    转自:http://blog.csdn.net/zuokong/article/details/49335257 版权声明:本文为博主原创文章,未经博主允许不得转载. 应用层发出的命令报文和卡片回送到 ...

  3. 7816的报文结构APDU

    命令APDU 包括头和主体(这可以在上面的图中看到).头包括CLA,INS,P1 和P2 域.同T0 协议一样,CLA 和INS 说明了应用的分类和指令.P1 和P2 用来详细说明具体指令,并由每一条 ...

  4. 7816的报文结构——APDU

    命令APDU 包括头和主体(这可以在上面的图中看到).头包括CLA,INS,P1 和P2 域.同T0 协议一样,CLA 和INS 说明了应用的分类和指令.P1 和P2 用来详细说明具体指令,并由每一条 ...

  5. ISO 7816-4: Annex A: Transportation of APDU messages by T=0

    http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816-4_annex-a.aspx Annex A: Transportation ...

  6. Extended APDU support

    http://pcsclite.alioth.debian.org/ccid_extended_apdu.html To be able to use an extended APDU you nee ...

  7. Complete list of APDU responses

    https://www.eftlab.com.au/index.php/site-map/knowledge-base/118-apdu-response-list List of APDU resp ...

  8. APDU命令与响应格式【转】

    本文转载自:http://map.im/apduintroduce 命令格式 APDU命令由命令头和命令体组成: CLA | INS | P1 | P2 | Lc | DATA | Le命令头: CL ...

  9. SIM卡APDU指令【转】

    本文转载自:http://blog.csdn.net/hlx156/article/details/54136756 一个APDU可以是一个命令,也可以是命令的响应. 命令APDU的一般格式: CLA ...

随机推荐

  1. JSCapture – 基于 HTML5 实现的屏幕捕捉库

    JSCapture 是用纯 JavaScript 和 HTML5 实现的屏幕捕捉库.它可以让从您的浏览器中截图和记录在桌面的视频.JSCapture 使用 getUserMedia 来实现屏幕捕获.目 ...

  2. Treed – 基于拖放 操作的,强大的树形编辑器

    Treed 是一个功能强大的树型编辑组件.Treed 使用 MVC 模式,简单的构造可以帮助你轻松创建一个完全不同的树形视图.您也可以创建自己的“节点”类,如果你想要做的不仅仅是单一的文本输入. 您可 ...

  3. Sortable – 简单灵活的 JavaScript 拖放排序插件

    当需要在网站中添加拖放排序功能的时候,jQuery UI 的排序组件可能是最流行的解决方案.今天给大家介绍另一款简单灵活的 JavaScript 拖放排序插件——Sortable,它使用 HTML5 ...

  4. JavaScript学习笔记-对象

    枚举对象的属性:通常用for(...in...)来循环遍历,由于 for in 总是要遍历整个原型链,因此如果一个对象的继承层次太深的话会影响性能 for(var i in foo){ if(foo. ...

  5. sqlite学习1

    Architecture  就像编译器一样,结构分为前端.虚拟机.后端 性能和限制(limitations) 使用B树来做indexes,用B+树来做table.和其他数据库一样 由于不需要鉴权.网 ...

  6. 编译Android系统源码(高通平台)

    在Android源码根目录执行下面命令 source build/envsetup.sh choosecombo make –j4 其他命令(首先需要在android源码根目录执行source bui ...

  7. Android 调用系统照相机拍照和录像

    本文实现android系统照相机的调用来拍照 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.a ...

  8. NSoperation线程通信

    全局变量 @property (weak, nonatomic) IBOutlet UIImageView *imageView; @property (nonatomic, strong) NSOp ...

  9. OC中面向对象2

    一. 定义OC的类和创建OC的对象 接下来就在OC中模拟现实生活中的情况,创建一辆车出来.首先要有一个车子类,然后再利用车子类创建车子对象 要描述OC中的类稍微麻烦一点,分2大步骤:类的声明.类的实现 ...

  10. 【Android疑难杂症】GridView动态设置Item的宽高导致第一个Item不响应或显示不正常的问题

    前言 这个问题在之前做一个盒子项目时遇到过,最近又遇到了,使用GridView遇到的非常奇葩的问题,这里记录分享一下. 声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnb ...