如何确定智能卡 ATR 掩码?

Posted

技术标签:

【中文标题】如何确定智能卡 ATR 掩码?【英文标题】:How can I determine a Smart Card ATR mask? 【发布时间】:2009-11-06 07:09:14 【问题描述】:

给定一个智能卡 ATR (Answer-To-Reset);是否可以确定哪些字节可以为特定卡创建 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

有没有通用的方法来完成这个?还是我必须联系特定卡的卡供应商?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

这些知识有什么应用?

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

所以答案很可能是您需要联系制造商或阅读卡随附的文档。

祝你好运!

【讨论】:

【参考方案3】:

我通过 ATR 中的 TA 位找到掩码类型。 TA 在 ATR 的接口字节中为 0 位。然后我从卡的底部/结束地址找到掩码的制造商 8 个字节。我在 ATR 之后执行以下 APDU 命令:

CommandApdu commandApdu = new CommandApdu(0xBC, 0xC0, 0x00, 0x00, data, 0x08);

然后我验证第 2 位和第 3 位(bits = 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;

【讨论】:

以上是关于如何确定智能卡 ATR 掩码?的主要内容,如果未能解决你的问题,请参考以下文章

深入理解7816---关于ATR

在智能卡上上传 .cap 文件?

如何读写未知的智能卡?

如何检索基本的智能卡信息

getATR() 不会在 javax.smartcardio 中重置智能卡

如何从 HID omnikey 获取智能卡的 TAR