从 ATR 获取卡片类型

Get card type from ATR

当我用 springcard reader 扫描我的卡时,我需要了解这张卡是否属于以下类型之一:CTS 或 CD_97 或 ISO_A 或 ISO_B 或FRD 我怎样才能从 ATR 获得这些类型?

这些是一些 ATR 示例,我得到:

Navigo: 3B 88 80 01 00 00 00 00 00 71 81 00 F9

泰西里: 3B 8F 80 01 80 5A 0A 01 01 20 03 11 10 1D 86 BC 82 90 00 C9

大浦: 3B 8F 80 01 80 5A 0A 01 02 20 03 11 03 53 52 A2 82 90 00 5D

城市卡: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 02 00 00 00 00 69

是否有关于我们如何从 ATR 中获取这些类型的详细说明?

我正在使用SpringCard读卡:http://files.springcard.com/pub/pmd841p-fa.pdf

我在第 27 和 28 页找到了部分解决方案 http://files.springcard.com/pub/%5bpma13205-bd%5d_Smart_Readers_and_RFID_Scanners_Template_System.pdf

我还需要finc命令来获取OPT REGISTER

关于 "OPT register" -- 据我了解,您设置此寄存器来控制 SpringCard 的模板系统(可选)将卡片系列编码到其输出中的方式.我敢打赌你根本不想使用他们的模板系统...


要获取有关通用卡 technology/family 的信息,请使用以下 GET DATA 命令获取 PIX.SS 和 PIX.NN(请参阅第 2.2.1 章):

FF CA F1 00 00

响应的第一个字节是PIX.SS(参见第 5.1.4 章):

0x00 -> No information given
0x01 -> ISO 14443 A, level 1
0x02 -> ISO 14443 A, level 2
0x03 -> ISO 14443 A, level 3 or 4 (and Mifare)
0x05 -> ISO 14443 B, level 1
0x06 -> ISO 14443 B, level 2
0x07 -> ISO 14443 B, level 3 or 4
0x09 -> ICODE 1
0x0B -> ISO 15693

下面两个字节包含PIX.NN(见5.1.5章节):

0x0001 -> NXP Mifare Standard 1k
0x0002 -> NXP Mifare Standard 4k
0x0003 -> NXP Mifare UltraLight + Other Type 2 NFC Tags with a capacity <= 64 bytes
0x0006 -> ST MicroElectronics SR176
0x0007 -> ST MicroElectronics SRI4K, SRIX4K, SRIX512, SRI512, SRT512
0x000A -> Atmel AT88SC0808CRF
0x000B -> Atmel AT88SC1616CRF
0x000C -> Atmel AT88SC3216CRF
0x000D -> Atmel AT88SC6416CRF
0x0012 -> Texas Intruments TAG IT
0x0013 -> ST MicroElectronics LRI512
0x0014 -> NXP ICODE SLI
0x0016 -> NXP ICODE1
0x0021 -> ST MicroElectronics LRI64
0x0024 -> ST MicroElectronics LR12
0x0025 -> ST MicroElectronics LRI128
0x0026 -> NXP Mifare Mini
0x002F -> Innovision Jewel
0x0030 -> Innovision Topaz (NFC Forum type 1 tag)
0x0034 -> Atmel AT88RF04C
0x0035 -> NXP ICODE SL2
0x003A -> NXP Mifare UltraLight C + Other Type 2 NFC Tags with a capacity > 64 bytes
0xFFA0 -> Generic/unknown 14443-A card
0xFFA1 -> Kovio RF barcode
0xFFB0 -> Generic/unknown 14443-B card
0xFFB1 -> ASK CTS 256B
0xFFB2 -> ASK CTS 512B
0xFFB3 -> Pre-standard ST MicroElectronics SRI 4K
0xFFB4 -> Pre-standard ST MicroElectronics SRI X512
0xFFB5 -> Pre-standard ST MicroElectronics SRI 512
0xFFB6 -> Pre-standard ST MicroElectronics SRT 512
0xFFB7 -> Inside Contactless PICOTAG/PICOPASS
0xFFB8 -> Generic Atmel AT88SC / AT88RF card
0xFFC0 -> Calypso card using the Innovatron protocol
0xFFD0 -> Generic ISO 15693 from unknown manufacturer
0xFFD1 -> Generic ISO 15693 from EMMarin (or Legic)
0xFFD2 -> Generic ISO 15693 from ST MicroElectronics, block number on 8 bits
0xFFD3 -> Generic ISO 15693 from ST MicroElectronics, block number on 16 bits
0xFFFF -> Virtual card (test only)

