如何将ATR发送到卡

时间:2014-04-25 13:58:14

标签: c++ smartcard

我有一张卡,想从中获取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类型)。

1 个答案:

答案 0 :(得分:0)

您正在尝试接收特定于ISO / IEC 7816-3联系人卡片的命令的ATR。在这种特殊情况下,这是从(SIM形式)SAM卡读卡器请求的。但是,您正试图读出非接触式阅读器。

现在非接触式卡没有ATR。有些卡确实有ATS(即ISO / IEC 14443 A型卡),但应由类似的14443 SELECT命令请求。一些卡,特别是B型卡,包含EF.ATR以弥补ATR的缺失(空间内)。尽管如此,ATR / ATS仅具有识别卡片的有限功能。

ISO / IEC 7816由若干部分组成:第1至3部分描述了联系卡,4及更高版本描述了应用程序级APDU命令和处理器卡的文件结构。如果您的非接触式卡实现了ISO / IEC 7816-4,那么您通常也可以直接使用PCSC接口向/从卡发送和接收APDU。

一般来说,读者只能用于联系或非接触式。如果您的阅读器包含接触式和非接触式操作,那么通常它们将在操作系统中显示为两个不同的阅读器。所以一般来说,如果你认识读者,你就知道这张卡是联系卡还是非接触式卡。

操作系统可能无法将SAM插槽标识为读取器 - 您可能只能使用低级别接口访问它们。它们主要用作来自终端/检查系统/接口设备的密钥的安全存储,或者用于读出卡的系统名称。