Java卡在共享方法的调用点上返回0x6F00

时间:2015-04-05 06:43:12

标签: smartcard javacard

我使用this个问题的程序来测试我的Java卡上的Shareable接口。

就像问题我写了一个名为Master的applet,其中AID = 010203040101,另一个名为Slave,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 文件并成功上传到我的卡上。我希望该卡具有以下行为:

  • 接收主小程序选择
  • 时返回 0x9100
  • 选择Master时,在接收到任何其他命令时返回 0x9200
  • 接收Slave applet选择
  • 后返回 0x9400
  • 在选择Slave时接收任何其他命令时返回 0x6103

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

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)

如上所示,前三个命令返回正确的响应,但后者(调用SharedMethod)会引发0x6F00异常。为什么呢?

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

2 个答案:

答案 0 :(得分:2)

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

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

SW1 = 0x61表示仍有一些响应字节可用。 SW2表示这些字节的数量。一些读者(和库)自己处理这个状态字,这可能会导致你的麻烦(你说有3个字节可用,虽然没有一个字节)。

答案 1 :(得分:2)

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

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

此空指针异常的原因是MasterShareableInterfaceInstance为空。

您尝试通过

获取可共享界面的实例
(MyShareableInterface)JCSystem.getAppletShareableInterfaceObject(aid, (byte)0);

实例化你的applet对象。您的方法由于多种原因不起作用。您必须确保以下内容:

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

  • 当您致电getAppletShareableInterfaceObject

  • 时,主applet已经注册
  • 主applet必须覆盖getShareableInterfaceObject方法并返回可共享的接口对象(默认实现将返回null):

    public Shareable getShareableInterfaceObject(AID clientAID, byte parameter)
    

    此方法允许主applet决定是否允许客户端applet使用可共享接口。由于您的主applet未实现此方法,因此默认情况下拒绝共享。