smartcard - SCardTransmit() 总是返回错误

标签 smartcard rfid smartcard-reader

我正在使用 Microsoft SmartCard APIs 开发 SCM 非接触式 RFID 读卡器。

据我了解,与智能卡交互的通常过程是:
1. 使用 SCardEstablishContext() 建立上下文
2. 使用 SCardListReaders() 列出连接到系统的所有读卡器
3. 选择一个读卡器并等待卡插入其中。
4. 一旦检测到卡,函数 SCardGetStatusChange() 返回。
5. 使用 SCardConnect() 通过选定的读卡器连接到卡
6. 使用 SCardTransmit() 与卡对话

直到 5 的所有步骤都工作正常,这意味着我得到了正确的卡句柄。可以通过发出 SCardStatus() 函数进一步验证卡,该函数返回协商的协议(protocol)和卡的 ATR,这也是正确的。但是当我尝试使用 SCardTransmit() 发送任何 APDU 命令时,它会返回错误(错误代码 14,我猜是 SCARD_E_CANT_DISPOSE)。

我不知道出了什么问题或缺少什么。我尝试了不同的 APDU,例如通过发出 {0xFF, 0xCA, 0x00, 0x00, 0x00} 读取卡 UID 的非常基本的 APDU。我使用 SCM TestResMan 调试工具验证了此 APDU,它返回了卡的正确 UID。我正在使用 MiFARE 1k 卡和 SCM 非接触式 SCL011 读卡器。

请在下面找到 SCardTransmit() 代码片段(之前的所有函数都返回成功)。

SCARD_IO_REQUEST sioreq;
sioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1
sioreq.cbPciLength = 8;

SCARD_IO_REQUEST rioreq;
rioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1
rioreq.cbPciLength = 8;

byte sendbuffer[256], receivebuffer[256];
ULONG sendbufferLen, receivebufferLen, sizeofUID;

sendbuffer[0] = 0xFF; // CLA - Instruction Class
sendbuffer[1] = 0xCA; // Instruction code
sendbuffer[2] = 0x00; // P1 - 1st parameter
sendbuffer[3] = 0x00; // P2 - 2nd parameter
sendbuffer[4] = 0x00;
sendbufferLen = 0x05;

retval = objScWrapper->SCardTransmit(hCardHandle, &sioreq, sendbuffer,
                                     sendbufferLen, NULL, receivebuffer, 
                                     &receivebufferLen);

如果有人有任何线索或指示,请告诉我......
蒂亚!!

最佳答案

您的接收缓冲区大小为 256 字节,但您请求 256 字节 (Le = 00h),并且接收缓冲区还需要状态字(由两个字节组成,SW1 和 SW2)。

所以我认为您的 14 错误代码是接收缓冲区的通用 OUT_OF_MEMORY。

您的命令缓冲区也太小,无法容纳 5 字节 header + 最大 255 字节命令数据。当然,两者都太小,无法处理扩展长度的 ADPU。

Windows 目前对于 PCSC 兼容读卡器的智能卡读卡器缓冲区大小非常挑剔。命令缓冲区至少使用 5 + 255 = 260 字节,接收缓冲区至少使用 256 + 2 字节。重用缓冲区或安全地处理它们,否则将会出现内存泄漏。

关于smartcard - SCardTransmit() 总是返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9131101/

相关文章:

iphone - 智能手机可以从几英尺的距离(不是 NFC)读取 RFID 标签吗?

android - 让 NFC 读写器检测到安卓手机(基本 NFC)

python - 使用Python从RFID卡中读取唯一ID

c# - 需要有关密码算法的建议

java - 通过js调用访问小程序中的智能卡 keystore

credit-card - 为什么在 EMV 卡中重复数据

javascript - 通过网络浏览器访问智能卡读卡器?

java - 尝试使用智能卡 I/O API 读取和写入字符串到智能卡

NFC 标准(NFC 论坛、ISO/IEC、ECMA

php - 将 RFID 与 PHP 集成