Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Создать безопасный канал между картой и терминалом

Автор вопроса: FatemehОтветов: 1

Я хочу создать безопасный канал между картой и терминалом. Это мой код:

    final static byte INIT_UPDATE       = (byte) 0x50;
    final static byte EXT_AUTHENTICATE  = (byte) 0x82;
    SecureChannel sc;

    public void process(APDU apdu) throws ISOException {
        if (selectingApplet()) {
        return;
        }
       byte[] buffer = apdu.getBuffer();
         short inlength = 0;

        try
        {
        switch (buffer[ISO7816.OFFSET_INS]) {

       case INIT_UPDATE:
             case EXT_AUTHENTICATE:
                    makeSecureChannel(apdu);
                break;
     }
  catch (CryptoException e)
     {
           short r = e.getReason();
          ISOException.throwIt(r);
      }

}

    private void makeSecureChannel(APDU apdu)
{

    byte[] buf = apdu.getBuffer();
    byte cla = buf[ISO7816.OFFSET_CLA];
    byte ins = buf[ISO7816.OFFSET_INS];

    try
    {
    apdu.setIncomingAndReceive();
    if(ins == INIT_UPDATE)
    {
        sc = GPSystem.getSecureChannel();
    }

    short len = sc.processSecurity(apdu);

    apdu.setOutgoing();
    apdu.setOutgoingLength(len);
    apdu.sendBytes(ISO7816.OFFSET_CDATA, (short) len);
    }
    catch(APDUException ex1)
    {
        ISOException.throwIt(ex1.getReason());
    }
}

когда я отправляю команду 80 50 20 00 08 01 15 6A 2A F5 64 87 CF, я получаю сообщение об ошибке 6a88, а когда я отправляю команду 00 50 20 00 08 01 15 6A 2A F5 64 87 CF, я получаю сообщение об ошибке 6e00. Может ли каждый орган помочь мне?

  • Можете ли вы локализовать ошибку в определенной строке кода? Вы можете отлаживать? Вы уверены, что ваша карта поддерживает этот вызов API глобальной платформы? Paul Bastian 29.11.2016
  • Вы выбрали свой апплет перед отправкой команды APDU? У вас на карте установлен ключ с версией ключа == 0x20? Если нет, замените 0x20 на 0x00. Ebrahim Ghasemi 29.11.2016

smartcardjava-mejavacard

Ответы

Ответ 1 · рейтинг 2 · Maarten Bodewes

Статусное слово 6E00 не очень интересно. Это означает, что вы отправляете неправильный байт CLA (класс). И это потому, что INITIALIZE UPDATE не определена в ISO 7816, поэтому это проприетарная команда. Для проприетарных команд должен быть установлен собственный бит. Таким образом, байт класса 80 является единственно правильным.

Это не по пути, давайте сосредоточимся на ответе INIT UPDATE: 6A88. 6A88 означает "справочные данные не найдены". Вероятно, это означает, что ключи, на которые ссылаются P1 и P2, не совпадают. Поместите P1 и P2 в 00, чтобы убедиться, что ключ выбран автоматически (и проверьте "информацию о ключе" в данных ответа, если вы хотите явно выбрать версию ключа в P1).

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы