如何在 NIST PIV 卡上实现 VERIFY 命令?
Posted
技术标签:
【中文标题】如何在 NIST PIV 卡上实现 VERIFY 命令?【英文标题】:How to implement VERIFY command on NIST PIV cards? 【发布时间】:2015-11-02 18:18:21 【问题描述】:我一定是做错了什么,但我看不出是什么。
我正在尝试使用 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 的卡对于所有 P2 值都返回 0x6a 0x88(“未找到引用的数据”)。所有使用 T1 的卡都这样做,除了 P2 为 0x81 时——然后他们说 0x69 0x84(“命令不允许,引用数据无效”)。
有问题的卡肯定有 PIN,我可以在中间件供应商提供的“Security Token Configurator”程序中验证 PIN,所以我知道卡、读卡器和中间件都在工作。
这可能很明显,但我是智能卡编程的新手。谁能告诉我哪里出错了?
【问题讨论】:
如果我正确阅读了 PIV 卡规格,您应该尝试使用全局 PIN (0x00) 或 PIV 卡应用程序 PIN (0x80),以便您在预期值之外进行测试。 是的,我发现 0x80 是所需的值,我只是在回到问题时注意到,当我看到你的评论时。不过,我还没有意识到 0x00 也会验证全局 PIN 码——谢谢。如果你能把它变成答案,我很乐意接受。 【参考方案1】:全局 PIN 的 ID 为 00
,PIV 卡应用程序 PIN 的 ID 为 80
(十六进制),因此您的测试不包括已知的 PIV 卡 PIN ID。
【讨论】:
以上是关于如何在 NIST PIV 卡上实现 VERIFY 命令?的主要内容,如果未能解决你的问题,请参考以下文章