智能卡阅读器 T0 T1 应用数据传输层通讯

10

我很困惑应该使用哪种协议与T0或T1卡通信?那么,如果卡支持两种协议,读卡器实际上会自行决定使用哪种协议与卡通信,如果我有误,请纠正我。

因此,我的逻辑现在是:

// if ATR(T1) -> set_params(T1 structure) -> T1 APDU communication
// if ATR(T0) -> set_params(T0 structure) -> T0 APDU communication

但事实证明,这种逻辑是错误的,尽管它意外地适用于大多数读者。我刚刚发现有读者即使卡片的ATR返回T1也期望使用T0通信。

问:确定使用哪种协议必须遵循什么逻辑?如果有相关规范,请指出来。

编辑:我忘记提到我的代码位于操作系统之前的预引导环境(UEFI)中。因此,我没有任何API可供使用。我的代码处于字节流APDU级别,并直接使用UEFI UsbIo通信与硬件进行通信。

谢谢大家!

祝您一切顺利,

Alex


1
相关规范为_ISO/IEC 7816第3部分_。要进行T=0T=1通信,卡片和读卡器都必须支持它。现今大多数卡片仅支持T=1,而大多数读卡器则支持两种协议。 - Ebrahim Ghasemi
谢谢,那篇帖子解释了一些问题。所以我猜这就是肌肉代码如此巨大且笨重的原因,并且它有一个硬编码支持的读者列表!? - Alex D
欢迎。很遗憾我不知道什么是肌肉代码。我在“Ludovic Rousseau”网站上看到了一个很棒的T=0/T=1兼容智能卡读卡器列表。如果你认为它有用,可以通过谷歌搜索他的名字。 :) 我急切地等待着这个问题下面的答案。 - Ebrahim Ghasemi
哦不!他回复电子邮件非常友好 :) 可能他很忙。 - Ebrahim Ghasemi
1
让我纠正一个观点:如果存在ATR(TD1)(即设置为1),这意味着T = 0是默认协议(而不是T = 1)。请参阅同一规范(ISO / IEC 7816-3)的第8.2.3节,即如果存在TD1,TD2等,则编码类型T(协议类型)应按升序排列。如果存在,则T = 0应该是第一个,T = 15应该是最后一个。这意味着在您的情况下,由于存在TD1(即设置为1),因此T = 0是“首选传输协议”,并且由于您的卡不支持PPS握手(且TA2 = 0),因此它仅支持一种协议,即在此情况下为T = 0。 - Bhanu
显示剩余7条评论
2个回答

4

好的,我再次阅读了规范(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读卡器的情况下,它没有遵循标准!它应该支持T1作为首选协议进行通信。

我在SmartCard Handbook, 4th Edition的8.2 PROTOCOL PARAMETER SELECTION(PPS)章节中发现了非常有趣的内容:

上述PPS过程不适用于使用自己特定协议但无法执行PPS的终端更改协议的情况。

图8.11:在不使用PPS的情况下切换智能卡支持的两种传输协议的可能序列。使用此处概述的序列,终端无需执行显式PPS,但仍然可以通过启动复位来在两个协议之间切换...

...从技术角度来看,这种解决方案并不理想,因为每次重置后设备应该始终表现相同,但对于异构终端世界来说,这肯定是一种实用的解决方案。

但是这并不适用于我的卡,因为卡不通过执行热复位来切换协议。但它可能是读卡器出现奇怪行为的答案。


1
一般来说,ATR告诉您卡支持什么(以及不支持什么)。正确的行为即编程可以在ISO 7816-3规范中找到。
ATR由八位组成,格式为TS|T0|TA1|TB1|TC1|TD1|...|历史字节|TCK。但并非所有提到的值都必须是ATR的一部分。您需要解析ATR,检查所有TDi(i = 1..n)。请查看PC / SC-lite源代码,其中提供了ATR解析器。
TDi字节的最低有效四位告诉您支持哪些协议(四个LSB编码从0到15,0表示T = 0,1表示T = 1)。协议0..15应按升序排序在ATR中。
特殊情况:如果TD1不存在,则只支持T = 0选项。如果任何TDi字节声明支持T = 1,则使用它。否则:T = 0。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接