【问题标题】:How to send response APDU containing return data AND status word other than 0x9000?如何发送包含返回数据和状态字而不是 0x9000 的响应 APDU?
【发布时间】:2013-12-15 17:03:31
【问题描述】:

我想发送一个包含响应数据字段以及不是 0x9000 的状态字的响应 APDU。考虑到我对 ISO 7816-4 的理解,这应该是可能的。

但是,每当我指定返回数据并尝试发送它时,我看不到任何显式设置除 0x9000 之外的状态字的可能性。

相反,我可以显式设置任意状态字并将它们作为 ISOException 发送,但不可能附加返回数据。

这种行为对于错误是可以的,即状态字 0x64XX - 0x69XX 但 0x63XX 是什么?发送警告并仍然传达返回数据应该是可以的。

那么是否可以发送包含返回数据和 0x9000 以外的状态字的响应 APDU,我该怎么做?

【问题讨论】:

    标签: smartcard iso javacard apdu


    【解决方案1】:

    只需确保在引发异常之前发送数据。您当然可能想记住要扔到最后的状态词。然后您可以简单地使用ISOException.throwIt(short sw) 来创建状态字。

    请注意 - 正如您所指出的 - 只有当您的状态字指示 9000 或警告时(即在 62xx63xx 的范围内),您才应该返回数据。返回数据和指示错误的状态字是对 ISO 7816-4 的误解。

    我同意抛出异常来生成警告感觉不对,但目前就是这样。

    【讨论】:

    • 嘿,这很快 ;-) ... 并解决了我的问题,虽然直觉告诉我不然,否则我会尝试这个显而易见的?我自己混合了这两种方法。
    • 显然在处理方法完成之前不会发送 APDU。从未想过这一点,但似乎是合理的。
    【解决方案2】:

    这是一个已经回答的老话题,但我想在发帖时及时更新,我不确定可选数据是否可以与 SW(非 0x9000)一起发送0x6D00 除外。我已经在英飞凌(飞天 A22CR)、英飞凌 SECORA ID 和 NXP JCOP4 P71 上针对 JC 2.2.2 和 JC 3.0.4 进行了测试。 Java 卡。

    我创建了一个简单的小程序代码,只需要一个 Java 类文件,它将与 SW 一起返回“hello”(在命令 APDU 的数据中输入 SW,如下面的屏幕截图所示),它将尝试返回两个文本“你好”和 SW。

    似乎只有 0x9000 和 0x6D00 似乎返回了“hello”文本。

    有没有人也获得了 0x6200 和 0x6300 来处理发送数据,请发布示例代码,因为我认为这将使我们中的许多人受益。

    小程序代码:

    package TestAPDU;
    
    import javacard.framework.APDU;
    import javacard.framework.Applet;
    import javacard.framework.ISO7816;
    import javacard.framework.ISOException;
    import javacard.framework.JCSystem;
    import javacard.framework.Util;
    
    public class TestAPDU extends Applet {
        
        public byte[] swStore = JCSystem.makeTransientByteArray((short) 2, JCSystem.CLEAR_ON_DESELECT);
    
        public static void install(byte[] bArray, short bOffset, byte bLength) {
            new TestAPDU().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) 0x00:
                    apdu.setIncomingAndReceive();
                    swStore[0] = buf[5];
                    swStore[1] = buf[6];
                    buf[0] = (byte) 0x68;
                    buf[1] = (byte) 0x65;
                    buf[2] = (byte) 0x6C;
                    buf[3] = (byte) 0x6C;
                    buf[4] = (byte) 0x6F;
                    apdu.setOutgoing();
                    apdu.setOutgoingLength((short) 5);
                    apdu.sendBytes((short) 0, (short) 5);
                    ISOException.throwIt(Util.makeShort(swStore[0], swStore[1]));
                    break;
                default:
                    ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-01
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多