Java 卡对 INS = 0x70 的 APDU 有奇怪的响应

Java Card have a weird response to APDU with INS = 0x70

下面,您会看到一个简单的小程序,它 returns 0x6781 使用 INS=0x70 或 INS=0x71:

传入 APDU 命令
package testPack;
import javacard.framework.*;

public class TestApp extends Applet
{

    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[] buf = apdu.getBuffer();
        switch (buf[ISO7816.OFFSET_INS])
        {
        case (byte)0x70:
            ISOException.throwIt((short)0x6781);
            break;
        case (byte)0x71:
            ISOException.throwIt((short)0x6781);
            break;
        default:
            ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
        }
    }
}

问题是,我通过 INS=0x70:

收到 APDU 命令的 0x6C01
Send: 00 A4 04 00 07 01 02 03 04 05 00 00 00
Recv: 90 00

Send: 00 70 00 00 00
Recv: 6C 01
Send: 00 70 00 00 01
Recv: 01 90 00

Send: 00 71 00 00 00
Recv: 67 81

我通过接触式和非接触式接口尝试了两种不同的 Java 卡(一种是 NXP JCOP v2.4.2 r3,另一种是 KONA java 卡)并使用内部生成的两个不同的 cap 文件两台不同的笔记本电脑通过两个不同的 IDE!!!(我有多可疑?:D)但是响应是相同的。

我向 PCSC 或卡片管理员怀疑这个奇怪的响应。因为在模拟器中,即使 process 方法也不会调用这个特殊的 INS 值。

怎么了?

INS = 70CLA = 00是按照ISO-7816规范的MANAGE CHANNEL命令,还有INS = A4表示SELECT.

如果您想使用这些 INS 代码,您必须使用 CLA >= 0x80 以指定它是您的专有命令。

我认为如果 class 代表行业间 class 那么只有 INS 将按照标准中定义的方式工作,这里 CLA - 00 代表行业间命令因此,卡响应行为与管理通道命令的行为相同因为你使用了 INS = 70.

 6.16.4 Response message (nominal case)

Table 73 - MANAGE CHANNEL response APDU
Data field  Logical channel number if P1-P2='0000'
Empty if P1-P2!='0000'
SW1-SW2     Status bytes 

实际上您的卡正在向您返回逻辑通道号 -01。 ManageChannel

在我看来,如果 class 是专有的。这里的 INS 将不被视为标准中定义的 INS。希望具有相同 INS 0x70 的 CLA 80 会给你需要的结果。

希望对您有所帮助。

[Bit 8 set to 1 indicates the proprietary class]