Smartcard中T0协议等待时间WT的定义和计算

2023-10-15 05:59

本文主要是介绍Smartcard中T0协议等待时间WT的定义和计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Smartcard测试中,基本上都包含有对等待时间WT(waiting time)的极限测试,在客户支持中,也常常遇到WT不能通过测试的问题,大部分情况是由于卡通信中WT没有正确设置的缘故。

本来想将所有的关于WT的东西都列出来,包括GT, WT, CWT, BWT, BGT等,懒散了一下,这里只说T0协议下WT的计算。

本文推理和计算中涉及到ISO-7816标准和一些数学公式,会让人没有那么赖心看下去,如果你只关心结论,请跳转到:

  • 第2.3节,看关于等待时间WT的一些结论
  • 第3节,查看T0卡通信时解析ATR并计算工作等待时间WT的实例

这里所有关于时间的定义都来自标准ISO/IEC 7816-3:2006(E)

ISO/IEC 7816-3:2006(E)

Identification cards — Integrated circuit cards — Part 3:
Cards with contacts — Electrical interface and transmission protocols

1. 等待时间WT的定义

7.2 Character frame中定义了GT和WT

GT and WT definition

这里指出:
1. 两个连续字符之间最小的上升沿间隔叫做”guart time”,记为GT。
2. 两个连续字符之间最大的上升沿间隔叫做”waiting time”,记为WT。

T0协议时关于WT,有两种:
1. 初始等待时间(initial waiting time,), 即复位应答ATR中的waiting time。
2. 工作等待时间(work waiting time),即卡通信时的waiting time。

下面来看看标准7816-3中关于这两个waiting time的规定。

2. T0卡复位和正常通信时的WT

2.1 复位时的WT

复位时发送ATR使用的WT又叫做初始等待时间(initial waiting time)

8.1 Characters and coding conventions节指定了initial waiting time的值:

WT in ATR

这里指出:
1. 复位传输ATR时,传输传输参数使用默认的Fd = 372, Dd = 1
2. 传输ATR时,GT = 12 etu, WT = 9600 etu

2.2 正常通信时的WT

正常通信时等待时间WT又叫做工作等待时间(work waiting time)

10.2 Character level (page 28)节指定了T0协议的work waiting time的计算方式:

WT in T0

这里指出:

WT=WI×960×Fif W T = W I × 960 × F i f

其中:
1. WI参数从TC2的bit1~8解析得到,TC2的值0x00留作将来之用,如果TC2不存在,则WI默认为10
2. Fi和f参数可以从TA1解析拿到,bit5-8得到Fi和f,bit1-4得到Di,默认为Fi=372, f=5Di=1,如下:
Fi, f and Di

7.1 Elementary time unit中定义了etu:

etu definition

所以这里:

Fif=Di×1etu F i f = D i × 1 e t u

WT=WI×960×Fif=WI×960×Di×1etu W T = W I × 960 × F i f = W I × 960 × D i × 1 e t u

如果TC2不存在(WI=0),TA1不存在(Fi=371, f=5, Di=1)有:

WT=10×960×1×1etu=9600etu W T = 10 × 960 × 1 × 1 e t u = 9600 e t u

所以,T0协议工作时的WT和ATR的WT是一样的,都是9600etu。

2.3 WT结论

  1. ATR传输的WT = 9600 etu;
  2. T0卡工作时WT = WI x Di x 960etu,默认情况下WI=10, Di=1,此时WT = 9600etu,跟ATR传输时一样。

3. 实例分析

3.1 卡1

某CA的T0卡发送的原始ATR为:

3B 34 94 00 30 42 30 30

对ATR解析后的数据如下:

--
TS = 0x3BDirect Convention
T0 = 0x34Y(1): b0011, K: 4 (historical bytes)
TA(1) = 0x94Fi=512, Di=8, 64 cycles/ETU (62500 bits/s at 4.00 MHz, 78125 bits/s for fMax=5 MHz)
TB(1) = 0x00VPP is not electrically connected
Historical bytes30 42 30 30
Category indicator byte: 0x30(proprietary format) “B00”

这里存在TA1(Fi=512, f=5, Di=8),但不存在TC2(WI=10),因此WT:

WT=WI×Di×960etu=10×8×960etu=76800etu W T = W I × D i × 960 e t u = 10 × 8 × 960 e t u = 76800 e t u

所以在驱动中,需要将卡工作时的WT设置为76800etu,而不是默认的9600etu。

3.2 卡2

某CA的T0卡发送的原始ATR为:

3F 77 18 00 00 C2 EB 41 02 6C 90 00

对ATR解析后的数据如下:

--
TS = 0x3FInverse Convention
T0 = 0x77Y(1): b0111, K: 7 (historical bytes)
TA(1) = 0x18Fi=372, Di=12, 31 cycles/ETU (129032 bits/s at 4.00 MHz, 161290 bits/s for fMax=5 MHz)
TB(1) = 0x00VPP is not electrically connected
TC(1) = 0x00Extra guard time: 0
Historical bytesC2 EB 41 02 6C 90 00
Category indicator byte: 0xC2(proprietary format) “.A.l..”

这里存在TA1(Fi=372, f=5, Di=12),但不存在TC2(WI=10),因此WT:

WT=WI×Di×960etu=10×12×960etu=115200etu W T = W I × D i × 960 e t u = 10 × 12 × 960 e t u = 115200 e t u

所以在驱动中,需要将卡工作时的WT设置为115200etu,而不是默认的9600etu。

3.3 卡3

某CA的T0卡发送的原始ATR为:

3B 64 00 02 30 42 30 30

对ATR解析后的数据如下:

--
TS = 0x3BDirect Convention
T0 = 0x64Y(1): b0110, K: 4 (historical bytes)
TB(1) = 0x00VPP is not electrically connected
TC(1) = 0x02Extra guard time: 2
Historical bytes30 42 30 30
Category indicator byte: 0x30(proprietary format) “B00”

这里TA1和TC2都不存在,所以Fi, f, Di 和 WI都取默认值。
即:

Fi=372;f=5;Di=1;WI=10; F i = 372 ; f = 5 ; D i = 1 ; W I = 10 ;

WT=WI×Di×960etu=10×1×960etu=9600etu W T = W I × D i × 960 e t u = 10 × 1 × 960 e t u = 9600 e t u

所以在驱动中,卡工作时的WT跟ATR传输时的一样,都是9600etu。

4. ATR解析的福利

最后送上一个福利。

看了第3节,可见,计算etu的关键是要先解析收到的ATR,但你可能不了解7816-3标准,也不清楚ATR如何解析,那怎么办啊?

没有关系,一个名为“Smart card ATR parsing”的网站为你解析ATR,省了多少烦恼,我第一次发现的时候开心得不行。

好了,地址在:[Smart card ATR parsing] (https://smartcard-atr.appspot.com/)

赶快去体验吧!

这篇关于Smartcard中T0协议等待时间WT的定义和计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/215788

相关文章

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。