Невозможно установить пароль для тегов NXP (iCODE SLIX), используя PCSC

Я пытаюсь установить пароль EAS/AFI для тега ICODE SLIX (SL2S2002). В соответствии с официальными инструкциями NXP ( ЗДЕСЬ, стр. 15) я должен отправить команду GET RANDOM NUMBER (0xB2). Метка должна отправить мне случайное число, которое я буду использовать для расчета пароля, а затем отправить команду SET PASSWORD.

Проблема в том, что когда я посылаю GET RANDOM NUMBER, метка не возвращает никаких данных, только поля SW1 и SW2, которые имеют SW1=6A и SW2=81, что переводится как "Функция не поддерживается". Я не могу понять, что я делаю неправильно, поскольку я знаю, что этот тег наверняка поддерживает защиту паролем EAS/AFI.

Ниже мой код:

var contextFactory = ContextFactory.Instance;
using (var context = contextFactory.Establish(SCardScope.System))
{

    string readerName = "Jinmuyu Electronics Co., Ltd. MR800 0";

    using (var rfidReader = new SCardReader(context))
    {
        var sc = rfidReader.Connect(readerName, SCardShareMode.Shared, SCardProtocol.Any);
        if (sc != SCardError.Success)
        {
            Console.WriteLine("Could not connect to reader {0}:\n{1}",
                readerName,
                SCardHelper.StringifyError(sc));
            return;
        }

        sc = rfidReader.BeginTransaction();
        if (sc != SCardError.Success)
        {
            Console.WriteLine("Could not begin transaction.");
            return;
        }

        var receivePci = new SCardPCI(); // IO returned protocol control information.
        var sendPci = SCardPCI.GetPci(rfidReader.ActiveProtocol);
        var receiveBuffer = new byte[256];
        var command = new byte[] {
                                    0xFF, // CLASS
                                    0xB2, // INSTRUCTIONS
                                    0x40, // P1 ManCODE
                                    0x41, 0x67, 0x27, 0x60, 0x50, 0x01, 0x04, 0xE0 // UID  
                                };

        sc = rfidReader.Transmit(
            sendPci, // Protocol Control Information (T0, T1 or Raw)
            command, // command APDU
            receivePci, // returning Protocol Control Information
            ref receiveBuffer); // data buffer

        if (sc != SCardError.Success)
        {
            Console.WriteLine("Error: " + SCardHelper.StringifyError(sc));
        }

        var responseApdu = new ResponseApdu(receiveBuffer, IsoCase.Case2Short, rfidReader.ActiveProtocol);

        // TREAT THE DATA 
        string dataW = "--- unknown ---";
        string SW1 = "X";
        string SW2 = "X";

        if (responseApdu.HasData)
        {

            dataW = BitConverter.ToString(responseApdu.GetData()); // .Replace("-","")
        }

        Console.WriteLine("SW1: {0:X2}, SW2: {1:X2}\nDATA: {2}", responseApdu.SW1, responseApdu.SW2, dataW);

        // HANDLE THE READER 
        rfidReader.EndTransaction(SCardReaderDisposition.Leave);
        rfidReader.Disconnect(SCardReaderDisposition.Reset);

    }
}

0 ответов

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