Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Smartcard 如何确定智能卡ATR掩码?_Smartcard - Fatal编程技术网

Smartcard 如何确定智能卡ATR掩码?

Smartcard 如何确定智能卡ATR掩码?,smartcard,Smartcard,给出智能卡ATR(回答重置);是否可以确定哪些字节可以可变以创建特定卡的ATR掩码 示例ATR可能如下所示(可通过以下方式解析): 有没有通用的方法来实现这一点?或者我必须联系特定卡的卡供应商吗?这些知识的应用是什么 我不相信这有一个标准,除了不同卡特征中的可变字节(如果已知给定卡有不同版本,例如具有不同协议功能),或者如果您知道该卡有不同的版本。有时,您可以从历史字节中找到有关卡的信息,例如爱沙尼亚eID卡有不同的供应商,但所有卡的历史字节都是ASCII格式的“EstEID v1.0” 因此,

给出智能卡ATR(回答重置);是否可以确定哪些字节可以可变以创建特定卡的ATR掩码

示例ATR可能如下所示(可通过以下方式解析):


有没有通用的方法来实现这一点?或者我必须联系特定卡的卡供应商吗?

这些知识的应用是什么

我不相信这有一个标准,除了不同卡特征中的可变字节(如果已知给定卡有不同版本,例如具有不同协议功能),或者如果您知道该卡有不同的版本。有时,您可以从历史字节中找到有关卡的信息,例如爱沙尼亚eID卡有不同的供应商,但所有卡的历史字节都是ASCII格式的“EstEID v1.0”

因此,答案很可能是您需要联系制造商或阅读卡片附带的文档


祝你好运

这取决于目标。如果您的目标是能够在所有可能的变体中识别准确的卡类型,那么ATR掩码将无法为您做到这一点。如果您有一个要关联的通用卡“系列”,您可以尝试屏蔽历史字节。如果您正在设置Calais注册表设置,我建议不要屏蔽任何内容,因为您可能会阻止另一个CSP。除了ATR,请查看最新的Microsoft Mini驱动程序规范,以了解识别卡的过程。

我在ATR中通过TA位找到掩码的类型。TA是ATR接口字节中的0位。然后,我从卡的底部/末端地址按8字节查找掩码的制造商。我在ATR后执行以下APDU cmommand:

CommandApdu CommandApdu=新的CommandApdu(0xBC,0xC0,0x00,0x00,数据,0x08)

然后我验证第2位和第3位(位=0,1,admax[0]=2,admax[1]=3,4,5,6,7):

3B FF 18 00 FF 81 31 FE 45 65 63 11 05 40 02 50 00 10 55 10 03 03 05 00 43
byte[] result8Bytes = responseApdu.getData()[2];
byte[] adMax = new byte[2];
adMax[0]=result8Bytes[2];
adMax[1]=result8Bytes[3];

if (ATR_TA == 0x0E) { //SCOT
    if (adMax[0] == 0x21 && adMax[1] == 0xA0) `
       typeMasque = SCOT_400_M9V1;`
    else if (adMax[0] == 0x21 && (adMax[1] == 0x19 || adMax[1] == 0x88))
       typeMasque = SCOT_400_MOT; 
    else if (adMax[0] == 0x88 && adMax[1] == 0x00)
       typeMasque = SCOT_400_STM;
    else if (adMax[0] == 0x19 && adMax[1] == 0x00)
       typeMasque = SCOT_300;
    else 
       typeMasque = SCOT_INCONNU;
}

if (ATR_TA == 0x0D) //IGEA
    if (adMax[0] == 0x20 && adMax[1] == 0xA0)
        typeMasque = IGEA_340_AMTEL;
    else if (adMax[0] == 0x21 && (adMax[1] == 0x20 || adMax[1] == 0x98))
        typeMasque = IGEA_440_BIS;
    else if (adMax[0] == 0x21 && adMax[1] == 0x20)
        typeMasque = IGEA_440_STM;
    else
        typeMasque = IGEA_INCONNU;
}