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 в описании команды (количество блоков, которые нужно прочитать).

Другие вопросы по тегам