Java-карта Доступ к объектам через разделяемый интерфейс - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь получить доступ к объектам через разделяемый интерфейс на карте Java между двумя апплетами.

Коды серверного апплета:

package Wallet;

public class Wallet extends Applet implements IShareable {

    public static byte[] buf1 = JCSystem.makeTransientByteArray((short) 258, JCSystem.CLEAR_ON_DESELECT);

    public static void install(byte[] bArray, short bOffset, byte bLength) {
        new Wallet();
    }

    protected Wallet() {
        register();
    }

    public Shareable getShareableInterfaceObject(AID clientAID, byte parameter) {
        return this;
    }

    public short getArray(byte[] buf, short off, short len) {
        Util.arrayCopyNonAtomic(testArray, (short)0, buf, off, (short) 5);
        Util.arrayFillNonAtomic(buf1, (short) 0, (short) buf1.length, (byte) 0xAA); // <---- This is causing SecurityException
        return len;
    }

    public void process(APDU apdu) { ...... }

}

Интерфейс:

package Wallet;

import javacard.framework.*;

public interface IShareable extends Shareable {

    public short getArray(byte[] array, short off, short len);

}

Коды клиентского апплета:

package Test222;

import Wallet.IShareable;
import javacard.framework.*;

public class Test222 extends Applet {

    public AID appID = new AID(
            new byte[]{
                (byte) 0x54, (byte) 0x54, (byte) 0x54, (byte) 0x54, (byte) 0x54, (byte) 0x00
            },
            (short) 0,
            (byte) 6);
    public IShareable shared = null;
    public short[] sb1 = JCSystem.makeTransientShortArray((short) 1, JCSystem.CLEAR_ON_DESELECT);

    /**
     * Installs this applet.
     *
     * @param bArray
     * the array containing installation parameters
     * @param bOffset
     * the starting offset in bArray
     * @param bLength
     * the length in bytes of the parameter data in bArray
     */
    public static void install(byte[] bArray, short bOffset, byte bLength) {
        new Test222();
    }

    /**
     * Only this class's install method should create the applet object.
     */
    protected Test222() {
        register();
    }

    /**
     * Processes an incoming APDU.
     *
     * @see APDU
     * @param apdu
     * the incoming APDU
     */
    public void process(APDU apdu) {
        if (selectingApplet()) {
            return;
        }

        byte[] buffer = apdu.getBuffer();

        if ((buffer[ISO7816.OFFSET_CLA] == (byte) 0xB0) && (buffer[ISO7816.OFFSET_INS] == (byte) 0x10)) {
            try {
                shared = (IShareable) JCSystem.getAppletShareableInterfaceObject(appAID, (byte) 0);
                if (shared != null) {
                    sb1[0] = shared.getArray(buffer, (short) 0, (short) 5);
                    apdu.setOutgoing();
                    apdu.setOutgoingLength(sb1[0]);
                    apdu.sendBytesLong(buffer, (short) 0, sb1[0]);
                } else {
                    ISOException.throwIt(ISO7816.SW_APPLET_SELECT_FAILED);
                }
            } catch (ClassCastException e) {
                ISOException.throwIt(ISO7816.SW_DATA_INVALID);
            }
        } else {
            ISOException.throwIt(ISO7816.SW_COMMAND_NOT_ALLOWED);
        }
    }
}

Я получаю исключение SecurityException со стороны серверного апплета всякий раз, когда выбираю клиентский апплет для вызова метода интерфейса getArray серверного апплета.Я проследил его до метода Util.arrayFillNonAtomic() на стороне сервера, когда он обращается к buf1.Как заставить Util.arrayFillNonAtomic() выполнить, поскольку я заинтересован в копировании заполненного buf1 в getArray buf в более поздней части кода?

1 Ответ

0 голосов
/ 21 декабря 2018

Я получаю SecurityException со стороны серверного апплета

SecurityException выбрасывается из-за недопустимого доступа к объекту (buf1) из вызывающего контекста (серверный апплет) илиактивный контекст.Это соответствует правилам доступа к объектам, применяемым брандмауэром, определенным в спецификации JCRE.https://docs.oracle.com/javacard/3.0.5/JCCRE/JCCRE.pdf

Вы можете прочитать спецификацию JCRE для концепции переключения контекста во время реализации разделяемых интерфейсных объектов.

В общем, к объекту можно получить доступ только из его собственного контекста, чтоэто когда владеющий контекст является текущим активным контекстом.Брандмауэр предотвращает доступ к объекту другого апплета в другом контексте.В терминах реализации, каждый раз, когда к объекту обращаются, контекст владельца объекта (вызывающий апплет) сравнивается с текущим активным контекстом (называемым апплетом).Если они не совпадают, доступ не выполняется и выдается SecurityException.

Особенно в вашем случае,

Временные объекты типа CLEAR_ON_DESELECT могут быть созданы или доступны только тогда, когда текущий активный контекст является контекстом текущеговыбранный апплет .В данном случае это не так, потому что активный контекст - это контекст серверного апплета , а текущий выбранный апплет - клиентский апплет .

Однако вы можете изменить buf1 напереходный массив типа CLEAR_ON_RESET, потому что они ведут себя как постоянные объекты в том смысле, что к ним можно получить доступ, когда текущий активный контекст (клиентский апплет) является собственным объектом (клиентский апплет)).

...