我写了两个名为 MasterApp 和 SlaveApp 的Java卡小程序,它们位于名为 masterPack 和 slavePack :
掌握AID:
01 02 03 04 01
01 02 03 04 01 01
从属AID:
01 02 03 04 02
01 02 03 04 02 02
如下所示,我想在 SlaveApp 的SharedMethod()
方法中调用 MasterApp 的Process()
:
硕士课程:
package masterPack;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISOException;
import javacard.framework.Shareable;
import javacard.framework.Util;
public class MasterApp extends Applet implements Shareable {
// goodNews = "Shared Method Called Successful"
byte[] goodNews = { (byte) 'S', (byte) 'h', (byte) 'a', (byte) 'r',
(byte) 'e', (byte) 'd', (byte) ' ', (byte) 'M', (byte) 'e',
(byte) 't', (byte) 'h', (byte) 'o', (byte) 'd', (byte) ' ',
(byte) 'C', (byte) 'a', (byte) 'l', (byte) 'l', (byte) 'e',
(byte) 'd', (byte) ' ', (byte) 'S', (byte) 'u', (byte) 'c',
(byte) 'c', (byte) 'e', (byte) 's', (byte) 's', (byte) 'f',
(byte) 'u', (byte) 'l' };
private MasterApp() {
}
public static void install(byte bArray[], short bOffset, byte bLength)
throws ISOException {
new MasterApp().register();
}
public void process(APDU arg0) throws ISOException {
if (selectingApplet()) {
return;
}
}
public void SharedMethod(APDU apdu) {
byte[] buffer = apdu.getBuffer();
Util.arrayCopyNonAtomic(goodNews, (short) 0, buffer, (short) 0,
(short) goodNews.length);
apdu.setOutgoingAndSend((short) 0, (short) goodNews.length);
}
}
奴隶计划:
package slavePack;
import masterPack.MasterApp;
import javacard.framework.AID;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISOException;
import javacard.framework.JCSystem;
public class SlaveApp 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);
MasterApp MasterAppInstance = (MasterApp)JCSystem.getAppletShareableInterfaceObject(aid, (byte)0);
private SlaveApp() {
}
public static void install(byte bArray[], short bOffset, byte bLength)
throws ISOException {
new SlaveApp().register();
}
public void process(APDU apdu) throws ISOException {
if(selectingApplet()){
return;
}
MasterAppInstance.SharedMethod(apdu);
}
}
在第一步中,我成功地将 MasterApp 转换为 .cap 文件,现在我将 .exp 文件放在同一目录中它的 .cap 文件。
作为第二步,我想将 SlaveApp 转换为 .cap 文件,但我失败了。我猜想我需要在 SlaveApp 目录中的前一个 .exp 文件进行转换,所以我将它移动到 SlaveApp.class 并再次尝试,但没有任何改变,我再次收到相同的错误:
问题:
1-错误的起源是什么?
2-如何仅针对一个applet限制此sharedMethod?我的意思是,在这种情况下,所有其他小程序都可以调用它,有没有办法限制这种可访问性?
3-如果我们没有 MasterApp 的 .exp 文件,我们必须做什么?
请注意,我感谢任何其他评论,以使我的程序更有效(例如变量的类型及其声明的要点)。
更新:
根据@ Paul-Bastin的回答,我在 MasterApp 包中添加了一个名为MyShareableInterface
的接口,该接口实现了Shareable
接口。在这个接口中,我声明了我在MasterApp中用作接口的SharedMethod
方法。之后,我使用MasterApp applet实现此接口。所有其他都是一样的,但没有任何改变。
MyShareableInterface.java:
package masterPack;
import javacard.framework.APDU;
import javacard.framework.Shareable;
public interface MyShareableInterface extends Shareable {
public void SharedMethod(APDU apdu);
}
MasterApp.java:
public class MasterApp extends Applet implements MyShareableInterface {
//Same Body
}
SlaveApp.java:
与以前完全一样。
问题:没有任何改变。我有同样的错误。
更新2:
在所有三个文件中从APDU
的输入参数中删除了 SharedMethod
个对象。它的身体也被ISOException.throwIt((short)0x9100)
取代(在MasterApp.java
中)。我有同样的错误。
在上述更改后,我从头开始重新创建项目,现在我在两个包中处理三个.java
文件,如下所示:
MyShareableInterface.java:
package masterPack;
import javacard.framework.Shareable;
public interface MyShareableInterface extends Shareable{
public void SharedMthod();
}
MasterApp.java:
package masterPack;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISOException;
public class MasterApp extends Applet implements MyShareableInterface {
private MasterApp() {
}
public static void install(byte bArray[], short bOffset, byte bLength)
throws ISOException {
new MasterApp().register();
}
public void process(APDU arg0) throws ISOException {
// TODO Auto-generated method stub
}
public void SharedMthod() {
// TODO Auto-generated method stub
ISOException.throwIt((short)0x9100);
}
}
SlaveApp.java:
package slavePack;
import masterPack.MasterApp;
import javacard.framework.AID;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISOException;
import javacard.framework.JCSystem;
public class SlaveApp 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);
MasterApp MasterAppInstance = (MasterApp)JCSystem.getAppletShareableInterfaceObject(aid, (byte)0);
private SlaveApp() {
}
public static void install(byte bArray[], short bOffset, byte bLength)
throws ISOException {
new SlaveApp().register();
}
public void process(APDU apdu) throws ISOException {
if(selectingApplet()){
return;
}
MasterAppInstance.SharedMthod();
}
}
代码中没有错误。我甚至可以成功将MasterApp.java
转换为 .cap 文件。问题是SlaveApp.java
转换过程失败。我在这一步失败了。
请注意:AID-s与问题的第一个版本相同。两个第一个文件位于masterPack
,后一个位于slavePack
。
答案 0 :(得分:1)
JCSystem.getAppletShareableInterfaceObject
我强烈推荐陈志群 - Java Card Technology Book