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 执行权限:所有用户 功能 ...
随机推荐
- CSS3----border-sizing
#wrapper input[type="text"], #wrapper input[type="password"] { /* display: flex; ...
- DJANGO的HTTPRESPONSE流式输出
在项目当中遇到的问题,网上有样例代码,但都不行,后来,发现在了1.5版本之后,新的STREAMHTTPRESPONSE对象, 搞定. from django.http import HttpRespo ...
- WPF利用Image实现图片按钮
之前有一篇文章也是采用了Image实现的图片按钮,不过时间太久远了,忘记了地址.好吧,这里我进行了进一步的改进,原来的文章中需要设置4张图片,分别为可用时,鼠标悬浮时,按钮按下时,按钮不可用时的图片, ...
- UESTC_方老师和农场 2015 UESTC Training for Graph Theory<Problem L>
L - 方老师和农场 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- Increasing/ Decreasing Stack
对于此类问题: 对于元素nums[i],找出往左/右走第一个比它小/大的数字 我们常常用递增栈/递减栈实现. 递增栈实现第一个比它小 递减栈实现第一个比它大 Example: 2 1 5 6 2 3 ...
- PHP 后台程序配置config文件,及form表单上传文件
一,配置config文件 1获取config.php文件数组, 2获取form 表单提交的值 3保存更新config.php文件,代码如下: $color=$_POST['color']; $back ...
- xmind教程
xmind是什么东西我不多说.作为一个程序员,我通常用来编写一个文档.比如某个模块的设计或者流程图. 一开始我是以word画图的方式来用xmind的,即想要什么图形,就去插入里面找.结果碰了一鼻子灰, ...
- UIScrollView上面放一个UIScrollView或者UITableView拖动时候 View出现一闪一闪解决办法
在项目中发现一个问题: 创建一个UIScrollView 上面放一个scrollView或者TableView,拖动scrollview或TableView 画面出现一闪一闪的情况. 解决办法设置一下 ...
- C#实现下载功能,可用于软件自动更新
以前在百度写的文档,转移到此处 软件截图: 代码下载: http://twzy.ys168.com/ 在代码下载文件夹中 //代码: using System; using System.Comp ...
- Git 上传本地命令
1.首先建立一个文件夹用以测试 2.在test中写入一个main.c的文件 其内容如下: 3.然后就建立一个git仓库了 4.然后就是把内容加进去了,上传上去 5.然后我们看下git log的信息 6 ...