Должно быть, я что-то делаю не так, но не вижу, что.
Я пытаюсь получить команду 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 0x88 («Ссылочные данные не найдены») для всех значений P2. Все карты, использующие T1, делают то же самое, за исключением случаев, когда P2 равен 0x81 — тогда они говорят 0x69 0x84 («Команда не разрешена, ссылочные данные недействительны»).
У рассматриваемых карт действительно есть ПИН-коды, и я могу проверить ПИН-код в программе «Конфигуратор токенов безопасности», предоставляемой поставщиком промежуточного программного обеспечения, поэтому я знаю, что все компоненты карты, считывателя и промежуточного программного обеспечения работают.
Это, вероятно, очевидно, но я новичок в программировании смарт-карт. Кто-нибудь может дать мне подсказку, где я иду не так?
Глобальный PIN-код имеет идентификатор 00
и PIN-код приложения карты PIV имеет 80
(шестнадцатеричное), поэтому ваши тесты не включают известные PIN-коды карты PIV.
Других решений пока нет …