Я пытаюсь получить доступ к объектам через разделяемый интерфейс на карте 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
в более поздней части кода?