给定智能卡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
有没有什么通用的方法来实现这一点?或者我必须联系特定卡的卡供应商?
发布于 2009-11-06 22:05:19
这些知识的应用是什么?
除了不同卡特征中的可变字节(例如,如果知道给定的卡有不同的版本,具有不同的协议功能),或者如果你知道卡有不同的版本,我不相信有这样的标准。有时您可以从历史字节中找到关于卡的信息,例如爱沙尼亚ASCII卡有不同的供应商,但所有卡的历史字节在eID中都是"EstEID v1.0“。
因此,答案很可能是您需要联系制造商或阅读卡附带的文档。
祝好运!
发布于 2009-12-10 10:49:19
这取决于目标。如果您目标是能够在所有可能的变体中识别确切的卡类型,则ATR掩码不可能为您做到这一点。如果你有一个想要关联的通用卡“家族”,你可以试着屏蔽历史字节。如果您正在设置Calais注册表设置,我建议不要屏蔽任何内容,因为您可能会阻止另一个CSP。除了ATR之外,请查看最新的Microsoft Mini驱动程序规范以了解识别卡的过程。
发布于 2019-09-22 15:28:47
我通过ATR中的TA位找到掩码的类型。在ATR的接口字节中,TA为0位。然后,我从卡片的底部/结束地址的8个字节中找到掩码的制造商。我在ATR之后执行下面的APDU命令:
CommandApdu commandApdu =新数据(0xBC,0xC0,0x00,0x00,CommandApdu,0x08);
然后我验证第二位和第三位(位= 0,1,admax=2,admax1=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;
}
https://stackoverflow.com/questions/1685918
复制相似问题