智能卡读卡器 T0 T1 APDU 级通信

Posted

技术标签:

【中文标题】智能卡读卡器 T0 T1 APDU 级通信【英文标题】:Smart Card Reader T0 T1 communication on APDU level 【发布时间】:2015-05-01 19:13:06 【问题描述】:

我很难理解我必须使用什么协议来与卡 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 通信直接与硬件对话。

谢谢大家!

一切顺利,

亚历克斯

【问题讨论】:

相关规范是ISO/IEC 7816 part 3。要进行T=0T=1 通信,卡和读卡器都必须支持它。现在大多数卡片只支持T=1,大多数读卡器都支持这两种协议。 看看这个问答+cmets很有用:***.com/questions/28855930/… 谢谢伙计。那篇文章解释了一些问题。所以我的猜测是,这正是肌肉代码如此庞大和垃圾的原因,它有一个硬编码的支持阅读器列表!? 欢迎您。不幸的是,不知道什么是肌肉代码。我在“ludovic rousseau”网站上看到了很多 T=0/T=1 兼容的智能卡读卡器。如果您认为有用,请在 Google 上搜索他的名字。 :) 我急切地等待这个问题下面的答案。 让我更正一点:如果存在 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。 【参考方案1】:

好的,我一遍又一遍地重新阅读规范 (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 阅读器,它不遵循标准!shell支持在第一个提供的协议(即 T1)中进行通信。

我在SmartCard Handbook, 4th Edition 8.2 协议参数选择 (PPS) 章节中发现了一个非常有趣的东西:

上述PPS流程不适用于有自己特定协议但不能执行PPS的终端更改协议。

图 8.11 在不使用 PPS 的情况下在智能卡支持的两种传输协议之间切换的可能顺序。使用此处概述的顺序,终端不必执行显式 PPS,但仍可以通过启动重置在两种协议之间切换...

...从技术角度来看,这种解决方案并不理想,因为设备在每次重置后都应该始终保持相同的行为,但对于异构终端世界来说,它无疑是一个实用的解决方案。

它不适用于我的卡,因为卡不会通过执行热重置来切换协议。但这可能是对读者怪异行为的回应。

【讨论】:

【参考方案2】:

一般来说,ATR 会告诉您显卡支持什么(以及不支持什么)。 ISO 7816-3 规范是寻找正确行为(即编程)的正确位置。

ATR 由八位字节 TS|T0|TA1|TB1|TC1|TD1|...|historical bytes|TCK 组成。不过,并非所有提到的值都必须是 ATR 的一部分。您必须解析所有 TDi (i=1..n) 的 ATR 检查。请检查 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

【讨论】:

以上是关于智能卡读卡器 T0 T1 APDU 级通信的主要内容,如果未能解决你的问题,请参考以下文章

扩展 APDU 和 T=0/1 通信协议

使用 java smartcardio 函数发送 APDU 命令以将数据写入智能卡读卡器

从智能卡发送/接收数据

APDU 命令获取智能卡的序列号

智能卡对 APDU 的响应中数据字段的大小是不是有任何指示?

通过 USB 连接的 APDU