如何确定智能卡ATR面罩?

时间:2009-11-06 07:09:15

标签: smartcard

给出智能卡ATR(应答复位);是否可以确定哪些字节可以变量来为特定卡创建ATR掩码?

示例ATR可能看起来像(可以由Ludovic Rousseau's ATR parser解析):

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

有没有通用的方法来实现这一目标?或者我是否必须联系卡供应商以获取特定卡?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

这种知识的应用是什么?

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

所以最有可能的答案是你需要联系制造商或阅读卡附带的文件。

祝你好运!

答案 2 :(得分:0)

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

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

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

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;
}