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

最佳答案

您正在尝试接收针对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或从卡接收APDU。

通常,读者仅适用于接触式或非接触式。如果您的阅读器既包含接触式操作又包含非接触式操作,则通常它们将在操作系统中显示为两个不同的阅读器。因此,通常,如果您了解读卡器,就知道该卡是接触式卡还是非接触式卡。

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

关于c++ - 如何将ATR发送到卡,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23295265/

10-11 23:01