zoukankan      html  css  js  c++  java
  • APDU

    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字段中标示的指令类中的一个特定指令。 ![](http://i.imgur.com/rsQtXAA.jpg)

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


    参考博客:

  • 相关阅读:
    SQL SERVER中一些常见性能问题的总结
    【BZOJ2554】Color 概率神题
    【BZOJ1818】[Cqoi2010]内部白点 扫描线+树状数组
    【BZOJ1879】[Sdoi2009]Bill的挑战 状压DP
    【BZOJ2668】[cqoi2012]交换棋子 费用流
    【BZOJ4372】烁烁的游戏 动态树分治+线段树
    【BZOJ3470】Freda’s Walk 概率与期望
    【BZOJ2087】[Poi2010]Sheep 几何+DP
    【BZOJ4428】[Nwerc2015]Debugging调试 记忆化搜索+分块
    【BZOJ2137】submultiple 高斯消元求伯努利数
  • 原文地址:https://www.cnblogs.com/snail0404/p/5436348.html
Copyright © 2011-2022 走看看