Не удалось получить ATR второй карты при использовании смарт-карты ввода-вывода

Для некоторого фона я использовал команду In_List_Passive_Target, указанную в руководстве пользователя PN532, для получения UID всех карт в поле терминалов. Я также использую псевдокоманду FF 00 00 00 04 для ACR122U, чтобы отправить эти команды на PN532.

>>  FF 00 00 00 04 D4 4A 01 00           # In_List_Passive_Target (1)
<<  D5 4B 01 01 00 04 08 04 3E 58 A7 D1  # Response including UID (1)
>>  FF 00 00 00 04 D4 4A 01 00           # In_List_Passive_Target (2)
<<  D5 4B 01 01 00 04 08 04 9E 69 A7 D1  # Response including UID (2)
>>  FF 00 00 00 04 D4 4A 01 00           # In_List_Passive_Target (3)
<<  D5 4B 00                             # No more cards in field (3)

Теперь, когда я сделал это, я хочу выбрать их один за другим. Я могу сделать это, остановив карту (In_Deselect), когда закончу с ней, а затем выбрав следующую с помощью команды In_List_Passive_Target с ее UID.

Однако каждый раз, когда я выбираю карту, я хочу знать ATR, который она возвращает. Это оказывается сложным с API Java Smart Card IO, поскольку объект карты, созданный терминалом, всегда является одной и той же картой (и, следовательно, возвращает один и тот же ATR), даже если я отключу карту, а затем создам новую. Это странно, учитывая, что если я общаюсь с картой через команду терминала PN532 In_Data_Exchange, это правильная другая карта (а не старая, доступная через объект карты). Мне нужно, чтобы ATR мог определить тип карты (Mifare Classic, Desfire, Ultralight и т. д.).

Вот функция, которую я создал для сбора карт:

public static void getCardsInField()
    {
        cardList = new ArrayList<AbstractCard>();
        Boolean loop = true;

        // Card already connected to the terminal
        byte[] firstCardUID = transmitADPUCommand(GET_ADDRESS);
        MifareClassic firstCard = new MifareClassic(cardChannel, firstCardUID);
        cardList.add(firstCard);

        System.out.println(firstCard);
        System.out.println(readable(card.getATR().getBytes()));

        while(loop)
        {
            byte[] inDeselectResponse = transmitADPUCommand(IN_DESELECT); // Deselect current card
            byte[] inListPassiveTargetsResponse = transmitADPUCommand(IN_LIST_PASSIVE_TARGETS); // Select a new card

            System.out.println(">>  " + readable(IN_LIST_PASSIVE_TARGETS));
            System.out.println("<<  " + readable(inListPassiveTargetsResponse));

            // Trying to create a new card object for new card
            try
            {
                card.disconnect(true);
                card = cardTerminal.connect("*");
                cardChannel = card.getBasicChannel();
            }
            catch (CardException e)
            {
                e.printStackTrace();
            }

            if (Arrays.equals(inListPassiveTargetsResponse, IN_LIST_PASSIVE_TARGET_RESPONSE_NO_TARGETS)) // no more targets
            {
                loop = false;
            }
            else
            {
                byte[] loopCardUID = extractUID(inListPassiveTargetsResponse);
                MifareClassic loopCard = new MifareClassic(cardChannel, loopCardUID);
                cardList.add(loopCard);

                System.out.println(loopCard);
                System.out.println(readable(card.getATR().getBytes())); // this should be different ATR but it is the old cards atr
            }
        }
    }

person ritch    schedule 04.04.2015    source источник
comment
Могу я попросить вас сказать мне, в чем разница между UID и ATR и ATS?   -  person Ebrahim Ghasemi    schedule 05.04.2015


Ответы (1)


Бесконтактные карты не имеют ATR (ответ на сброс). ATR генерируется только контактными картами (ISO/IEC 7816-3 в ответ на отключение вывода сброса). Кроме того, PC/SC эмулирует ATR для бесконтактных карт (на основе определенных параметров карты), так как PC/SC изначально был разработан для контактных карт и, следовательно, PC/SC API ожидает наличия ATR.

Вместо этого бесконтактные карты имеют другие значения. Например, карта, основанная на стандарте ISO/IEC 14443 Type A, имеет ATQA (SENS_RES), SAK (SEL_RES), UID (NFCID1) и, возможно, ATS (что близко к ATR). Бесконтактные карты, основанные на стандарте ISO/IEC 14443 Type B, имеют аналогичные значения.

Всю информацию, которая необходима для определения типа карты, вы получаете в ответ на команду InListPassiveTarget:

Card 1: D5 4B 01 01 00 04 08 04 3E 58 A7 D1
Card 2: D5 4B 01 01 00 04 08 04 9E 69 A7 D1

Для карты 1 эти данные декодируются в:

  • ATQA (SENS_RES) = 00 04
  • САК (SEL_RES) = 08
  • UID (NFCID1) = 3E 58 A7 D1
  • АТС = нет

Для карты 2 эти данные декодируются в:

  • ATQA (SENS_RES) = 00 04
  • САК (SEL_RES) = 08
  • UID (NFCID1) = 9E 69 A7 D1
  • АТС = нет

Следовательно, обе карты имеют ATQA = 00 04 и SAK = 08, что означает, что они, скорее всего, MIFARE Classic 1K или MIFARE Plus.

Подробный список значений для идентификации ISO/IEC 14443 см. в Процедуре идентификации типа MIFARE. Карты типа A от NXP.

person Michael Roland    schedule 03.10.2015