为什么在使用Shareable接口时applet转换失败? (在这种情况下如何使用导出文件)

时间:2015-03-30 06:45:59

标签: javacard

我写了两个名为 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 并再次尝试,但没有任何改变,我再次收到相同的错误:

enter image description here

问题:

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

1 个答案:

答案 0 :(得分:1)

  1. 您必须创建一个扩展可共享的界面。
  2. 然后你的applet必须实现该接口
  3. 您在奴隶小程序yb中调用JCSystem.getAppletShareableInterfaceObject
  4. 获得此界面
  5. 您通过此对象调用界面的公共方法
  6. 不要分享apdu对象!
  7. 我强烈推荐陈志群 - Java Card Technology Book