接触式和非接触式接口之间APDU命令的区别

4

我是一名可以帮助翻译的助手。以下是你需要翻译的内容:

关于接触式和非接触式接口中APDU格式的问题,我有一个疑问。我有一个ACR122U非接触式读卡器,并学习了它的API(v2.1)。根据文档,非接触模式中的APDU格式与接触模式不同。例如,在接触式模式下SelectApplet命令如下:

Command >> 00 A4 04 00 09 [A0,00,00,03,08,00,00,10,00] 00
Response <<61 19

Command APDU >> 00 C0 00 00 19
Response APDU <<61 17 4F 06 00 00 10 00 01 00 79 0D 4F 0B A0 00 00 03 08 00 00 10 00 01 03 90 00

但在非接触模式下是:
Command APDU >> FF 00 00 00 12 d4 40 01 00 a4 04 00 09 a0 00 00 03 08 00 00 10 00 1a
Response APDU << 61 20   

Command APDU >> FF C0 00 00 20
Response APDU << d5 41 00 61 17 4f 06 00 00 10 00 01 00 79 0d 4f 0b a0 00 00 03 08 00 00 10 00 01 03 90 00 90 00

但是当我在网上搜索时,他们提到APDU格式没有区别。那我是错了吗?是否有其他方法可以发送APDU到非接触式界面?

非常感谢。

2个回答

4

您混淆了概念。我会尽力让它更加清晰。

免责声明:以下某些内容我不确定!

A) 卡类型

有两种双界面卡:

  1. 双芯片双界面。
  2. 单芯片双界面。

enter image description here 如上图所示,关于卡的类型,您可能会通过不同的接口收到相等或不同的响应,针对发送到卡的特定命令。

可用的卡通常是单芯片双界面。值得注意的是,双芯片双界面可以配置为在不同的接口上对相同命令产生相等的响应。

B) APDU处理实体

在Java卡中,接收APDU命令的应用程序可以根据接收命令的接口决定是否对特定的传入命令做出相等或不同的响应。

例如,下面代码段展示的小应用,在响应APDU命令=00 10 00 00 00时,当接口为"contact"时返回"Contact",当接口为"contactless"时返回Contactless
package testPack;

import javacard.framework.*;

public class TestApp extends Applet
{
    private static final byte[] data = { (byte)'C', (byte)'o', (byte)'n', (byte)'t', (byte)'a', (byte)'c', (byte)'t',
                                    (byte)'l', (byte)'e', (byte)'s', (byte)'s'};

    public static void install(byte[] bArray, short bOffset, byte bLength) 
    {
        new TestApp().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
    }

    public void process(APDU apdu)
    {
        if (selectingApplet())
        {
            return;
        }

        byte transportMedia = (byte) (APDU.getProtocol() & APDU.PROTOCOL_MEDIA_MASK); 
        boolean isContactless = (transportMedia == APDU.PROTOCOL_MEDIA_CONTACTLESS_TYPE_A) || 
         (transportMedia == APDU.PROTOCOL_MEDIA_CONTACTLESS_TYPE_B);

        byte[] buf = apdu.getBuffer();
        switch (buf[ISO7816.OFFSET_INS])
        {
        case (byte)0x10:
            apdu.setOutgoing();
            if (isContactless){
                apdu.setOutgoingLength((short)0x0B);
                apdu.sendBytesLong(data, (short)0, (short)0x0B);
            }else{
                apdu.setOutgoingLength((short)0x07);
                apdu.sendBytesLong(data, (short)0, (short)0x07);
            }
            break;
        default:
            ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
        }
    }

}

以下是工作原理:

Connect successful. # via the "Contact" Interface
Send: 00 A4 04 00 06 01 02 03 04 05 00 00
Recv: 90 00
Send: 00 10 00 00 00
Recv: 43 6F 6E 74 61 63 74 90 00
Disconnect successful.

Connect successful. # via the "Contactless" Interface
Send: 00 A4 04 00 06 01 02 03 04 05 00 00
Recv: 90 00
Send: 00 10 00 00 00
Recv: 43 6F 6E 74 61 63 74 6C 65 73 73 90 00

请注意,安全域和卡管理器(负责回答SELECT APDU命令的实体)通常对两个接口都有相同的响应。
C)APDU命令与伪APDU
读卡器可能支持读卡器功能的管理/控制命令。例如,您可以更改LED的颜色或延迟蜂鸣声。这些命令被认为是发送给读卡器本身而不是卡片的伪APDU命令,通常以0xFF开头(我认为读卡器制造商选择此值是因为它已在ISO7816-3中为T=0中的PPSS和T=1中的NAD定义,并因此被指定为普通应用程序命令的INVALID)。
USB智能卡读卡器基于PCSC构建的规范。您可以从here免费下载它们。其中定义了一些通常由读卡器制造商在其产品中实现的伪APDU命令。他们还可以向他们的读卡器添加一些专有的伪APDU命令,以增加与存储卡(例如SLE4432/42)或与Mifare卡工作的能力。
读卡器有一个名为“Direct Transmit”命令的伪APDU命令,用于向卡片发送有效负载。对于您提问中提到的读卡器,其直接传输命令如下:

enter image description here

我很快会在这里添加一些内容!...


感谢您的回复。从您的话中,我理解到我的错误在于将伪APDU命令发送给卡片,而我可以直接向卡片发送正常的APDU命令(例如:00 A4 04 00 09 [A0,00,00,03,08,00,00,10,00] 00)。我的理解是正确的吗? - Mohsen Gorgani
是的,只需使用接触式/非接触式接口将您的选择命令发送到卡片,无需进行任何更改。 - Ebrahim Ghasemi
1
但是,当我直接将选择应用程序发送到卡片时,PCSC会返回“8010002F”错误代码。为什么会发生这种情况?(我的读卡器是ACR122U) - Mohsen Gorgani
1
1- 你确定你的智能卡符合ISO14443标准吗?是的,我用来自宝德的IDCore 3020测试过了。 2- 当卡片进入读卡器的RF场时,读卡器会发出哔声吗?不会,无论是IDCore 3020还是Mifare Classic 1k都没有发出任何声音。 3- 你使用哪个工具发送APDU命令?我有两个工具,第一个是用Java编写的JSmartcardExplorer,第二个是SpringCard。它们都返回相同的结果。 4- 在你向卡片发送APDU时,你的操作系统中是否打开了Firefox进程?没有,它没有打开。 5- 你发送的确切APDU命令是什么?......下一条评论。 - Mohsen Gorgani
(00 A4 04 00 09 [A0,00,00,03,08,00,00,10,00] 00)在接触式模式下运行良好,并在非接触式模式下返回“8010002F”。 - Mohsen Gorgani
显示剩余2条评论

3

FF基本上是一种转义字符,通常用于向读卡器发送特定的命令。该读卡器读取专有头,然后跟随普通的APDU。APDU本身实际上只是在5字节头(以及3字节响应头)之后的部分。

对于较短(特定的)APDU,它们似乎执行一些变通方法,如果同一读卡器(在驱动程序级别上)处理接触式和非接触式协议,则这可能是一个不错的选择。


这些命令中有一些也可能是PCSC 2.01规范的一部分,但目前我没有时间去检查。 - Maarten Bodewes
感谢回复。我可以向非接触式卡发送普通的APDU吗?(例如:00 A4 04 00 09 [A0,00,00,03,08,00,00,10,00] 00) - Mohsen Gorgani
1
当你处于APDU(=应用程序)级别时,接触式和非接触式之间没有任何区别! - mictter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接