2017-01-17 10 views
0

Я собрал следующий пример кода для обнаружения смарт-карт Mifare с помощью библиотеки javax.smartcardio. Этот код отлично подходит для перечисленных типов Mifare.Как вы можете использовать javax.smartcardio для обнаружения дескриптивной карты?

public class DetectCardTester { 
    private static final String PROTOCOL = "T=1"; 

    static Map<String,String> KNOWN_CARD_TYPES = ImmutableMap.<String, String>builder() 
     .put("00-01", "Mifare 1K") 
     .put("00-02", "Mifare 4K") 
     .put("00-03", "Mifare Ultralight") 
     .put("00-26", "Mifare Mini") 
     .build(); 

    public static void main(String... args) { 
     try { 
      final TerminalFactory terminalFactory = SmartcardTerminalFactory.create(); 
      System.out.println("Place card on the reader"); 
      final Card card = awaitCard(terminalFactory, 3, SECONDS); 
      final ATR atr = card.getATR(); 
      final byte[] bytes = atr.getBytes(); 

      System.out.println("ATR=" + String.valueOf(Hex.encodeHex(bytes, false))); 

      if (bytes != null && bytes.length > 13) { 
       String typeCode = String.format("%02X-%02X", bytes[13], bytes[14]); 
       if (KNOWN_CARD_TYPES.containsKey(typeCode)) { 
        System.out.println("Known Type:" + KNOWN_CARD_TYPES.get(typeCode)); 
       } else { 
        System.out.println("Unknown Type:" + typeCode); 
       } 
      } 
      // TODO: Detect Desfire Card 

     } catch (Throwable t) { 
      t.printStackTrace(); 
     } 
    } 


    public static Card awaitCard(final TerminalFactory terminalFactory, final int qty, final TemporalUnit unit) throws CardException { 

     LocalDateTime timeout = now().plus(qty, unit); 
     while (now().isBefore(timeout)) { 
      Optional<CardTerminal> cardTerminal = getCardPresentTerminal(terminalFactory); 
      if (cardTerminal.isPresent()) { 
       return cardTerminal.get().connect(PROTOCOL); 
      } 
     } 
     throw new CardNotPresentException("Timed out waiting for card"); 
    } 

    private static Optional<CardTerminal> getCardPresentTerminal(final TerminalFactory terminalFactory) throws CardException { 
     List<CardTerminal> terminals = terminalFactory.terminals().list(); 

     for (CardTerminal cardTerminal : terminals) { 

      if (cardTerminal.isCardPresent()) { 
       return Optional.of(cardTerminal); 
      } 
     } 

     for (CardTerminal cardTerminal : terminals) { 

      // waitForCardPresent/Absent doesn't work with some Jacax.smartcard.io implementations 
      // i.e. OSX http://bugs.java.com/view_bug.do?bug_id=7195480 
      // This is why we have the imediate check above 
      if (cardTerminal.waitForCardPresent(250)) { 
       return Optional.of(cardTerminal); 
      } 
     } 

     return Optional.empty(); 
    } 
} 

Я использовал следующие ресурсы, чтобы поместить этот код вместе:

Я хотел бы реализовать TODO комментарий для обнаружения DESFire карт. Если я помещаю карту DESFire на чтение этого кода просто выводит:

Place card on the reader 
ATR=3B8180018080 

Я нашел этот вопрос Determine card type from ATR который помогает немного, но я что-то отсутствует. Для этой карточки HistoryByte является 0x80, для которой я не могу найти никакой информации.

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

+0

Как насчет пользовательских ATS для ваших карт? Или отправить GetVersion?Или отправить некоторую команду в native DESFire, а не завернуть. У меня нет другого варианта, так как это ISO14443-4A. Даже используя SAK (недоступно на Java), вы можете столкнуться с конфликтами. – jlanza

+0

Спасибо за предложение. Я не уверен, как отправить ATS с использованием Java, а также не уверен, как использовать его для обеспечения карты карты Desfire. Я думал об использовании GetVersion, но это похоже на взломать! – bludginozzie

+0

ATS будет специально для вашей карты не DESFire или, по крайней мере, я так думаю. Затем это то, что вы настраиваете на своей карте. Что касается GetVersion как взлома, я думаю, что это карта типа 4A, иначе было бы трудно. На самом деле, кто-то может реализовать на JavaCard аналогичную команду и подделку - это карта DESFire :( – jlanza

ответ

0

Ответ на перезагрузку (ATR), вероятно, является хорошим показателем того, какая у вас карта. SPEC, которым вы пользуетесь, называется «7816-3» в разделе 8. Его фактически оплачивается по спецификации, но если вы хорошо владеете Google ...

Во всяком случае, характеристики SIM-карты сложны для понимания, они определены хорошо, но вам нужно спуститься до уровня бит, чтобы полностью понять его.

АТР декодируется в байтах, позволяет декодировать вашу конкретную ATR:

Байт 1 Вызывается «TS», оно определяется как либо быть 3B или 3F, где 3F означает «обратную конвенцию», используемый и 3B «прямой конвенции»

Byte2 Вызывается «T0», он определяется как «символ формата». первый полубайт этого байта «8» относится к параметру Y1, а второй полубайт относится к параметру «K». Ваш «T0» первый полубайт Y1 = 8 и второй кусок K = 1 Параметр Y1 8 = (в двоичном выражении) 1000 означает только параметр TA1. , если оно было 9 = (в двоичном выражении) 1001, означающее включение TA1 (1) TB1 выключен (0) TC1 выключен (0) и TD1 включен (1). K определяет количество исторических байтов, то есть 1 исторический байт в вашем случае.

Чтобы сократить длинную историю, да, «80» - это ваш исторический байт (определенный в спецификации 7816-4). 80 - это самый простой исторический байт, который вы можете иметь. 80 является «индикатором категории/состояние» и все 80 определяется в виду:

A status indicator (one, two or three bytes) may be present in an optional COMPACT-TLV data object 

ключевое слово «может присутствовать», т.е. в вашем случае они решили не включать дополнительную информацию.

На ваш вопрос, чтобы проверить ATR, соответствующее точной величине «3B8180018080», должно быть достаточно для идентификации карты DESfire. Однако в моем приложении я также использовал либо наличие определенного файла (т. Е. Только на карте отказа), либо содержимое файла, либо доступность специального приложения для карты с помощью AID для более точной классификации карты.

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

  • Нет связанных вопросов^_^