Ошибка APDU карты Java

Я пытаюсь отправить простой APDU на карту Java (я прикрепил простой код апплета ниже). Я уже протестировал апплет в симуляторе Eclipse, но когда я хочу отправить APDU в апплет, он завершается со следующей ошибкой. : send_APDU() returns 0x80206E00 (6E00: Wrong CLA byte.) .Апплет уже установлен на карту (я использовал для этого GpShell). Вот полный вывод скрипта, который я использовал для отправки APDU.

D:\GPShell-1.4.4>GPShell.exe send_APDU.txt
establish_context
enable_trace
enable_timer
card_connect
command time: 15 ms
send_apdu -sc 0 -APDU b0000000010000
Command --> B0000000010000
Wrapped command --> B0000000010000
Response <-- 6E00
send_APDU() returns 0x80206E00 (6E00: Wrong CLA byte.)
command time: 860 ms
card_disconnect
command time: 31 ms
release_context
command time: 0 ms

Вот полный код апплета.

public class Contor extends Applet {

private byte contor = 0;
private final static byte CLS=(byte)0xB0;
private final static byte INC=(byte)0x00;
private final static byte DEC=(byte)0x01;
private final static byte GET=(byte)0x02;
private final static byte INIT=(byte)0x03;

private Contor() {
}

public static void install(byte bArray[], short bOffset, byte bLength) throws ISOException {
    new Contor().register();
}

public void process(APDU apdu) throws ISOException {
    if(this.selectingApplet())return;
    byte[] buffer = apdu.getBuffer();
    if(buffer[ISO7816.OFFSET_CLA] != CLS)
        ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
    switch(buffer[ISO7816.OFFSET_INS])
    {
        case INC:contor++;  break;
        case DEC:contor--;  break;
        case GET:
            buffer[0] = contor;
            apdu.setOutgoingAndSend((short)0,(short)1);
            break;
        case INIT:
            apdu.setIncomingAndReceive();
            contor = buffer[ISO7816.OFFSET_CDATA];
            break;
    }

}

person Alberto12    schedule 09.04.2016    source источник


Ответы (1)


Чтобы иметь связь с вашим апплетом, вы должны сначала выбрать свой апплет.

Для этого у вас есть два варианта. Первый вариант — сделать ваш апплет выбранным по умолчанию на этапе установки апплета и сделать его неявно выбранным апплетом после каждого включения питания. Второй вариант — отправить команду SELECT APDU в сочетании с вашим апплетом AUD перед отправкой других команд.

ВЫБЕРИТЕ команду APDU = 00A40400 <AID Length> <AID>

С другой стороны, объект, который отвечает на вашу команду, не является вашим апплетом, и, скорее всего, это апплет, выбранный по умолчанию, то есть Card Manager.

person Ebrahim Ghasemi    schedule 09.04.2016
comment
Что касается вашего второго пункта: поскольку и buffer[ISO7816.OFFSET_CLA], и CLS объявлены как байты, они оба содержат одно и то же значение со знаком (например, -80 для (byte)0xB0), и сравнение будет работать отлично. Приведение к short/int, усечение и приведение к byte ничего не изменит и в данном случае совершенно бесполезно. - person Michael Roland; 09.04.2016
comment
@MichaelRoland Вы совершенно правы. Спасибо. Ответ обновлен. Приведение побитовое и требуется в тех случаях, когда мы сравниваем элементы буфера со значением short/int больше 127. верно? - person Ebrahim Ghasemi; 09.04.2016