【问题标题】:difference between APDU command between contact and contactless Interface接触式和非接触式接口之间的APDU命令之间的区别
【发布时间】:2016-06-29 13:45:18
【问题描述】:

我对接触式和非接触式接口中的 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 发送到非接触式接口吗?

非常感谢。

【问题讨论】:

    标签: smartcard javacard contactless-smartcard


    【解决方案1】:

    FF 基本上是一个转义,通常用于向读卡器发送特定的命令。该阅读器读取专有标头,后面紧跟普通的 APDU。 APDU 本身确实只是 5 字节标头之后(以及 3 字节响应标头之后)的部分。对于较短(特定)的 APDU,他们似乎执行了一些解决方法。

    如果同一个阅读器(在驱动程序级别)处理接触式和非接触式协议,这可能是一个不错的选择。

    【讨论】:

    • 其中一些命令也可能是 PCSC 2.01 规范的一部分,但目前我没有时间检查。
    • 感谢您的回复。我可以将普通的 APDU 发送到非接触式卡吗? (例如:00 A4 04 00 09 [A0,00,00,03,08,00,00,10,00] 00)
    • 是的,当您处于 APDU(=应用程序)级别时,接触式和非接触式完全没有区别!
    【解决方案2】:

    您正在混合概念。我会尽量说清楚一点。

    声明:我不确定以下几行!

    A) 卡片类型

    双接口卡有两种:

    1. 双接口双芯片。
    2. 双接口单芯片。

    正如您在上面看到的,关于卡的类型,对于通过不同接口发送到卡的特定命令,您可能会收到相同或不同的响应。

    可用的卡通常是双接口单芯片。还值得注意的是,双芯片双接口可以配置为对不同接口上的相同命令具有相同响应。

    B) APDU 处理程序实体

    在 Java Cards 中,接收 APDU 命令的小程序可以根据接收命令的接口决定是否响应特定的传入命令。

    例如下面sn-p所示的小程序,响应APDU Command = 00 10 00 00 00,接口为contact时返回“Contact”,接口为非接触时返回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 的颜色,或延迟哔声。这些应该发送给读卡器本身而不是卡的命令被命名为 Pseudo-APDU 命令,通常以0xFF 开头(我认为读卡器制造商选择这个值是因为它已经在 ISO7816-3 中定义为T=0 中的 PPSS 和 T=1 中的 NAD,因此对于正常的小程序命令指示为无效)。

    USB智能卡读卡器基于它构建的规格是PCSC。您可以从here 免费下载它们。定义了一些伪 APDU 命令,通常阅读器制造商在其产品中实现它们。他们还可以向他们的阅读器添加一些专有的伪 APDU 命令,以增加使用存储卡(例如 SLE4432/42)或使用 Mifare 卡的能力。

    读卡器有一个名为 Direct Transmint 命令的伪 APDU 命令,它用于向卡发送有效载荷。对于您的读者,正如您在问题中提到的,直接传输命令如下:

    我很快就会在这里添加一些东西! ...

    【讨论】:

    • 感谢您的回复。我从你的话中解释了:我错误地将我的 APDU 命令从伪 APDU 发送到卡,我可以发送正常的 APDU(例如:00 A4 04 00 09 [A0,00,00,03,08,00,00,10 ,00] 00) 直接刷卡。我的解释正确吗?
    • 是的,只需将您的选择命令发送到卡,使用接触式/非接触式界面,无需任何更改。
    • 但是当我将选择小程序直接发送到卡时,PCSC 返回“8010002F”错误代码。为什么会这样?(我的读者是 ACR 122 U)。
    • 您确定您的智能卡与 ISO14443 兼容吗?(当卡进入读卡器射频场时,读卡器是否会发出哔哔声?)您使用的是哪个操作系统?您使用哪个工具来发送 APDU 命令?当您将 APDU 发送到卡时,您的操作系统中是否打开了 Firefox 进程? (如果是这样,请在任务管理器中将其杀死并重试)。您发送的确切 APDU 命令是什么?
    • 1- 您确定您的智能卡与 ISO14443 兼容吗?是的,我通过 gemalto 的 IDCore 3020 进行了测试。 2-当卡进入读卡器射频场时,读卡器会发出哔哔声吗?不,它不会发出任何哔声。 IDCore 3020 和 Mifare classic 1k 都没有。 3-您使用哪个工具来发送 APDU 命令?我有两个工具,第一个是由 java 编写的 JSmartcardExplorer,第二个是 SpringCard。它们都返回相同的结果。 4- 当您将 APDU 发送到卡时,您的操作系统中是否打开了 Firefox 进程?不,它没有打开。 5-您发送的确切 APDU 命令是什么?..... 下一条评论
    猜你喜欢
    • 2016-12-05
    • 1970-01-01
    • 2010-10-17
    • 2021-08-28
    • 2017-06-27
    • 2013-03-29
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多