我使用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 文件并成功上传到我的卡上。我希望该卡具有以下行为:
但这是我在上述条件下收到的:
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 文件,两者的行为相似。
答案 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必须覆盖getShareableInterfaceObject
方法并返回可共享的接口对象(默认实现将返回null):
public Shareable getShareableInterfaceObject(AID clientAID, byte parameter)
此方法允许主applet决定是否允许客户端applet使用可共享接口。由于您的主applet未实现此方法,因此默认情况下拒绝共享。