ISO 15693: считывание нескольких блоков безопасности
Я пытаюсь изменить существующую команду SCardTransmit() (C#), которая в настоящее время считывает один статус / блок безопасности с RFID-карты в окрестностях ISO 15693 (TI Tag-it HF), чтобы получить статус безопасности для всех 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), представляют команду для получения статуса безопасности, за которой следует рассматриваемый блок и количество читаемых блоков. Единственное упоминание о состоянии безопасности, которое я видел, находится в разделе 10.3.4 в "Руководстве по разработке бесконтактного считывателя смарт-карт".
ПРИМЕЧАНИЕ. SmartCardTransmit заботится о вызове SCardTransmit с правильным дескриптором карты и другими необходимыми параметрами. Меня больше интересует формат заголовка отправки, который представляет запрос для блоков безопасности от 0 до 63.
2 ответа
К сожалению, это невозможно. Команда Получить состояние безопасности устройства чтения смарт-карт HID/Omnikey может извлекать статус безопасности только одного блока с каждой командой. Так что независимо от того, что 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;
}
Из этого документа: ссылка показывает, что ваш тег соответствует стандарту ISO15693. Из предоставленной вами документации видно, что нужная вам команда находится на стр. 59. Теперь из описания команды видно, что 0x01 - это версия, а следующие два байта (0x00 и 0x00) означают чтение по блокам. Байт перед Convert.ToByte() выглядит как MSB начального блока (0x00). Convert.ToByte() - младший бит начального блока. Следующим является Le в описании команды (количество блоков, которые нужно прочитать).