IC卡的传输协议(3)【转】
转自:http://bbs.ednchina.com/BLOG_ARTICLE_172027.HTM
3、终端传输层
本节描述了在终端和 IC 卡之间传输的命令和响应 APDU 的机制。APDU 是命令或响应报文。由于命令和响应报文都可以包含数据,TTL应能处理应用层定义的4种命令格式。C-APDU和R-APDU的组成在应用层描述。
TAL传送C-APDU到TTL。在发送到IC卡之前,应将其变换成传输协议认可的形式。IC卡处理完命令后,以R-APDU的格式将数据(如果存在的话)和状态码回送给TTL。
3.1 T="0协议下" APDU的传送
本节描述了 C-APDU 和 R-APDU 的映射方式,TTL 和 IC 卡之间的数据交换机制以及在命令情况2或4中如何使用GET RESPONSE命令取回IC卡的数据。
(1)C-APDU和 R-APDU的映射方式和数据交换
如何将 C-APDU 映射到 T="0" 命令头取决于命令情况。如何将 IC 卡回送的数据(如果存在)和状态码映射到R-APDU的形式取决于回送数据的长度。
由IC卡回送的过程字节SW1 SW2=’61xx’和SW1 SW2=’6Cxx’用来控制IC卡和TTL之间的数据交换,它不会回送给 TAL。过程字节 SW1 SW2=’61xx’或 SW1 SW2=’6Cxx’表示命
令在IC卡中的处理没有完成。
如果 IC 卡回送给 TTL 的状态码是 SW1 SW2=’9000’,表示正常完成了命令的处理。任何其它的状态码都表明 IC 卡中断了命令的处理,处理失败的原因在状态码中指出。TTL 收到来自 IC 卡的任何状态码(但不包括过程字节’61xx’和’6Cxx’)时,都结束命令的处理,不论是正常、警告还是错误情况。
以下描述的是将IC卡回送的数据和状态字节构造成R-APDU格式的方法,仅适用于IC 卡已成功完成了命令处理或全部数据(如果存在)在过程字节’61xx’和’6Cxx’的控制下已被IC卡返回的情况。INS、INS和’60’过程字节的详细使用在此不作描述。
a.情况1
C-APDU头映射到T=0命令头的前四个字节,T=0命令头的P3置为’00’。
交换流程如下:
* TTL发送T=0的命令头到IC卡;
* IC卡回送状态码给TTL。
完成命令处理后,由IC卡向TTL回送的状态码原样映射到R-APDU必备的尾域。
注:IC卡应分析T=0命令头,判断是命令情况1还是命令情况2在请求最大长度的响应数据。
b. 情况2
C-APDU 头被映射到 T="0" 命令头的前四个字节,长度字节’Le’从 C-APDU 的条件体被映射到T=0命令头的P3。
交换流程如下:
* TTL发送T=0的命令头到IC卡。
* 在过程字节的控制下,IC 卡向 TTL 回送数据和状态(在非正常处理时只返回状态)。
完成命令处理后,由 IC 卡向 TTL 回送的数据(如果存在)和状态按照下述方法映射到R-APDU:
(i) 如果Le≥Licc,回送数据被映射到R-TPDU的条件体,返回的状态无变化地被映射到R-APDU必备的尾域。
(ii) 如果Le<Licc,回送数据的前Le字节被映射到R-TPDU的条件体中,返回的状态无变化地被映射到R-APDU必备的尾域。
c. 情况3
C-APDU头被映射到T=0命令头的前四个字节,C-APDU条件体的长度字节’Lc’被映射到T=0命令头的P3。
交换流程如下:
* TTL发送T=0的命令头到IC卡。
* 如果 IC 卡回送一个过程字节而不是状态码,则在此过程字节的控制下,TTL向IC卡发送C-APDU条件体的部分数据。如果IC卡回送状态码SW1 SW2,TTL将中断命令处理过程。
* 如果处理过程没有在步骤2处中断,则IC卡返回命令处理结束后的状态。
IC卡完成命令处理后回送给TTL的状态码,或由IC卡返回的引起TTL中断命令处理的状态码,都不加改变地映射到R-APDU。
d. 情况4
C-APDU头被映射到T=0命令头的前四个字节,C-APDU条件体的长度字节’Lc’被映射到T=0命令头的P3。
交换流程如下:
* TTL发送T=0命令头到IC卡。
* 如果IC卡回送一个过程字节而不是状态码,则在此过程字节控制下,TTL给IC 卡发送 C-APDU 条件体的部分数据。如果 IC 卡回送状态码 SW1 SW2,TTL将中断命令处理过程。
* 如果处理过程在步骤2中没有中断,IC卡应回送过程字节’61xx’给TTL,请求TTL发出GET RESPONSE命令从IC卡取回数据。在命令处理的这个阶段中,IC卡不应回送状态码SW1 SW2=‘9000’。TTL应发送GET RESPONSE命令到IC卡取回提及的数据,小于或等于IC卡回送的过程字节’61xx’中的’xx’字节值的数据指定为GET RESPONSE命令的长度字节。这样,GET RESPONSE命令可以同情况2的命令一样处理。在过程字节控制下,IC卡向TTL回送数据和状态码(或在非正常处理情况下,只有状态码)。
完成命令处理后,IC 卡回送给 TTL 的数据(如果存在)和状态码,或仅是引起 TTL终止命令处理过程的状态码,按照下述规则映射到R-APDU:
(i)如果 Le≥Licc,回送的数据被映射到 R-TPDU 的条件体,返回的状态不做改变地被映射到R-APDU必备的尾域。
(ii)如果 Le<Licc,回送数据的前 Le 个字节被映射到 R-TPDU 的条件体,返回的状态不做改变地被映射到R-APDU必备的尾域。
(2) 过程字节’61xx’和’6Cxx’的使用
由IC卡回送到TTL的过程字节’61xx’和’6Cxx’指明了TTL取回当前正在处理的命令请求数据的方式。在T=0协议下,这些过程字节仅仅用在命令情况2和4中。
过程字节’61xx’通知TTL发出GET RESPONSE命令到IC卡。GET RESPONSE命令头的P3置为≤’xx’。
过程字节’6Cxx’通知TTL立即重发前条命令,同时命令头置为P3=‘xx’。
命令情况2和4在容错处理过程中,使用过程字节的规定如下。在发生错误时,IC卡回送错误或警告状态码而不是’61xx’或’6Cxx’。
a. 命令情况 2
如果IC卡收到一个命令情况2的头并且Le≠Licc,应回送过程字节’6CLicc’(或状态码指出一个警告或错误情况,而非 SW1 SW2=‘9000’)通知 TTL 立即重发 P3=Licc 的命令头。
如果 IC 卡收到命令情况 2 的头并且 Le="Licc",IC 卡在过程字节控制下或者回送请求的数据和相关状态码,或者回送过程字节’61xx’(或表明警告或错误情况的状态码,而非SW1 SW2=‘9000’)通知TTL按最大长度’xx’发出GET RESPONSE命令。
b. 命令情况 4
如果IC卡收到一个命令情况4的命令,处理完随C-APDU一同发送来的数据之后,应回送过程字节’61xx’,(或表明警告或错误情况的状态码,而非 SW1 SW2=‘9000’)通知TTL按最大长度’xx’发出GET RESPONSE命令。
(3) GET RESPONSE命令
TTL发出GET RESPONSE命令,是为了从IC卡取得对应于命令情况2和4的C-APDU的Le字节的数据。GET RESPONSE仅适用于T=0协议类型。
命令报文的结构如下:
字节 值
CLA ‘00’
INS ‘C0’
P1 ‘00’
P2 ‘00’
Le 预期数据的最大长度
正常处理结束后,IC卡回送状态码SW1 SW2=‘9000’和Licc字节的数据。
在错误情况发生时,错误状态码(SW1 SW2)的编码如下:
SW1 SW2 含义
‘64’ ‘00’ GET RESPONSE失败
‘67’ ‘00’ 域长度错误
‘6A’ ‘86’ P1 P2≠’00’
3.2 T="1协议下" APDU的传送
C-APDU 从 TAL 传送到 TTL,TTL 将其不加变化地映射到 C-APDU 的一个 I 块的 INF域中,然后把这个I块发送到IC卡。IC卡在I块的INF域中向TTL回送响应数据(如果存在)和状态码,I块的INF域的内容不加变化地被映射到R-APDU,然后返回给TAL。
如果有必要,C-APDU和响应数据/状态码可以分成多个数据块的INF域的链接。
4、应用层
应用协议由TAL和TTL之间一组有序的数据交换组成,本节的后续部分定义了应用协议。
应用层交换的每一步由命令响应对组成,其中 TAL 通过 TTL 给 IC 卡发送命令,IC卡处理该命令后通过TTL返回一个响应给TAL。每一个特定的命令都与一个特定的响应相匹配。一个APDU就是一个命令报文或一个响应报文。 命令报文和响应报文都可以包含数据,传输协议通过TTL来管理四种命令情况的情 况,如下所示:
APDU中数据存在的情况:
情况 命令数据 响应数据
1 无 无
2 无 有
3 有 无
4 有 有
需要注意的是,应用层中有一种特殊的报文叫安全报文,它在原有命令的基础上添加了安全数据MAC,所以安全报文传送总有数据要送往IC卡,因此仅适用于命令情况3和4的情况。当使用安全报文传送时,情况1的命令就变为情况3,情况2的命令就变为情况4。
4.1 C-APDU
C-APDU 包含一个必备的连续四字节的命令头,用 CLA、INS、P1 和 P2 表示,同时包括一个可变长度的条件体。
命令头定义如下:
* CLA:指令类型,1Byte;除’FF’外可赋任何值。
* INS:指令类型的指令码,1Byte。只有在低半字节为0,且高半字节既不是‘6’也不是’9’时,INS才有效。
* P1 P2:参数字节,分别1Byte,根据不同的INS来定义。
条件体定义如下:
* Lc 占一个字节,定义了在 C-APDU 中发送数据的字节数。Lc 的取值范围从 1到255。
* Le 占一个字节,指出 R-APDU 中期望返回的最大字节数。Le 的取值范围从 0到255;如果Le=0,期望返回数据的字节数的最大长度是256。
可能的C-APDU结构的四种情况如下:
情况 结构
1 CLA INS P1 P2
2 CLA INS P1 P2 Le
3 CLA INS P1 P2 Lc Data
4 CLA INS P1 P2 Lc Data Le
4.2 R-APDU
R-APDU 是一串字节,这一串字节由一个条件体以及必备的两字节状态码 SW1 SW2组成。条件体是一串数据字节,其最大长度在C-APDU中的Le中定义。 必备的状态码标明IC卡在处理完命令后的状态。
SW1 SW2的编码遵循下述规定:
* SW1的高半字节是’6’或’9’;
* 禁止SW1的值为’60’;
* SW1的值为’61’或’6C’时,应作为一个错误来处理;
* 命令正常结束时,SW1 SW2的取值为’9000’;
* 当SW1的高半字节为’9’,且低半字节不为’0’时,其含义依赖于相关的应用;
* 当SW1的高半字节为’6’,且低半字节不为’0’时,SW1的含义与应用无关。
IC卡的传输协议(3)【转】的更多相关文章
- IC卡的传输协议(1)-字符传输协议T=0【转】
转自:http://bbs.ednchina.com/BLOG_ARTICLE_172022.HTM 在异步半双工传输协议中,主要定义了终端为实现传输控制和特殊需要发出的命令及这些命令的处理过程. 在 ...
- IC卡的传输协议(2)-块传输协议T=1【转】
转自:http://bbs.ednchina.com/BLOG_ARTICLE_172024.HTM 2.4 块传输协议T=1 T=1协议中,在TAL和IC卡之间传送的命令.R-APDU和传输控制信息 ...
- IC卡的传输协议(2)-块传输协议T=1续【转】
转自:http://bbs.ednchina.com/BLOG_ARTICLE_172025.HTM (3)容错操作 先来看一下容错的规则定义. * 复位应答后,第一个数据块是由终端发往IC卡的,而且 ...
- 智能IC卡与终端(读卡器)之间的传输协议
1.有两种协议 T=0,异步半双工字符传输协议 T=1,异步半双工块传输协议 终端一般都支持这两种协议,IC卡可以选择支持其中的一种.(因为终端可能需要面对各种类型的卡片,所以必须两种协议都支持,而卡 ...
- ISO7816 传输协议 T0 T1
T=0协议不能用一条命令来实现,必须分为两步实现:第一条命令为卡片提供数据,然后用另外一条相关的命令来取回数据.这样给卡片的编程带来很大麻烦,同时卡片内存中必须保留上一次操作需要返回的数据.这时如果不 ...
- IC卡T0协议中的过程字与状态字
T0协议中,IC卡收到命里头以后向TTL回传过程字或状态字SW1.SW2: TTL和IC卡在二者之间的命令和数据交换的任何时刻都必须知道数据流的方向和IO线路由谁驱动. 摘录参考:<中国金融集成 ...
- IC卡复位应答ATR的数据元和它们的意义
ISO/IEC 7816-3标准中对ATR的数据串和数据元做了规定和描述.ATR的数据元和它们的意义: 数据元 说明 TS 起始字符 T0 格式字符 TA1,TB1,TC1,TD1,... 接口字符 ...
- IC卡复位应答ATR解析
输入的是ATR,通过解析输出TA.TB.TC.TD的信息. 似乎没有容错处理,~~~~(>_<)~~~~ #include <stdio.h> #define TA_BIT ( ...
- IC卡接口芯片TDA8007的读写器设计
摘要:阐述T=0传输协议,给出IC卡读写器中使用的IC卡APDU指令流程和原理框图:重点介绍其中的IC卡接口芯片Philips的TDA8007,给出通过TDA8007对CPU IC卡上下电过程.具体程 ...
随机推荐
- 九度OJ--Q1167
import java.util.Scanner;import java.util.TreeSet; /* * 题目描述: * 输入一个数组的值,求出各个值从小到大排序后的次序. * 输入: * 输入 ...
- liniux备忘录-磁盘配额与进阶文件系统管理
知识 磁盘配额Quota 可以限制磁盘的使用容量,可以对用户.群组磁盘的最大使用容量. 磁盘配额Quota的使用限制 只能针对整个文件系统. 核心必须支持Quota. 自行编译的核心需要注意 Quot ...
- JAVA_四大代码块_普通代码块、构造代码块、静态代码块、同步代码块。
普通代码块 在方法或语句中出现的{}里面的内容就被称为普通代码块,普通代码块和一般的语句执行顺序一样,由他们在代码中出现的次序决定,即--"先出现先执行". 但是不同的普通代码块即 ...
- winform timer时间间隔小于执行时间
如果SetTimer的时间间隔为t,其响应事件OnTimer代码执行一遍的时间为T,且T>t.这样,一次未执行完毕,下一次定时到,这时候程序会如何执行? 可能的情况:1.丢弃还未执行的代码,开始 ...
- 编程练习:寻找发帖"水王"
题目: 寻找发帖"水王" 来源: 编程之美 分析 衍生:就是给定一个数组,其中某个元素出现次数超过了数组长度的一半,找出这个元素 方法s 方法1 对这个串进行遍历,同时对出现的元素 ...
- windows apache启动报错
Windows启动Apache时报错 he requested operation has failed 有可能80端口被占或者项目路径不存在等 首先找到问题原因 cmd--命令端--切换到apach ...
- maven第一个HelloWorld
1.Maven约定好的目录结构: maven01/src --main --java --package //包有多少级,加多少个子folder --新建一个HelloWorld.java --tes ...
- 【Python】Linux crontab定时任务配置方法(详解)
CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行. cron 系统调度进程. 可以使用它在 ...
- QueryHelper插件类(hql)
package cn.itcast.core.util; import java.util.ArrayList; import java.util.List; public class QueryHe ...
- 浅谈javascript的原型及原型链
浅谈javascript的原型及原型链 这里,我们列出原型的几个概念,如下: prototype属性 [[prototype]] __proto__ prototype属性 只要创建了一个函数,就会为 ...