2014-12-22 14 views
1

Я пытаюсь загрузить апплет в смарт-карту, прежде чем я хотел только, чтобы сделать небольшой тест с помощью следующего кода:Невозможно выбрать Диспетчер карт AID при тестировании отправить APDU

import javax.smartcardio.*; 
import java.util.*; 

public class TestSmartCardIO { 

    public static String toString(byte[] bytes) { 
     StringBuffer sbTmp = new StringBuffer(); 
     for(byte b : bytes){ 
      sbTmp.append(String.format("%X", b)); 
     } 
     return sbTmp.toString(); 
    } 

    public static void main(String[] args) { 
     try { 
      TerminalFactory factory = TerminalFactory.getDefault(); 
      List terminals = factory.terminals().list(); 
      System.out.println("Terminals count: " + terminals.size()); 
      System.out.println("Terminals: " + terminals); 

      // Get the first terminal in the list 
      CardTerminal terminal = (CardTerminal) terminals.get(0); 

      // Establish a connection with the card using 
      // "T=0", "T=1", "T=CL" or "*" 
      Card card = terminal.connect("*"); 
      System.out.println("Card: " + card); 

      // Get ATR 
      byte[] baATR = card.getATR().getBytes(); 
      System.out.println("ATR: " + TestSmartCardIO.toString(baATR)); 

      CardChannel channel = card.getBasicChannel(); 

      /*SELECT Command 
      See GlobalPlatform Card Specification (e.g. 2.2, section 11.9) 
      CLA: 00 
      INS: A4 
      P1: 04 i.e. b3 is set to 1, means select by name 
      P2: 00 i.e. first or only occurence 
      Lc: 08 i.e. length of AID see below 
      Data: A0 00 00 00 03 00 00 00 
      AID of the card manager, 
      in the future should change to A0 00 00 01 51 00 00*/ 

      byte[] baCommandAPDU = {(byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00, (byte) 0x08, (byte) 0xA0, (byte) 0x00, 
            (byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00}; 
      System.out.println("APDU >>>: " + TestSmartCardIO.toString(baCommandAPDU)); 

      ResponseAPDU r = channel.transmit(new CommandAPDU(baCommandAPDU)); 
      System.out.println("APDU <<<: " + TestSmartCardIO.toString(r.getBytes())); 

      // Disconnect 
      // true: reset the card after disconnecting card. 

      card.disconnect(true); 
     } catch(Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

Я просто хотел проверить, распознана ли карта, и если я могу правильно отправлять APDU. Я пытаюсь выбрать диспетчер AID карты с помощью APDU, но я получаю:

Terminals count: 1 
Terminals: [PC/SC terminal OT MicroSD smartcard Reader 1] 
Card: PC/SC card in OT MicroSD smartcard Reader 1, protocol T=1, state OK 
ATR: 3BDB96081B1FE451F83031C0641A181019005D 
APDU >>>: 0A4408A00003000 
APDU <<<: 6A82 

И SW1 = 6A и SW2 = 82 означает, что карта не находит менеджера AID карты ... Это нормально? Я действительно не понимаю, интересно, связано ли это с тем, что карта использует протокол T = 1? Большое спасибо за помощь.

+1

Это не должно относиться к 'T = 1' и' T = 0', но, конечно, вы можете, конечно, попробовать 'T = 0' явно. Я пробовал вашу программу, и она работает нормально, я получаю ожидаемый длинный ответ с «0x9000» в качестве слова состояния. (За исключением того, что это должно быть ''% 02X "' в 'String.format()', в противном случае вы опустите начальные нули для значений <16.) Вы уверены, что ваша карта уже находится в состоянии жизненного цикла OP, которое имеет карточный менеджер? Уверены, что у вас есть AID * your * card manager. Вы также можете удалить некоторые байты и попробовать более короткую частичную команду SELECT, чтобы найти совпадение. –

+0

Ну, как я могу определить, находится ли моя карта в состоянии жизненного цикла OP, у которой есть менеджер карт? Я думаю, что он должен, но я не знаю, как быть уверен в этом ... я попытался также отправить Выберите команду: '00A4040000' и ​​я получаю странный ответ:' 6F6D847A00015100A562732F672A864886FC6B160C6A2A864886FC6B2211639672A864886FC6B364B692A864886FC6B4159F6E2A47905167823193220722249A801BF42801142425311434253114442531000000000009F651FF900', что я не понимаю .. Спасибо большое за ваше внимание. – Raoul722

+0

BTW AID менеджера карт может варьироваться между производителями и поколениями карт. Ваша AID работала только для одной из моих карт, которая является картой Visa, выпущенной OCS (Oberthur Card Systems).Это не сработало для карты Maestro, выпущенной G & D, а не для MasterCard (неизвестный мне эмитент). –

ответ

3

Ранее Глобальная платформа заимствовала RID (первые 5 байт AID) от VISA. Это связано с историческими причинами. Глобальная платформа теперь представляет собой отдельный объект, но Open Platform - как ее когда-то называли - была начата (по крайней мере) VISA. Есть many RID's registered.

Однако, из того, что я понял, VISA не хотела использовать Global Platform для использования своего RID. Поэтому был запрошен новый МПОГ. Вместо довольно низкого A000000003 RID, Global Platform теперь использует свои собственные: A000000151 RID. Другое отличие состоит в том, что последние байты (которые могут быть любыми, до 15 - 5 = 10 байтов, заданные организацией) теперь состоят из двух байтов вместо трех. Некоторые версии ОС фактически ошибаются и все еще используют три байта 00.

У вас раньше было A000000003 000000 для Open Platform и более ранних версий GP, а для более поздних карт или спецификаций Global Platform у вас есть A000000151 0000, чтобы выбрать менеджера карт. Обработка SELECT не совсем ясна из ISO/IEC 7816-4. В общем случае, если вы предоставите меньшую AID (не менее 5 байтов) в SELECT by NAME, тогда будет выбрано соответствующее приложение.

1

Просто дружественное напоминание о том, что работа с глобальными платформами/javacards «в дикой природе» может быть сложной задачей, все в порядке, зависит от многих факторов. Вы можете посмотреть на GlobalPlatformPro (ранее известный как GPJ).

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