Как отличить ошибку считывателя смарт-карт от ошибки смарт-карты

Я реализовал приложение Andoid - приложение на стороне сервера. Сервер взаимодействует со считывателем смарт-карт. Когда пользователь касается кнопки в приложении Android, создается соединение с сервером для аутентификации пользователя. Обмен сообщениями между приложением и сервером имеет следующий формат:

<type> 0x00 0x00 0x00 <length> 0x00 0x00 0x00 <[data]>
  • Если сообщение имеет значение типа 06, это указывает на ошибку в устройстве чтения смарт-карт.
  • Если сообщение имеет значение типа 07, это указывает на ошибку в смарт-карте.

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

// show the list of available terminals
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Terminals: " + terminals);
// get the first terminal
CardTerminal terminal = terminals.get(0);
// establish a connection with the card
Card card = terminal.connect("T=0");
System.out.println("card: " + card);
CardChannel channel = card.getBasicChannel();
ResponseAPDU r = channel.transmit(new CommandAPDU(c1));
System.out.println("response: " + toString(r.getBytes()));
// disconnect
card.disconnect(false);

API Smart Card IO имеет класс CardException для исключений. Моя проблема в том, что я не знаю, когда отправлять сообщение типа 06 или 07, потому что я не могу отличить ошибки, которые генерируются картой, и ошибки, которые генерируются считывателем, когда выбрасывается CardException. Как я могу это сделать?


person tree    schedule 15.06.2017    source источник


Ответы (1)


Метод transmit(), используемый в

ResponseAPDU r = channel.transmit(new CommandAPDU(c1));

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

Таким образом, вы можете поймать все ошибки, связанные с читателем, перехватив исключения:

try {
    ResponseAPDU r = channel.transmit(new CommandAPDU(c1));
} catch (IllegalStateException e) {
    // channel has been closed or if the corresponding card has been disconnected
} catch (CardException e) {
    // errors occured during communication with the smartcard stack or the card itself (e.g. no card present)
}

Ошибки, генерируемые платой, вместо этого указываются в виде кодов ошибок, закодированных в ответном слове состояния. Эти ошибки не генерируют исключения Java. Вы можете проверить эти ошибки, проверив слово состояния (метод getSW() из ResponseAPDU):

if (r.getSW() == 0x09000) {
    // success indicated by the card
} else {
    // error or warning condition generated by the card
}
person Michael Roland    schedule 19.06.2017