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

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

    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. Может ли каждый орган помочь мне?


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


Ответы (1)


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

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

person Maarten Bodewes    schedule 29.11.2016