2016-04-09 5 views
2

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

} 

ответ

2

Для связи с апплетом необходимо сначала выбрать апплет.

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

ВЫБРАТЬ APDU Command = 00A40400 <AID Length> <AID>

Другой мудрый, объект, который ответит на вашу команду, это не ваш апплет и, скорее всего, это по умолчанию Default-Выбранный апплет, то есть менеджер карты.

+0

Что касается вашего второго пункта: поскольку оба 'buffer [ISO7816.OFFSET_CLA]' и 'CLS' объявлены как байты, они оба содержат одно и то же значение со знаком (т.е. -80 для' (byte) 0xB0'), и сравнение будет отлично работа. Отбрасывание в short/int, усечение и возврат к байту ничего не изменит и в этом случае совершенно бесполезно. –

+0

@MichaelRoland Вы совершенно правы. Спасибо. Ответ обновлен. Кастинг и бит-мудрый и требуется в случаях, когда мы сравниваем буферные элементы с коротким/значением int больше 127. правильно? – Abraham

Смежные вопросы