# 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. Typecast 免费了!献给设计师们的礼物

    TypeCast 让你可以从 Fonts.com.TypeKit.FontDeck 和 Google 这些字体供应和商选择字体,而且能非常方便的比较这些字体使用效果.如果你想获得用户对这些字体效果的反 ...

  2. CamanJS – 提供各种图片处理的 JavaScript 库

    CamanJS 是一个基于 Canvas 处理图片的 Javascript 库,结合简单易用的接口和先进高效的图像编辑技术.CamanJS 很容易扩展新的过滤器和插件,并伴随着一系列广泛的图像编辑功能 ...

  3. 如何在windows计划中调用备份sharepoint2010网站集的powershell脚本

    最近有个项目需要在在windows计划中使用powershell脚本备份sharepoint2010网站集,打开sharepoint的powershell执行命令管理界面的属性 查看: C:\Wind ...

  4. 将数据导入PostGIS

    #!/usr/bin/env python # -*- coding: utf-8 -*- import subprocess # database options db_schema = " ...

  5. jQuery源码解读 - 数据缓存系统:jQuery.data

    jQuery在1.2后引入jQuery.data(数据缓存系统),主要的作用是让一组自定义的数据可以DOM元素相关联——浅显的说:就是让一个对象和一组数据一对一的关联. 一组和Element相关的数据 ...

  6. Oracle EXP-00091的解决方法

    [sql] EXP-00091: 正在导出有问题的统计信息.www.2cto.com . . 正在导出表                      WF_GENERAL导出了 EXP-00091: 正 ...

  7. 【思维导图】Fiddler学习笔记

    最近在学习Fiddler这款工具,边学边画了如下的思维导图,可以方便自己对这款工具有一个全面的了解. 软件介绍(摘自百度百科):Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电 ...

  8. Android 内容观察者的原理

    拦截短信,比如当发短信的时候,就把短信读取出来,当系统的短信发生变化的时候,大叫一声,把数据发送到公共的消息邮箱里面,我们的应用通过内容观察者观察公共的消息邮箱 获取ContentResolver对象 ...

  9. IOS 手势详解

    在IOS中手势可以让用户有很好的体验,因此我们有必要去了解一下手势. (在设置手势是有很多值得注意的地方) *是需要设置为Yes的点击无法响应* *要把手势添加到所需点击的View,否则无法响应* 手 ...

  10. Android开发拾遗(一)用Wi-Fi连接adb

    可以用Wi-Fi通过标准的TCP/IP连接来连接Android设备. 这在开发监听USB相关事件的应用程序时会特别有用,原因是USB连接会起到干扰作用,比如USB的连接/断开事件. 首先要像通常一样用 ...