请注意以下有关PIX.NN值以0xFF(SpringCard专有代码)开头的注意事项:

The cards in this list are not referenced by PC/SC specification at the date of writing. In case they are added to the specification, the future firmware versions will have to use the new value. It is therefore advised not to check those values in the applications, as they are likely to be removed in the future.

关于 PIX.NN 可用性的注释:

Note: PIX.NN is specified for memory cards only. Even if the GET DATA instruction allows to retrieve PIX.NN even for micro-processor based cards (smartcards), the returned value is unspecified and shall not be used to identify the card.

免责声明:我无法再使用 SpringCard reader,所以我无法用我的卡片对其进行测试,但考虑到 the documentation 它应该以这种方式工作。


我过去处理过一个非常相似的问题(处理不同的卡片,有些提到 ),最有效的方法是(考虑到我的 "mix" 张卡片):

  • 使用ATR值创建"candidate list"(很多时候ATR值导致单卡方案候选)

  • 如果候选人比较多可以考虑通过以下方式确定其中之一:

    • 技术特定 "directory service"(例如 MAD、获取应用程序 ID、PSE/PPSE、PTSE...)

    • 试错应用程序选择(如果候选列表非常短,这可能比使用目录服务更快)

    • (作为最少的手段)专有卡方案检测

此方法假设您知道旧卡的所有可能的 ATR 值——否则您将不得不 replace/combine 使用上述卡 technology/family 检测。


注意:评论中提到的 pcsc-tools ATR 列表可用 here and here(我不确定哪个是规范的)

祝你好运!

你可以在这里找到 spring 卡片答案,抱歉,他们用法语回答了我,所以如果有什么不清楚的,请在你的评论中提出:

ATR

1-首先发送FF CA FA 00: - 你至少有14个字节,并且字节7-11:A0 00 00 03 06? -> 如果是,那么你在有线逻辑卡上,你必须检索 PIX.SS 和 PIX.NN(响应的字节 12-13-14)并根据以下内容找到卡的技术第 4.1.4 和 4.1.5 段。技术检测到此为止。您可以发送NUM_PROTOCOL中描述的命令来查找卡的协议号。 -> 如果不是,那么您使用的是 "vraie" 智能卡。发送NUM_PROTOCOL

中描述的命令

NUM_PROTOCOL

2-发送FF CA 00 00,分析响应字节数: - 7 或 11 字节的响应:卡必须在 ISO A 中,响应是卡的 UID。如果您不需要更多细节,算法可以到此为止 - 4 个字节的响应:这是协议号。 2个选项: * 如果您在上一步中检测到它是硬连线逻辑板,那么如果您不需要更多细节,算法可以停在那里 * 如果你在智能卡上,那么你必须发送命令 COMPLETE_ID - 回答不同的字节数:我们必须在有线逻辑(或存储卡)上,其技术已经确定。响应对应于协议号。如果您不需要更多细节,算法可以到此为止

COMPLETE_ID

3- 我们只在卡是带有 "vraie" 芯片的卡时到达这里(因此:不是存储卡,也不是有线逻辑卡) 发送 FF CA F0 00 并解析响应中的字节数: -11或12字节:必须是ISO B - 获取的值为ATQB - 下一步获取的协议号/识别卡 - 不同字节数的结果:检查这是否对应于 3 个字节,后跟从上一个命令获得的协议号 a) 如果是,则为 ISO A - 前两个字节为 ATQA,第三个为 SAK(其余为 UID) b) 如果没有,则表示已收到 REPGEN,卡会根据 INNOVATRON 协议做出响应(PUPI 已在上一步中获得)。

有了这个,正常情况下你应该能认出你所有的牌了。