USB CCID "复杂"命令拾零?
本文记录 USB CCID 标准中几个"复杂"的命令,复杂在于在这些命令身上花的时间较之简单的命令多许多或者是理解的时间比较晚,可能就是刚才。
主要有以下几条:
ccid_T0APDU();
ccid_Secure();
ccid_Escape();
ccid_Abort();
ccid_Mechanical();
ccid_SetDataRateAndClockFrequency();
ccid_T0APDU(): 我们知道,当读卡器是APDU level时,并且卡片使用T=0协议进行通信,那么构造TPDU的任务就落在了读卡器身上。根据ISO7816规定,该角色需要将APDU构造成一组命令,其中包括GET_RESPONSE()和ENVELOPE()命令,同时,由于每张卡片的CLA字段可以不同,这时,读卡器就需要一个规则来确定发送这2条命令时,选择的CLA是什么了。主机可以用ccid_T0APDU()来设置该值,以后读卡器就知道该怎么做了。
ccid_Secure(): 该命令用于 PIN_VERIFY 和 PIN_MODIFY 时,也就是校验PIN和修改PIN,该命令复杂在于命令后面的参数,需要根据卡片特性来填充并且构造合适的APDU命令,比较麻烦。
ccid_Escape(): 该命令用于传输厂家定义的特殊命令,可以理解为扩展命令,比如有的卡片PIN_VERIFY和PIN_MODIFY就是通过这个命令来做的,是因为M$ ccid驱动不支持 ccid_Secure()命令吧,我不确定?!
ccid_Abort(): 该命令是最难理解的一个,首先要明确 abort 什么东西?根据CCID,能够被 abort 的命令有以下几个:
PowerOn()、XfrBlock()、Escape()、Secure()、Mechanical() 和 Abort()本身。 从这些命令似乎很难看出 abort 到底有什么用处(个人原来一直认为没用,现在有所转变了),不过,根据标准和实际场景分析得出,这条诡异的命令主要有以下2个功能:
1)帮助 CCID 读卡器同步状态:
如何同步呢?这个太细节了,其实就是因为读卡器因为某些原因已经堵死了或者将要堵死,主机发送一对 abort 命令来救活读卡器;
2)帮助 HOST 端同步状态:
根据个人的理解,在主机端,靠状态机驱动时,增加这个 abort 状态和处理,能够达到同步状态,把状态机跑顺的作用。
我们可以假设一些使用该命令的场景:
1)读卡器执行一条需要等待对方应答或用户输入才能结束的命令,但应答或输入迟迟不到,这就堵死了?是的,标准没为它加超时机制(不绝对),所以它就只能死等,后续再来的命令当然也就无能为力了,不过我们可以用 abort 拯救它 -- 读卡器。
2)主机某个应用程序启动,准备操作读卡器读卡片,可能此时卡片状态或读卡器状态比较混沌,也许是上一个使用读卡器的应用没有安全退出,烂摊子留下来了,但我们不能被这种小事给弄死吧,我们可以发送2对 abort 命令来把之前的命令取消掉(如果有的话),至于为什么是2对,分析分析就知道了。不过后来发现,PowerOff 命令好像也可以做到,晕!
3)还是主机应用,可能需要读取很多数据,读到几片数据时,发现不爽了,不想读了(可能是超时了),自己来个 abort, 标记下,以后到的数据我都不当成是正常的数据,为什么还有数据到呢? 不是给 abort 了吗? 因为我还不知道如何 abort 卡片正在进行的操作,如果卡片有数据传回来,我们没有办法打断,只能都收回来,结果就要看接收者如何利用这些数据,如果被 abort 了的话,可认为是无效数据而简单丢弃。
To be continued ...
USB CCID "复杂"命令拾零?的更多相关文章
- USB CCID协议和PC/SC标准
CCID是USB Chip/Smart Card Interface Devices,也就是USB芯片智能卡接口设备,是USB规范下的一种设备类型.就像HID设备一样,需要参考USB规范来写固件程序来 ...
- USB设备请求命令详解
USB设备请求命令 :bmRequestType + bRequest + wValue + wIndex + wLength 编号 值 名称 (0) 0 GET_STATUS:用来返回特定接收者 ...
- 一加手机2 进入recovery 模式无法挂载USB存储器通过命令窗口上传ROM镜像
试过3.0.3-0和3.0.3-1的recovery都无法使用“挂载USB大容量存储器”模式,这肯定让很多清掉系统(就是system分区)的小伙伴无力吐槽,因为这样子rom就无法在rec里面从电脑拷到 ...
- 切换usb口的命令
open:dd if=imx6dl-sabresd-usboc.dtb of=/dev/mmcblk0 bs=512 seek=1536 conv=fsyncclose:dd if=imx6dl-sa ...
- Linux中显示系统中USB信息的lsusb命令
来源:Linux中国 原文:https://linux.cn/article-2448-1.html 通用串行总线(USB)被设计成为连接计算机外设的标准,如键盘.鼠标.打印机.数码相机.便携式媒体 ...
- USB设备描述符和请求命令
USB设备描述符和请求命令 介绍标准的USB设备描述符和请求命令. 标准的USB描述符 当USB设备第一次连接到主机上时,要接收主机的枚举和配置,目的就是让主机知道该设备具有什么功能.是哪一类的USB ...
- USB传输协议。——Arvin
问题一:USB的传输线结构是如何的呢? 答案一:一条USB的传输线分别由地线.电源线.D+.D-四条线构成,D+和D-是差分输入线,它使用的是3.3V的电压(注意哦,与CMOS的5V电平不同),而电源 ...
- usb中的传输模式
别人总结的一个usb传输模式,保存一下 usb中的endpoint(端点)和传输模式 端点: 端点位于USB 外设内部,所有通信数据的来源或目的都基于这些端点,是一个可寻址的FIFO. 每个USB 外 ...
- Linux基础之常用命令(1)
一 linux命令的格式 1.命令 [选项] [参数] ls list 显示目录下内容 ① 命令名称:ls 命令英文原意:list 命令所在路径:/bin/ls 执行权限:所有用户 功能 ...
随机推荐
- DJANGO用户名认证一例
现在实例了用户登陆,就自带的功能.. urls.py ~~~~~~~~~~ (r'^login/$', login), (r'^logout/$',logout,{'next_page':'/logi ...
- Light OJ 1095 Arrange the Numbers(容斥)
给定n,m,k,要求在n的全排列中,前m个数字中恰好有k个位置不变,有几种方案?首先,前m个中k个不变,那就是C(m,k),然后利用容斥原理可得 ans=ΣC(m,k)*(-1)^i*C(m-k,i) ...
- 最新版AltiumDesignerSummer9下载+破解
下载地址:ed2k://|file|AltiumDesignerSummer9Build9.3.1.19182.7z|1875307483|e65d364bf987fb5dcfb81c081a1562 ...
- (转)fastcgi协议的简单实现
FastCgi不仅可以用于webserver与PHP的交互,也可用于任何两个应用之间的交互,PHPer用的比较多的应该就是用于两个子系统之间的交互. 比如A系统和B系统分部独立的部署在两台机器上,其之 ...
- CentOS 6.5配置nfs服务
CentOS 6.5配置nfs服务 网络文件系统(Network File System,NFS),一种使用于分散式文件系统的协议,由升阳公司开发,于1984年向外公布.功能是通过网络让不同的机器.不 ...
- ios相册
1, 系统图片剪裁的问题 http://www.cnblogs.com/liulunet/archive/2013/01/19/2866399.html
- iOS 按住Home键的代理
1.按住home键怎么保存程序的运行状态: 监听按home键的时候程序挂起的状态(通知),然后让其重新进入程序[[NSNotificationCenter defaultCenter] addObse ...
- nonatomic,assign,copy,retain的区别
nonatomic:非原子性访问,不加同步,多线程并发访问会提高性能.如果不加此属性,则默认是两个访问方法都为原子型事务访问. (atomic是Objc使用的一种 ...
- fragment的入门DEMO
效果图: 代码如下: 1.main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLay ...
- UVa 10256 The Great Divide,推断两个凸包是否相离
先从给出的两个点集中分别计算出两个凸包, 然后推断两个凸包是否相离. #include<cstdio> #include<vector> #include<cmath&g ...