APDU报文【转】
本文转载自:http://www.cnbolgs.com/snail0404/p/5436348.html
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)的格式如下,包含一个必须头部段和一个可选数据段:
- 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报文【转】的更多相关文章
- PSAM卡之常用APDU指令错误码【转】
本文转载自:http://blog.csdn.net/lvxiangan/article/details/53933714 PSAM卡的内容交互,是通过APDU指令完成的,常见的APDU报文格式如下: ...
- EMV/PBOC 解析(二) 卡片数据读取
上一篇简单的了解了IC智能卡的文件结构和APDU报文,这篇我们直接来读取卡内的数据.下面我们主要参照<中国金融集成电路(IC)卡规范>. 好了废话不多说,下面贴指令: (1)卡片接收一个来 ...
- EMV/PBOC 解析(一) 卡片文件结构
刚到公司老大便发我一份文档<智能卡ISO7816-4规范(中文版)>,然后就让我研究下IC智能卡数据读取和支付.身为一直做.NET开发的我对硬件啥的一无所知,各种无头绪啊,研究了两天后,稍 ...
- 7816的报文结构APDU
命令APDU 包括头和主体(这可以在上面的图中看到).头包括CLA,INS,P1 和P2 域.同T0 协议一样,CLA 和INS 说明了应用的分类和指令.P1 和P2 用来详细说明具体指令,并由每一条 ...
- 7816的报文结构——APDU
命令APDU 包括头和主体(这可以在上面的图中看到).头包括CLA,INS,P1 和P2 域.同T0 协议一样,CLA 和INS 说明了应用的分类和指令.P1 和P2 用来详细说明具体指令,并由每一条 ...
- APDU
# APDU # 定义:APDU(ApplicationProtocolDataUnit--应用协议数据单元).协议数据单元PDU(ProtocolDataUnit)是指对等层次之间传递的数据单位.协 ...
- PBOC APDU命令解析【转】
转自:http://blog.csdn.net/zuokong/article/details/49335257 版权声明:本文为博主原创文章,未经博主允许不得转载. 应用层发出的命令报文和卡片回送到 ...
- APDU命令与响应格式【转】
本文转载自:http://map.im/apduintroduce 命令格式 APDU命令由命令头和命令体组成: CLA | INS | P1 | P2 | Lc | DATA | Le命令头: CL ...
- 7816协议时序和采用UART模拟7816时序与智能卡APDU指令协议
7816时序 7816时一个比较早的老通讯时序了,最近项目上需要用UART模拟所以,简单学习时序. 时序比较简单,熟悉UART的一眼看着就像是串口的时序,只是他没有停止位,取而代之的就是保护时间gur ...
随机推荐
- 指针函数(Pointer Function)和函数指针(Pointer to Function或Function Pointer)
一.指针函数 1.解释:指针函数很好理解:简单来说,就是一个返回指针的函数,本质是一个函数.如: int fun(int x,int y); //这是一个普通函数的声明,返回值是一个int类型, ...
- 常见的awk内建变量
FS: 输入字段分隔符变量 语法: $ awk -F 'FS' 'commands' inputfilename 或者 $ awk 'BEGIN{FS="FS";}' OFS: 输 ...
- python 深浅拷贝&集合
一.深浅拷贝 1.浅拷贝,只会拷贝第一层 s = [1, 'ss', '小可爱'] s1 = s.copy() print(s1) >>> [1, 'ss', '小可爱'] s = ...
- Spring Boot 2 (三):Spring Boot 开源软件都有哪些?
016年 Spring Boot 还没有被广泛使用,在网上查找相关开源软件的时候没有发现几个,到了现在经过2年的发展,很多互联网公司已经将 Spring Boot 搬上了生产,而使用 Spring B ...
- JS数组添加元素的三种方式
1.push() 结尾添加 数组.push(元素) 参数 描述 newelement1 必需.要添加到数组的第一个元素. newelement2 可选.要添加到数组的第二个元素. newelement ...
- codeforces 362B
#include<stdio.h> #include<stdlib.h> int cmp(const void *a,const void *b) { return *(int ...
- msp430入门学习00
在TI官网上找到MSP430的程序例程.数据手册.使用指南等文件.以MSP430F169为例,步骤如下: 1)进入ti官网:http://www.ti.com.cn/ 或者http://www.ti. ...
- 搬砖--杭电校赛(dfs)
搬砖 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submissi ...
- Bad Hair Day-POJ3250(简单的入栈出栈)
Description Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow ...
- P1160 队列安排 洛谷
https://www.luogu.org/problem/show?pid=1160 题目描述 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1.先将1号同学安排进 ...