2015-11-02 1 views
1

Должно быть, я делаю что-то неправильно, но я не вижу, что.Как реализовать команду VERIFY на картах NIST PIV?

Я пытаюсь получить команду VERIFY, чтобы показать количество оставшихся попыток. (Я пытался ввести PIN-код, а также, но сократить до этого, когда я ничего не мог работать получить.) Вот фрагмент кода, который я пытался:

for (unsigned int basebyte = 0x00; basebyte != 0x100; basebyte += 0x80) { 
    for (unsigned char add = 0x01; add != 0x20; ++add) { 
     smartcard::bytevector_t b; 
     b.push_back(0x00); // CLA 
     b.push_back(0x20); // INS 
     b.push_back(0x00); // P1 
     b.push_back(basebyte + add); // P2 ("the sensible ranges are 0x01..0x1F and 0x81..0x9F") 
     //b.push_back(0x00); // Lc field -- length of the following data field 
     b = card.rawTransmit(b); 
     if (!card.status()) { 
      cout << "Received error '" << card.status() << "'" << endl; 
     } else { 
      if (b[0] == 0x6a && b[1] == 0x88) { 
       // "Referenced data not found" 
       continue; 
      } 

      cout << " Attempts remaining (" << std::hex << (basebyte + add) << std::dec << "): "; 
      cout << std::hex; 
      for (smartcard::bytevector_t::const_iterator i = b.begin(), ie = b.end(); 
       i != ie; ++i) cout << std::setfill('0') << std::setw(2) << int(*i) << ' '; 
      cout << std::dec << endl; 
     } 
    } 
} 

rawTransmit функция .. .

bytevector_t rawTransmit(bytevector_t sendbuffer) { 
    SCARD_IO_REQUEST pioSendPci, pioRecvPci; 
    if (mProtocol.value() == SCARD_PROTOCOL_T0) { 
     pioSendPci = pioRecvPci = *SCARD_PCI_T0; 
    } else if (mProtocol.value() == SCARD_PROTOCOL_T1) { 
     pioSendPci = pioRecvPci = *SCARD_PCI_T1; 
    } else { 
     std::ostringstream out; 
     out << "unrecognized protocol '" << mProtocol.str() << "'"; 
     throw std::runtime_error(out.str()); 
    } 

    DWORD rlen = 256; 
    bytevector_t recvbuffer(rlen); 
    mResult = SCardTransmit(mHandle, &pioSendPci, &sendbuffer[0], 
     DWORD(sendbuffer.size()), &pioRecvPci, &recvbuffer[0], &rlen); 
    recvbuffer.resize(rlen); 
    return recvbuffer; 
} 

(bytevector_t определяется как std::vector<unsigned char>.)

Все карты, использующие протокол T0 возврата 0x6a 0х88 ("Ссылочные данные не найдены") для всех значений P2. Все карты, использующие T1, делают то же самое, за исключением случаев, когда P2 равен 0x81 - тогда они говорят 0x69 0x84 («Команда не разрешена, данные, на которые ссылаются данные недействительны»).

В карточках, у которых есть определенные вопросы, есть ПИН-коды, и я могу проверить PIN-код в программе «Конфигуратор токена безопасности», предоставляемой поставщиком промежуточного программного обеспечения, поэтому я знаю, что все карты работают с картой, считывателем и промежуточным программным обеспечением.

Это, вероятно, очевидно, но я новичок в программировании смарт-карт. Может ли кто-нибудь дать мне подсказку, где я ошибаюсь?

+2

Если я правильно прочитал спецификации PIV карты, вы должны попробовать Глобальный PIN-код (0x00) или PIN-код приложения PIV (0x80), чтобы вы тестировали вне ожидаемых значений. –

+0

Да, я обнаружил, что значение 0x80 было необходимым и просто возвращалось к вопросу, чтобы отметить, что когда я увидел ваш комментарий. Я не понял, что 0x00 будет проверять глобальный PIN-код, хотя, спасибо. Если вы превратите это в ответ, я с радостью приму его. –

ответ

2

Глобальный PIN-код имеет идентификатор 00, а PIN-код приложения PIV Card имеет 80 (шестнадцатеричный), поэтому ваши тесты не включают в себя известные идентификаторы PIN-кода PIV.