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

相关文章

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

Python中经纬度距离计算的实现方式

《Python中经纬度距离计算的实现方式》文章介绍Python中计算经纬度距离的方法及中国加密坐标系转换工具,主要方法包括geopy(Vincenty/Karney)、Haversine、pyproj... 目录一、基本方法1. 使用geopy库(推荐)2. 手动实现 Haversine 公式3. 使用py

Java对接MQTT协议的完整实现示例代码

《Java对接MQTT协议的完整实现示例代码》MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,:本文主要介绍Ja... 目录前言前置依赖1. MQTT配置类代码解析1.1 MQTT客户端工厂1.2 MQTT消息订阅适配器1.

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

Django中的函数视图和类视图以及路由的定义方式

《Django中的函数视图和类视图以及路由的定义方式》Django视图分函数视图和类视图,前者用函数处理请求,后者继承View类定义方法,路由使用path()、re_path()或url(),通过in... 目录函数视图类视图路由总路由函数视图的路由类视图定义路由总结Django允许接收的请求方法http

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb