我很难理解我必须使用什么协议才能与T0或T1卡通信?所以,如果我错了,请纠正我,但如果卡同时支持这两种协议,读取器实际上会自己决定使用什么协议与卡通信。
所以我现在的逻辑是:
// if ATR(T1) -> set_params(T1 structure) -> T1 APDU communication
// if ATR(T0) -> set_params(T0 structure) -> T0 APDU communication
但事实证明,这种逻辑是错误的,它意外地对大多数读者起到了作用。我刚刚发现了一个阅读器,即使卡片返回T1,它也会期望T0通信。
Q:确定使用何种协议的逻辑必须是什么?如果它背后有一个规格,你能告诉我吗?
编辑:我忘记提到我的代码在操作系统之前处于预引导环境(UEFI)。所以我没有(使用)任何API。我的代码处于字节流APDU级别,并使用UEFI UsbIo通信直接与硬件对话
感谢大家!
一切顺利,
Alex
好的,我一遍又一遍地重读规范(7816-3),可能读了5次或更多。以下是我的发现:
根据规范,不存在这样的东西:;"自动"和";默认">协议。
8.2.3接口字节TA TB TC TD
"首次提供的传输协议">定义如下。如果TD1存在,则它对第一个提供的协议T进行编码。如果TD1不存在,那么唯一的报价是T=0。
好的,继续。。。
6.3.1传输参数和协议的选择
直到完成成功的PPS交换(见9.3),之后接口设备应使用协商的传输参数值启动协商的传输协议。
在这种情况下,下一个更有趣:
否则,接口设备应已启动"首次提供的传输协议">(见8.2.3中的TD1)。当板卡仅提供一个传输协议且仅提供传输参数的默认值时,接口设备将启动。这样的卡不需要支持PPS交换。
对于卡A,这并不完全正确,因为它确实支持PPS交换!它根本不适用于Cherry阅读器。
好的,下一个关键点在6.3.1中:
注意3在可协商模式中面向卡且既不支持PPS交换也不支持"首次提供的传输协议">的接口设备可以执行热重置或停用。
因此,在Cherry阅读器的情况下,它不符合标准itshell支持第一个提供的协议中的通信,即T1。
我在智能卡手册第4版8.2协议参数选择(PPS)一章中发现了一个非常有趣的东西:
上述PPS进程不适合与具有自己的特定协议但无法执行PPS的终端更改协议。
图8.11在不使用PPS的情况下,在智能卡支持的两种传输协议之间切换的可能顺序。根据这里概述的序列,终端不必执行显式PPS,但仍然可以通过启动重置来在两个协议之间切换。。。
从技术角度来看,这种解决方案并不理想,因为设备在每次重置后都应该保持相同的行为,但对于异构的终端世界来说,它无疑是一种实用的解决方案。
但它不适用于我的卡,因为卡不会通过执行热重置来切换协议。但这可能是对读者怪异行为的回答。
通常,会告诉您该卡支持什么(以及不支持什么)。ISO 7816-3规范是寻找正确行为(即编程)的正确场所。
由八位字节CCD_ 1组成。不过,并不是所有提到的值都必须是的一部分。你必须解析所有TDi(i=1..n)的检查。请检查PC/SC lite源,那里提供了解析器。
TDi字节的最低有效位四位告诉您,支持哪些协议(四个LSB从0到15编码,0为T=0,1为T=1)。协议0..15应在中按升序排序。
特殊情况:如果TD1不存在,则T=0是唯一支持的选项。如果任何TDi字节状态T=1支持,则使用它。ELSE:T=0