2015-11-02 48 views
1

我一定在做錯事,但我看不到什麼。如何在NIST PIV卡上實現VERIFY命令?

我試圖讓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; 
} 

所有P2的值(bytevector_t被定義爲std::vector<unsigned char>。)

所有使用協議T0返回的0x6A均爲0x88的卡( 「未找到引用的數據」)。所有使用T1的卡都執行相同的操作,除非P2是0x81 - 那麼他們說0x69 0x84(「命令不允許,參考數據無效」)。

有問題的卡片肯定有PIN碼,我可以在中間件供應商提供的「安全令牌配置程序」程序中驗證PIN碼,所以我知道卡片,讀卡器和中間件都可以工作。

這可能很明顯,但我是智能卡編程的新手。任何人都可以給我一個線索,哪裏出錯了?

+2

如果我正確讀取PIV卡規格,您應該嘗試全局PIN(0x00)或PIV卡應用程序PIN(0x80),以便在預期值以外進行測試。 –

+0

是的,我發現0x80是需要的值,並且當我看到您的評論時纔回到問題中注意。我還沒有意識到0x00會驗證全局PIN碼 - 謝謝。如果你能把它變成答案,我會很樂意接受它。 –

回答

2

全球個人識別號碼爲ID 00,PIV卡申請PIN碼爲80(十六進制),因此您的測試不包含已知的PIV卡PIN碼。