我正在尝试修改当前从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的请求。
答案 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命令描述(要读取的块数)。