【问题标题】:Smart Card Reader T0 T1 communication on APDU level智能卡读卡器 T0 T1 APDU 级通信
【发布时间】: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很有用:stackoverflow.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。

标签: smartcard apdu smartcard-reader


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-28
      • 2017-04-19
      • 2023-02-22
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多