【发布时间】: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=0或T=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