1

下面,您会看到一个简单的小程序,它返回带有 INS=或 INS=0x6781的传入 APDU 命令:0x700x71

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);
        }
    }
}

问题是,我收到0x6C01带有 INS= 的 APDU 命令0x70

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 卡),并使用两个不同的笔记本电脑通过两个不同的 IDE 生成的两个不同的 cap 文件!!!(多么可疑我是吗?:D)但反应是平等的。

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

它出什么问题了?

4

2 回答 2

5

INS = 70withCLA = 00是符合 ISO-7816 规范的 MANAGE CHANNEL 命令,同时INS = A4表示 SELECT。

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

于 2016-06-30T19:56:25.630 回答
1

我认为如果 class 代表 interindustry class 那么只有 INS 将按照标准中的定义工作,这里 CLA - 00 表示 interindusty 命令,因此,卡响应行为与管理通道命令的行为相同,因为您使用了 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。管理频道

在我看来,如果阶级是专有的。这里 INS 不会被视为标准中定义的 INS。希望具有相同 INS 0x70 的 CLA 80 将为您提供所需的结果。

希望能帮助到你。

[Bit 8 set to 1 indicates the proprietary class]
于 2016-07-01T07:49:08.233 回答