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

Posted

技术标签:

【中文标题】Java Card 对 INS = 0x70 的 APDU 有奇怪的响应【英文标题】:Java Card have a weird response to APDU with INS = 0x70 【发布时间】:2016-06-30 14:23:33 【问题描述】:

在下面,您会看到一个简单的小程序,它将 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);
        
    

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

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 值。

这有什么问题?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

谢谢你亲爱的 Vojta。这些特殊值是否仅限于 SELECT APDU 命令和 MANAGE CHANNEL APDU 命令?或者我还必须为所有其他 ISO7816 命令使用除 0x00 之外的另一个 CLA?我的意思是,例如,我可以在我的小程序中使用A2 作为 INS,CLA=00 还是因为它是为搜索记录定义的,所以我也必须避免将它与 CLA=0x00 一起使用? (能否请您查看您的 gmail 以了解与 SIM 卡小程序开发相关的问题?)【参考方案2】:

我认为如果类代表跨行业类,那么只有 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

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

希望对你有帮助。

[Bit 8 set to 1 indicates the proprietary class]

【讨论】:

以上是关于Java Card 对 INS = 0x70 的 APDU 有奇怪的响应的主要内容,如果未能解决你的问题,请参考以下文章

瞬态内存中的 Java Card 对象实例

Java Card Applet 在尝试加密消息时返回 6f00

通过参考 Java。整数 ins 没有被修改,Collection 被修改,为啥? [复制]

如何在 java 中做这个 Card 类?

2017ICPC沈阳网络赛 HDU 6025 -- card card card(最大子段和)

在 Java Card 上编码 publicKey