Не удается выбрать AID Card Manager при тестировании для отправки APDU

1

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

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 Card Manager с помощью 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 вашего карточного менеджера? Вы также можете удалить несколько байтов и попробовать более короткую частичную команду SELECT, чтобы найти совпадение.
  • 0
    Хорошо, как я могу определить, находится ли моя карта в состоянии жизненного цикла OP, в котором есть менеджер карт? Я думаю , что он должен , но я не знаю , как быть уверен в этом ... Я попытался также отправить Команда SELECT: 00A4040000 и я получаю странный ответ: 6F6D847A00015100A562732F672A864886FC6B160C6A2A864886FC6B2211639672A864886FC6B364B692A864886FC6B4159F6E2A47905167823193220722249A801BF42801142425311434253114442531000000000009F651FF900 , что я не понимаю ... Большое спасибо на ваше рассмотрение
Показать ещё 5 комментариев
Теги:
applet
apdu
javacard
pcsc

2 ответа

3
Лучший ответ

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

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

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

1

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню