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文件并成功上传到我的卡上。我希望该卡具有以下行为:
- Return 0x9100 接收主小程序选择
- Return 0x9200 在选择主机时收到任何其他命令
- Return 0x9400 接收从属小程序选择
- Return 0x6103 在选择 Slave 时收到任何其他命令
但这是我在上述条件下收到的:
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)
此方法允许主小程序决定是否允许客户端小程序使用可共享接口。由于您的主控小程序没有实现该方法,默认拒绝分享。
我使用 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文件并成功上传到我的卡上。我希望该卡具有以下行为:
- Return 0x9100 接收主小程序选择
- Return 0x9200 在选择主机时收到任何其他命令
- Return 0x9400 接收从属小程序选择
- Return 0x6103 在选择 Slave 时收到任何其他命令
但这是我在上述条件下收到的:
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)
此方法允许主小程序决定是否允许客户端小程序使用可共享接口。由于您的主控小程序没有实现该方法,默认拒绝分享。