Невозможно получить доступ к данным, переданным методу общего интерфейса в javacardJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Невозможно получить доступ к данным, переданным методу общего интерфейса в javacard

Сообщение Anonymous »

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

Код: Выделить всё

sourceapplet.java
— это апплет, в котором реализован мой общий интерфейс. И из targetapplet.java я пытаюсь вызвать этот интерфейс.

Код: Выделить всё

sourceapplet.java

Код: Выделить всё

public void checkNumber(byte[] number) {
short numberLength = (short)number.length;
if (numberLength < 6) {
ISOException.throwIt(ISO7816.SW_CONDITIONS_NOT_SATISFIED);
}
ISOException.throwIt(ISO7816.SW_WRONG_DATA);
}

Код: Выделить всё

Configurations.java

Код: Выделить всё

public interface Configuration extends Shareable {
public void checkNumber(byte[] number);
}

Код: Выделить всё

targetapplet.java

Код: Выделить всё

public final class TargetApplet extends Applet implements MultiSelectable {
private static final byte INS_TEST_CHECK_NUMBER = (byte) 0x11;
private AID checkNumberAppletAID;
private TargetApplet() {
// Initialize the AID of the checkNumberApplet
byte[] aidBytes = {(byte) 0xB2, 0x86, 0x00, 0x00, 0x00, 0x01};
checkNumberAppletAID = JCSystem.lookupAID(aidBytes, (short)0, (byte) aidBytes.length);

if (checkNumberAppletAID == null) {
ISOException.throwIt(ISO7816.SW_FILE_NOT_FOUND); // Applet not found
}
}

public void process(APDU apdu) {
final byte[] buffer = apdu.getBuffer();
final byte ins = buffer[ISO7816.OFFSET_INS];
switch (ins) {
case INS_TEST_CHECK_NUMBER:
processCheckNumber(apdu);
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}

private void processCheckNumber(APDU apdu) {
Configuration config = (Configuration) JCSystem.getAppletShareableInterfaceObject(checkNumberAppletAID, (byte) 0x00);
if (config == null) {
ISOException.throwIt(ISO7816.SW_APPLET_SELECT_FAILED);
}

byte[] number = new byte[]{1,2,3,4};
// byte[] number = new byte[] {(byte) '1', (byte) '2', (byte) '3', (byte) '4'};
config.checkNumber(number);
}
}
Теперь, когда я отправляю apdu 00 11 00 00, я получаю ответ 6F00 (SW_UNKNWON), но я ожидаю получить ответ SW_CONDITIONS_NOT_SATISFIED. Однако, когда я не выполняю никаких операций с массивом переданных номеров в методе checkNumber, я получаю ответ SW_WRONG_DATA, как и ожидалось.

Код: Выделить всё

public void checkNumber(byte[] number) {
/* short numberLength = (short)number.length;
if (numberLength < 6) {
ISOException.throwIt(ISO7816.SW_CONDITIONS_NOT_SATISFIED);
} */
ISOException.throwIt(ISO7816.SW_WRONG_DATA);
}
Кто-нибудь может сообщить мне, в чем проблема и как ее решить? Есть ли какие-либо проблемы с массивом чисел, передаваемым в ProcessCheckNumber в targetapplet.java?
Заранее спасибо.
Обновить
Использование временной памяти в targetapplet.java

Код: Выделить всё

private byte[] number;
private TargetApplet() {
number = JCSystem.makeTransientByteArray((short) 4, JCSystem.CLEAR_ON_DESELECT); // Also tried with CLEAR_ON_RESET
// Initialize the AID of the checkNumberApplet
byte[] aidBytes = {(byte) 0xB2, 0x86, 0x00, 0x00, 0x00, 0x01};
checkNumberAppletAID = JCSystem.lookupAID(aidBytes, (short)0, (byte) aidBytes.length);

if (checkNumberAppletAID == null) {
ISOException.throwIt(ISO7816.SW_FILE_NOT_FOUND); // Applet not found
}
}
private void processCheckNumber(APDU apdu) {
Configuration config = (Configuration) JCSystem.getAppletShareableInterfaceObject(checkNumberAppletAID, (byte) 0x00);
if (config == null) {
ISOException.throwIt(ISO7816.SW_APPLET_SELECT_FAILED);
}

number[0] = 1;
number[1] = 2;
number[2] = 3;
number[3] = 4;
config.checkNumber(number);
}
Использование постоянной памяти в targetapplet.java

Код: Выделить всё

private byte[] number;
private TargetApplet() {
number = new byte[4];
// Initialize the AID of the checkNumberApplet
byte[] aidBytes = {(byte) 0xB2, 0x86, 0x00, 0x00, 0x00, 0x01};
checkNumberAppletAID = JCSystem.lookupAID(aidBytes, (short)0, (byte) aidBytes.length);

if (checkNumberAppletAID == null) {
ISOException.throwIt(ISO7816.SW_FILE_NOT_FOUND); // Applet not found
}
}
private void processCheckNumber(APDU apdu) {
Configuration config = (Configuration) JCSystem.getAppletShareableInterfaceObject(checkNumberAppletAID, (byte) 0x00);
if (config == null) {
ISOException.throwIt(ISO7816.SW_APPLET_SELECT_FAILED);
}

number[0] = 1;
number[1] = 2;
number[2] = 3;
number[3] = 4;
config.checkNumber(number);
}
Update2
Добавлен try-catch в sourceapplet.java

Код: Выделить всё

public void checkNumber(byte[] number) {
try {
short numberLength = (short)number.length;
if (numberLength < 6) {
ISOException.throwIt(ISO7816.SW_CONDITIONS_NOT_SATISFIED);
}
} catch (ISOException e) {
ISOException.throwIt(e.getReason());
} catch (SecurityException e) {
ISOException.throwIt(ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED);
}
}
И теперь я получаю ответ 6982 SW_SECURITY_STATUS_NOT_SATISFIED
P.S: пожалуйста, дайте мне знать, если какая-либо информация отсутствует

Подробнее здесь: https://stackoverflow.com/questions/790 ... n-javacard
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»