Android/NFC:从智能卡(EMV)读取ATR

3
我有一张EMV智能卡,想要通过我的手机与之通信。 通信本身通过IsoDep没有问题,但我不知道如何获取ATR。 据我所知,意图应该包含ATR,请问有人知道我需要的代码吗? 如果不可能的话,也许有人知道如何通过像SELECT这样的命令进行热重置,其中答案是ATR。
2个回答

4

非接触式卡片没有ATR。但你可能会对ATS(选择应答)的历史字节感兴趣。你可以通过调用getHistoricalBytes()来检索这些字节:

Tag tag = (Tag) intent.getParcelableExtra(NfcAdapter.EXTRA_TAG));
IsoDep iso = IsoDep.get(tag);
NfcA nfcA = NfcA.get(tag);
if (nfcA == null || iso == null)
   return; // not an IsoDep+NfcA tag
byte[] histBytes = iso.getHistoricalBytes();
...

请记住,这仅适用于ISO 14443 Type A标签(NfcA)。对于Type B标签(NfcB),您可能需要调查getHiLayerResponse()

ATR有什么目的?它与高层响应有什么关系?它是否允许我从卡中访问更多数据? - Scott
这在大多数设备上都很好用,除了LG - 到目前为止我还没有找到解决方案。 - Nick Wright

-1

非接触式卡片确实会返回ATR。然而,您无法从当前的Android NFC API中获取ATR。Android NFC API仅返回ATR的历史字节。

非接触式卡片返回ATR的原因: 请注意,ATR是7816复位响应。读卡器(在这种情况下是NFC手机)使用ISO 7816(T = CL)APDU交换与智能卡通信,该交换通过非接触式接口ISO 14443-4传输。由于在此情况下存在ISO 7816,因此您将获得ATR。


2
非接触式卡片不提供真正的ATR(复位响应),因为它们不经过ISO 7816-3复位过程。(尽管卡片可能包含一个EF.ATR文件,其中包含通常包含在ATR中的数据。)T=CL(基本上是* ISO 14443-4 *中定义的传输协议)具有用于A型的ATS(选择响应)(它与ATR相似,因为它还包含历史字节)和用于B型的ATTRIB响应(这就是getHiLayerResponse()的数据来源)。 - Michael Roland
我可以使用SCM读卡器从A和B卡中获取非接触式卡片的ATR。正如您所指出的那样,它可能在传统意义上并不是“真实的”。然而,它确实返回了ATR。 - Trung
3
这张卡片并没有返回那个ATR。相反,你看到的是由PC/SC驱动程序生成的伪ATR,它将智能卡读卡器连接到应用程序。这个伪ATR(不是由卡片生成或“返回”)被用来传递有关非接触式协议的(否则无法访问的)信息到应用层。由于Android不通过PC/SC访问通过NFC的智能卡,因此这里也没有涉及ATR。 - Michael Roland
如果非接触式卡片没有返回ATR并且伪ATR用于传递有关非接触式协议的信息,那么我可以获取什么信息呢? 根据我在ISO 7816中所读到的,如果卡片支持扩展长度,则应将其存储在ATR中,但如果卡片实际上未返回ATR,则该如何获取此类信息。 - neo
我有两张卡(类型A和B)。使用类型A,我可以通过调用byte[] histBytes = iso.getHistoricalBytes()来获取历史字节。我使用读卡器进行了检查,这些历史字节是正确的。但是对于类型B,iso.getHiLayerResponse()返回为空,尽管读卡器确实返回了该卡的ATR。您对此有任何想法吗? - neo
@neo 请提出一个新问题,而不是劫持这个评论线程。 - Michael Roland

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