如何将 ATR 发送到卡
Posted
技术标签:
【中文标题】如何将 ATR 发送到卡【英文标题】:How to send ATR to card 【发布时间】:2014-04-25 13:58:13 【问题描述】:我有一些卡,想从中获取 ATR(使用某些 SDK 中的方法)。 实现如下所示:
unsigned char ATR[128]=0;
int len=33;
int maxlen=33;
ret = sd7816_ATR(0,1,ATR,len,maxlen,1);
sd7816_ATR
函数的第一个、第二个和最后一个参数应该是这样的。
我尝试将长度字段更改为不同的值,包括 0 但没有帮助。
我担心的是我发送的 ATR 字符串 一开始是空的, 我期待 调用完成后要在其中写入的内容(实际上返回成功)。
但调用后 ATR 仍然是空的..这里可能出了什么问题?
(我想知道卡是 ISO/IEC 14443 还是 ISO/IEC 7816 类型)。
【问题讨论】:
返回值ret
是否向您显示了什么?也许该功能由于某种原因没有成功......
@aardvarkk: 是的,就像我说的它返回成功
抱歉,显然没有仔细阅读。
如果这是 14443 B 型卡则没有 ATS(通常翻译为 ATR)
@owlstead:这实际上是我的问题:我不知道这是什么类型的卡?
【参考方案1】:
您正在尝试接收针对特定于 ISO/IEC 7816-3 联系人卡片的命令的 ATR。在这种特殊情况下,这是从(SIM 形式)SAM 读卡器请求的。但是,您正在尝试读取基于非接触式的阅读器。
现在非接触式卡没有 ATR。有些卡确实有 ATS(即 ISO/IEC 14443 Type A 卡),但应该通过类似的 14443 SELECT 命令请求。一些卡,特别是 B 类卡,包含一个 EF.ATR 以弥补 ATR 中的(空间)不足。尽管如此,ATR/ATS 识别卡的功能有限。
ISO/IEC 7816 由几个部分组成:第 1 到第 3 部分描述接触卡,第 4 部分及更高版本描述处理器卡的应用程序级 APDU 命令和文件结构。如果您的非接触式卡实现 ISO/IEC 7816-4,那么您通常也可以直接使用 PCSC 接口向卡发送和接收 APDU。
一般而言,阅读器仅适用于接触式或非接触式。如果您的阅读器同时包含接触式和非接触式操作,那么通常它们将在操作系统中显示为两个不同的阅读器。所以一般来说,如果你认识读卡器,你就知道这张卡是接触卡还是非接触卡。
操作系统可能无法将 SAM 插槽识别为读取器 - 您可能只能使用低级接口访问它们。它们主要用作终端/检查系统/接口设备或读取卡的系统名称的密钥的安全存储。
【讨论】:
基本上我们在 cmets 中讨论的所有内容都放在了几段中...... 啊,当然,谢谢。就像我在想象中所说的那样,我正在考虑首先使用上面的代码来确定我是否拥有 7816 型或 14443 型卡。但现在我想我有 144443 卡,因为我设法向它发送了一些 apdu 并得到响应 实际上,两者兼而有之:) 您有一张非接触式 14443 卡 (T=CL),它能够处理 ISO 7816-4(定义 APDU)。您没有的是 ISO 7816-3 接触(T=0 或 T=1)卡。最好将 ISO 7816-X 视为所有单独的标准,否则会产生混淆。顺便说一句,许多 ISO/IEC 标准都是如此。以上是关于如何将 ATR 发送到卡的主要内容,如果未能解决你的问题,请参考以下文章
FinTS 2.2 (HBCI 2.2) VERIFY 命令返回 69 85
使用 Smart Card IO 时无法检索第二张卡的 ATR