我试图使用可共享接口,使用Eclipse 3.7 SDK在Java卡2.2.2中创建一个简单的客户端和服务器小程序.调用方法JCSystem.getAppletShareableInterfaceObject时,它将引发异常,因此返回SW设置为6F00.
这是客户端应用程序代码(Test_Client.java):
@H_502_8@ package client; import server.Test_ServerInf; import javacard.framework.AID; import javacard.framework.APDU; import javacard.framework.Applet; import javacard.framework.ISO7816; import javacard.framework.ISOException; import javacard.framework.JCSystem; public class Test_Client extends Applet { protected static final byte INS1 = (byte)0xE2; protected static final byte INS2 = (byte)0x21; byte[] ServerAIDbyte={(byte)0x20,(byte)0x21,(byte)0x22,(byte)0x23,(byte)0x24,(byte)0x25,(byte)0x26,(byte)0x27,(byte)0x01}; AID ServerAID; private Test_Client() { } public static void install(byte bArray[],short bOffset,byte bLength) throws ISOException { new Test_Client().register(); } public void process(APDU apdu) throws ISOException { // TODO Auto-generated method stub byte[] apduBuffer = apdu.getBuffer(); byte Ins=apduBuffer[ISO7816.OFFSET_INS]; short byteread = apdu.setIncomingAndReceive(); if (selectingApplet()) return; switch (Ins){ case INS1: Ins1_Handler(apdu); return; case INS2: Ins2_Handler(apdu,apduBuffer); return; default: ISOException.throwIt(ISO7816.SW_FUNC_NOT_SUPPORTED); } } private void Ins1_Handler(APDU apdu){ Test_ServerInf sio = null; ServerAID=JCSystem.lookupAID(ServerAIDbyte,(short) 0,(byte) ServerAIDbyte.length); if(ServerAID==null) ISOException.throwIt( (short) 0x6A82); ////server request try{ sio=(Test_ServerInf)(JCSystem.getAppletShareableInterfaceObject(ServerAID,(byte) 0)); } catch(SecurityException e) { ISOException.throwIt((short)0x12); } catch(Exception e) { ISOException.throwIt((short)0x10); } if(sio==null) ISOException.throwIt((short)0x6A00); } private void Ins2_Handler(APDU apdu,byte[] apduBuffer){ Test_ServerInf sio = null; ////connect to server ServerAID=JCSystem.lookupAID(ServerAIDbyte,(byte) ServerAIDbyte.length); if(ServerAID==null) ISOException.throwIt( (short) 0x6A82); ////server request try{ sio=(Test_ServerInf)(JCSystem.getAppletShareableInterfaceObject(ServerAID,(byte) 0)); } catch(SecurityException e) { ISOException.throwIt((short)0x12); } catch(Exception e) { ISOException.throwIt((short)0x10); } if(sio==null) ISOException.throwIt((short)0x6A00); } }
@H_502_8@ package server; import javacard.framework.APDU; import javacard.framework.Applet; import javacard.framework.ISOException; import server.Test_ServerInf; import javacard.framework.Shareable; import javacard.framework.AID; public class Test_Server extends Applet implements Test_ServerInf{ private Test_Server() { } public static void install(byte bArray[],byte bLength) throws ISOException { new Test_Server().register(); } public void process(APDU apdu) throws ISOException { // TODO Auto-generated method stub } public Shareable getShareableInterfaceObject(AID clientAID,byte parameter) { return this; } public short method1(){ return (short)0x01; } public short method2(){ return (short)0x02; } }
和可共享的接口文件(Test_ServerInf.java):
@H_502_8@package server; import javacard.framework.Shareable; public interface Test_ServerInf extends Shareable { public short method1(); public short method2(); }
最佳答案
您正在尝试在客户端applet类的成员字段中存储对可共享接口对象的引用:
@H_502_8@sio = (Test_ServerInf)(JCSystem.getAppletShareableInterfaceObject(ServerAID,(byte) 0));
其中sio定义为applet类实例的私有成员:
@H_502_8@public class Test_Client extends Applet { private Test_ServerInf sio;
由于可共享接口对象由服务器小应用程序拥有(即由其他上下文拥有),因此将导致SecurityException.不允许将其他上下文拥有的对象存储在实例字段中.
请参阅《运行时环境规范》(Java卡平台,版本2.2.2)中的“访问类实例对象字段”(第6.2.8.3节):
Bytecodes: @H_502_8@getfield,@H_502_8@putfield
- […] if the object is owned by an applet in the currently active context,access is allowed.
- Otherwise,access is denied.