Java card returns 0x6F00 共享方法的调用点

Java card returns 0x6F00 on the calling point of a shared method

我使用 问题的程序来测试我的 Java 卡上的 Shareable 界面。

就像这个问题我写了一个小程序叫Master with AID = 010203040101 和一个叫Slave with AID =010203040202。这些是文件:

MyShareableInterface.java :

package master;

import javacard.framework.Shareable;

public interface MyShareableInterface extends Shareable {
    public void ShareMethod();

}

Master.java :

package master;

import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISOException;

public class Master extends Applet implements MyShareableInterface {

    private Master() {
    }

    public static void install(byte bArray[], short bOffset, byte bLength)
            throws ISOException {
        new Master().register();
    }

    public void process(APDU arg0) throws ISOException {

        if (selectingApplet()){
            ISOException.throwIt((short)0x9100);
        }
        ISOException.throwIt((short)0x9200);
    }

    public void ShareMethod() {
        ISOException.throwIt((short) 0x6103);
    }

}

Slave.java :

package slave;

import master.MyShareableInterface;
import javacard.framework.AID;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISOException;
import javacard.framework.JCSystem;

public class Slave extends Applet {
    byte[] masterAppletAID={(byte)0x01,(byte)0x02,(byte)0x03,(byte)0x04,(byte)0x01,(byte)0x01};
     AID aid = JCSystem.lookupAID(masterAppletAID, (short)0, (byte)masterAppletAID.length);
     MyShareableInterface MasterShareableInterfaceInstance = (MyShareableInterface)JCSystem.getAppletShareableInterfaceObject(aid, (byte)0);

     private Slave() {
    }

    public static void install(byte bArray[], short bOffset, byte bLength)
            throws ISOException {
        new Slave().register();
    }

    public void process(APDU arg0) throws ISOException {
        if (selectingApplet()){
            ISOException.throwIt((short)0x9400);
            return;
        }
        MasterShareableInterfaceInstance.ShareMethod();

    }

}

最后我将这两个小程序转换为.cap文件并成功上传到我的卡上。我希望该卡具有以下行为:

但这是我在上述条件下收到的:

OpenSC: OSC -s 00a4040006010203040101 -s 00000000 -s 00a4040006010203040202 -s 00000
000
Using reader with a card: ACS CCID USB Reader 0
Sending: 00 A4 04 00 06 01 02 03 04 01 01
Received (SW1=0x91, SW2=0x00)
Sending: 00 00 00 00
Received (SW1=0x92, SW2=0x00)
Sending: 00 A4 04 00 06 01 02 03 04 02 02
Received (SW1=0x94, SW2=0x00)
Sending: 00 00 00 00
Received (SW1=0x6F, SW2=0x00)

如您所见,前三个命令 return 正确响应,但后者(调用 SharedMethod)抛出 0x6F00 异常。为什么?

请注意,我用两个不同的 Java 卡(2.2.1 和 3.0.1)测试了上面的 .cap 文件,两者的行为相似。

将状态字 0x6103 更改为 ISO7816(或 ETSI,如果您为 SIM 卡编写小程序)专用间隔中的任何其他状态字。例如,尝试使用 0x9003

http://www.cardwerk.com/smartcards/smartcard_standard_iso7816-4_5_basic_organizations.aspx

SW1 = 0x61 表示仍有一些响应字节可用。 SW2 表示这些字节的数量。一些读者(和图书馆)自己处理这个状态字,这可能会给你带来麻烦(你说有 3 个字节可用,尽管一个都没有)。

您收到状态字 0x6F00,因为您在

处收到未处理的空指针异常
MasterShareableInterfaceInstance.ShareMethod();

这个空指针异常的原因是MasterShareableInterfaceInstance为空

您尝试通过

获取共享接口的实例
(MyShareableInterface)JCSystem.getAppletShareableInterfaceObject(aid, (byte)0);

在实例化您的小程序对象时。由于多种原因,您的方法不起作用。您必须确保以下内容:

  • 调用 getAppletShareableInterfaceObject 时必须已经注册从属小程序。您当前在 applet 构造函数中调用此方法,因此在调用 Applet.register() 之前 调用它。因此,您必须确保仅在调用 register() 方法后才使用 getAppletShareableInterfaceObject。因此,直接从您的 process() 方法调用此方法可能是个好主意。

  • 当您调用getAppletShareableInterfaceObject

  • 时,主小程序已经注册
  • 主小程序必须覆盖 getShareableInterfaceObject 方法和 return 可共享接口对象(默认实现将为 return null):

    public Shareable getShareableInterfaceObject(AID clientAID, byte parameter)
    

    此方法允许主小程序决定是否允许客户端小程序使用可共享接口。由于您的主控小程序没有实现该方法,默认拒绝分享。