ISO 15693:读取多个安全块

时间:2013-12-18 20:36:35

标签: rfid pcsc contactless-smartcard winscard iso-15693

我正在尝试修改当前从ISO 15693附近RFID卡(TI Tag-it HF)读取一个安全状态/块的现有SCardTransmit()命令(C#),以及将检索所有安全状态的一个卡上64块。现有代码如下:

Byte[] sendHeader = { 0xFF, 0x30, 0x00, 0x03, 0x05, 0x01, 0x00, 0x00, 0x00, Convert.ToByte(blockNum), 0x01 };

Byte[] sendBuffer = new Byte[255]; //Send Buffer in SCardTransmit
int sendbufferlen;                 //Send Buffer length in SCardTransmit

SmartCardData pack = new SmartCardData();

sendHeader.CopyTo(sendBuffer, 0);
sendbufferlen = Convert.ToByte(sendHeader.Length);

SCardTransmitReceived rxBuf = SmartCardTransmit(sendBuffer, sendbufferlen);

我理解它的方式,Convert.ToByte(blockNum)之前的字节表示获取安全状态的命令,后面跟着有问题的块,以及要读取的块数。我见过的关于安全状态读取的唯一参考是在"Contactless Smart Card Reader Dev Guide"

的第10.3.4节中

注意:SmartCardTransmit负责使用正确的卡句柄和其他所需参数调用SCardTransmit。我对发送标头的格式更感兴趣,它表示对安全块0到63的请求。

2 个答案:

答案 0 :(得分:2)

不幸的是,这是不可能的。 HID / Omnikey智能卡读卡器的Get Security Status命令只能使用每个命令检索一个块的安全状态。因此,无论您尝试提供哪个Le字节,读者始终只返回您使用blockNum指定的块的安全状态。

因此,获取所有块的安全状态的唯一方法是迭代所有块并为每个块发出命令:

bool moreBlocks = true;
int blockNum = 0;
while (moreBlocks) {
    byte[] sendBuffer = {
        0xFF, 0x30, 0x00, 0x03,
        0x05,
        0x01,
        0x00, 0x00,
        (byte)((blockNum>>8) & 0xFF), (byte)(blockNum & 0xFF),
        0x00
    };
    SCardTransmitReceived rxBuf = SmartCardTransmit(sendBuffer, sendBuffer.Length);
    moreBlocks = check_if_rxBuf_ends_with_sw9000(rxBuf);
    ++blockNum;
}

答案 1 :(得分:0)

从这份文件: link  您的标签似乎符合ISO15693标准。从您提供的文档中可以看出,您需要的命令位于第59页。现在,从命令描述中可以看出0x01是版本,后面两个字节(0x00和0x00)表示逐块读取。 Convert.ToByte()之前的字节接缝为起始块的MSB(0x00)。 Convert.ToByte()是起始块的LSB。接下来是Le in命令描述(要读取的块数)。