2016-05-27 2 views
-2

Я использую библиотеку Java javax.smartcard для чтения данных со смарт-карты (SIM-карты). Но я не могу заставить мой код работать, чтобы проверить свой PIN-код. Вот мой код:Невозможно проверить PIN-код смарт-карты с помощью команды APDU

public class CopyOfCardReader { 

public static final CommandAPDU SELECT_FILE_EEEE = new CommandAPDU(new byte[] { 0x00, (byte) 0xA4, 0x01, 0x0C, 0x02, (byte) 0xEE, (byte) 0xEE }); 
public static final CommandAPDU SELECT_MASTER_FILE = new CommandAPDU(new byte[] { 0x00, (byte) 0xA4, 0x00, 0x0C }); 
public static final CommandAPDU DISABLE_PIN = new CommandAPDU(new byte[] { 0x00, (byte) 0x26, 0x00, 0x00 }); 

public static void main(String[] args) { 

    try { 

     TerminalFactory factory = TerminalFactory.getDefault(); 
     List<CardTerminal> terminals = null; 

     terminals = factory.terminals().list(); 

     System.out.println("Terminals: " + terminals); 
     CardTerminal terminal = terminals.get(0); 
     Card card = terminal.connect("T=0"); 
     System.out.println("card: " + card); 
     ATR atr = card.getATR(); 
     System.out.print("ATR: "); 

     for (byte b : atr.getBytes()) { 
      System.out.print(b); 
     } 
     System.out.println(); 
     CardChannel channel = card.getBasicChannel(); 


     byte[] pin = "1234".getBytes(); 
     byte arg0 = (byte) 0x00; 
     byte arg1 = (byte) 0x20; 
     byte arg2 = (byte) 0x00; 
     byte arg3 = (byte) 0x01; 
     CommandAPDU command = new CommandAPDU(arg0, arg1, arg2, arg3, pin); 
     ResponseAPDU request = channel.transmit(command); 
     System.out.println("answer pin verify request: " + request.toString()); // response 

     ResponseAPDU rmaster = channel.transmit(SELECT_MASTER_FILE); 
     System.out.println("answer rmaster file: " + rmaster.toString()); // response 
     System.out.println(); 

     ResponseAPDU rPinDiable = channel.transmit(new CommandAPDU(new byte[] { (byte) 0x00, (byte) 0x26, 0x00, 0x00 })); 
     System.out.println("answer DISABLE PIN: " + rPinDiable.toString()); // response 

     ResponseAPDU rverify2 = channel.transmit(new CommandAPDU(0x00, 0x20, 0x00, 0x01, new byte[] { 0x31, 0x32, 0x33, 0x34, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF })); 
     System.out.println("answer rverify2 pin2: " + rverify2.toString()); // response 

     byte[] pin2 = "1234".getBytes(); 
     byte arg02 = (byte) 0x01; 
     byte arg12 = (byte) 0x26; 
     byte arg22 = (byte) 0x00; 
     byte arg32 = (byte) 0x01; 
     CommandAPDU command2 = new CommandAPDU(arg02, arg12, arg22, arg32, pin2); 
     ResponseAPDU request2 = channel.transmit(command2); 
     System.out.println("answer pin disable request: " + request2.toString()); // response 

     byte[] baReadUID = new byte[5]; 
     baReadUID = new byte[] { (byte) 0xFF, (byte) 0xCA, (byte) 0x00, (byte) 0x00, (byte) 0x00 }; 
     command = new CommandAPDU(baReadUID); 
     ResponseAPDU r = channel.transmit(new CommandAPDU(new byte[] { 0X00, (byte) 0XA4, 0X00, 0X00, 0X02, 0X3F, 0X00 })); 
     System.out.println("answer r UID: " + r.toString()); // response 
     System.out.print("UUID: "); 
     for (byte b : r.getData()) { 
      System.out.print(b); // response 
     } 
     System.out.println(); 

     card.disconnect(false); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
}} 

И ниже выхода программы:

Terminals: [PC/SC terminal Gemalto USB SmartCard Reader 0] 
card: PC/SC card in Gemalto USB SmartCard Reader 0, protocol T=0, state OK 
ATR: 5959-106064-126-1110036-155151-1120 
answer pin verify request: ResponseAPDU: 2 bytes, SW=6708 
answer rmaster file: ResponseAPDU: 2 bytes, SW=9000 

answer DISABLE PIN: ResponseAPDU: 2 bytes, SW=6708 
answer rverify2 pin2: ResponseAPDU: 2 bytes, SW=6a88 
answer pin disable request: ResponseAPDU: 2 bytes, SW=6708 
answer r UID: ResponseAPDU: 37 bytes, SW=9000 
UUID: 9833-126212033-1252630-917-1281113-125236-15-11815-11731585-1-586-11210-12511 

Чтение мастер-файл и UUID является успешным, но все остальные инструкции не удалось. Есть ли кто-то, кто знает, что является проблемой с моим кодом? Пожалуйста помоги.

+0

Ваша AID кажется неправильной ... '6A82' означает, что« приложение не найдено ». – vojta

+0

Хорошо, я удалил эту команду для приложения sellecting. Кроме того, почему моя проверка PIN-кода не работает? Почему я получаю ошибку 6708 "length correct"? –

ответ

1

Обязательно прочитайте GMS 11.11.

Что касается VERIFY части, попробуйте:

byte[] pin = { (byte)0x31, (byte)0x32, (byte)0x33, (byte)0x34, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF}; 

, как PIN-код длиной 8 байт с более короткие значения быть дополнены с 0xFF (0x31, 0x32, 0x33 ... байты представляют собой ASCII символы '1', '2', '3' ...).

Это то, что сообщает слово состояния 67XX (неверный параметр P3, который в этом случае имеет длину). См. Раздел 9.4 для кодов состояния, с которыми вы можете столкнуться.

Некоторые случайные примечания:

  • ваши команды APDU должны иметь CLA байт установлен в 0xA0 (т.е. первый байт - The arg0 один).

  • Большинство ваших других команд довольно странно - я бы рекомендовал следовать за GSM 11.11.

  • Рассмотрите возможность разделения печатных байтов запятыми (то, что вы получаете сейчас, не читается).

  • Опасайтесь, что вы можете повредить свою карточку столь жестокими исследованиями.

Удачи вам!

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