Невозможно установить пароль для тегов 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);
}
}