mirror of
https://gitlab.com/fabinfra/fabaccess/borepin.git
synced 2025-06-11 19:13:23 +02:00
Added: Complete Real Test
This commit is contained in:
@ -1,308 +0,0 @@
|
||||
using NFC;
|
||||
using NFC.Crypto;
|
||||
using NFC.Mifare_DESFire;
|
||||
using NFC.Readers.PCSC;
|
||||
using NUnit.Framework;
|
||||
using NUnit.Framework.Constraints;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace NFC_Test.NXP_MIFARE_DESFire
|
||||
{
|
||||
/// <summary>
|
||||
/// Test all DESFire Commands with empty Card
|
||||
/// </summary>
|
||||
[Description("Test with real DESFire Card")]
|
||||
[Explicit]
|
||||
public class Command_Card_Test
|
||||
{
|
||||
public readonly string ReaderID = "";
|
||||
public readonly UInt32 AID = 0xAAFFEE;
|
||||
public readonly string AES_Key_Master = "25432A462D4A614E645267556B587032";
|
||||
public readonly string AES_Key_1 = "50645367566B59703373367638792F42";
|
||||
|
||||
/// <summary>
|
||||
/// Get ReaderIDs form PC/SC API
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void GetReaderIDs()
|
||||
{
|
||||
IHardware hardware = new Hardware();
|
||||
string[] readers = hardware.GetReaders();
|
||||
|
||||
Console.WriteLine("Readers detected: {0}", readers.Length);
|
||||
|
||||
if (readers.Length > 0)
|
||||
{
|
||||
Console.WriteLine("List of ReaderIDs:");
|
||||
foreach (string readerID in readers)
|
||||
{
|
||||
Console.WriteLine("{0}", readerID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Connect()
|
||||
{
|
||||
IHardware hardware = new Hardware();
|
||||
IReader reader = hardware.OpenReader(ReaderID);
|
||||
|
||||
bool connected_successfully = false;
|
||||
|
||||
ReaderEventHandler handler = (sender, card) =>
|
||||
{
|
||||
card.Connect();
|
||||
|
||||
connected_successfully = true;
|
||||
|
||||
card.Disconnect();
|
||||
};
|
||||
|
||||
reader.CardDiscovered += handler;
|
||||
reader.Start();
|
||||
|
||||
Assert.AreEqual(true, connected_successfully);
|
||||
|
||||
reader.Stop();
|
||||
reader.CardDiscovered -= handler;
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Format()
|
||||
{
|
||||
IHardware hardware = new Hardware();
|
||||
IReader reader = hardware.OpenReader(ReaderID);
|
||||
|
||||
bool test_successfully = false;
|
||||
|
||||
ReaderEventHandler handler = (sender, card) =>
|
||||
{
|
||||
card.Connect();
|
||||
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(card);
|
||||
|
||||
desfire.Format();
|
||||
|
||||
test_successfully = true;
|
||||
|
||||
card.Disconnect();
|
||||
};
|
||||
|
||||
reader.CardDiscovered += handler;
|
||||
reader.Start();
|
||||
|
||||
Assert.AreEqual(true, test_successfully);
|
||||
|
||||
reader.Stop();
|
||||
reader.CardDiscovered -= handler;
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SelectApplication()
|
||||
{
|
||||
IHardware hardware = new Hardware();
|
||||
IReader reader = hardware.OpenReader(ReaderID);
|
||||
|
||||
bool test_successfully = false;
|
||||
|
||||
ReaderEventHandler handler = (sender, card) =>
|
||||
{
|
||||
card.Connect();
|
||||
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(card);
|
||||
|
||||
desfire.SelectApplication(0x000000);
|
||||
|
||||
test_successfully = true;
|
||||
|
||||
card.Disconnect();
|
||||
};
|
||||
|
||||
reader.CardDiscovered += handler;
|
||||
reader.Start();
|
||||
|
||||
Assert.AreEqual(true, test_successfully);
|
||||
|
||||
reader.Stop();
|
||||
reader.CardDiscovered -= handler;
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Authenticate_DES()
|
||||
{
|
||||
IHardware hardware = new Hardware();
|
||||
IReader reader = hardware.OpenReader(ReaderID);
|
||||
|
||||
bool test_successfully = false;
|
||||
|
||||
ReaderEventHandler handler = (sender, card) =>
|
||||
{
|
||||
card.Connect();
|
||||
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(card);
|
||||
|
||||
desfire.SelectApplication(0x000000);
|
||||
|
||||
CipherKey key = new CipherKey(CipherType.TDES);
|
||||
desfire.AuthenticateISO_DES(0x00, key._Key);
|
||||
|
||||
test_successfully = true;
|
||||
|
||||
card.Disconnect();
|
||||
};
|
||||
|
||||
reader.CardDiscovered += handler;
|
||||
reader.Start();
|
||||
|
||||
Assert.AreEqual(true, test_successfully);
|
||||
|
||||
reader.Stop();
|
||||
reader.CardDiscovered -= handler;
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void CreateApplication()
|
||||
{
|
||||
IHardware hardware = new Hardware();
|
||||
IReader reader = hardware.OpenReader(ReaderID);
|
||||
|
||||
bool test_successfully = false;
|
||||
|
||||
ReaderEventHandler handler = (sender, card) =>
|
||||
{
|
||||
card.Connect();
|
||||
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(card);
|
||||
|
||||
CipherKey key = new CipherKey(CipherType.TDES);
|
||||
desfire.AuthenticateISO_DES(0x00, key._Key);
|
||||
|
||||
byte keysetting1 = desfire.GenerateKeySetting1(NFC.Mifare_DESFire.Enums.ChangeApplicationKey.ALLKEYS, NFC.Mifare_DESFire.Enums.ChangeMasterKeySettings.WITHMASTERKEY, NFC.Mifare_DESFire.Enums.CreateDeleteFile.NOKEY, NFC.Mifare_DESFire.Enums.FileDirectoryAccess.NOKEY, NFC.Mifare_DESFire.Enums.ChangeMasterKey.CHANGEABLE);
|
||||
byte keysetting2 = desfire.GenerateKeySetting2(NFC.Mifare_DESFire.Enums.CryptoOperationsType.AES, NFC.Mifare_DESFire.Enums.FileIdentifies.NOTUSED, 2);
|
||||
|
||||
desfire.CreateApplication(AID, keysetting1, keysetting2);
|
||||
|
||||
test_successfully = true;
|
||||
|
||||
card.Disconnect();
|
||||
};
|
||||
|
||||
reader.CardDiscovered += handler;
|
||||
reader.Start();
|
||||
|
||||
Assert.AreEqual(true, test_successfully);
|
||||
|
||||
reader.Stop();
|
||||
reader.CardDiscovered -= handler;
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Authenticate_AES()
|
||||
{
|
||||
IHardware hardware = new Hardware();
|
||||
IReader reader = hardware.OpenReader(ReaderID);
|
||||
|
||||
bool test_successfully = false;
|
||||
|
||||
ReaderEventHandler handler = (sender, card) =>
|
||||
{
|
||||
card.Connect();
|
||||
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(card);
|
||||
|
||||
desfire.SelectApplication(AID);
|
||||
|
||||
CipherKey key = new CipherKey(CipherType.AES);
|
||||
desfire.AuthenticateISO_AES(0x00, key._Key);
|
||||
|
||||
test_successfully = true;
|
||||
|
||||
card.Disconnect();
|
||||
};
|
||||
|
||||
reader.CardDiscovered += handler;
|
||||
reader.Start();
|
||||
|
||||
Assert.AreEqual(true, test_successfully);
|
||||
|
||||
reader.Stop();
|
||||
reader.CardDiscovered -= handler;
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ChangeApplicationMasterKey()
|
||||
{
|
||||
IHardware hardware = new Hardware();
|
||||
IReader reader = hardware.OpenReader(ReaderID);
|
||||
|
||||
bool test_successfully = false;
|
||||
|
||||
ReaderEventHandler handler = (sender, card) =>
|
||||
{
|
||||
card.Connect();
|
||||
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(card);
|
||||
|
||||
desfire.SelectApplication(AID);
|
||||
|
||||
CipherKey key_default = new CipherKey(CipherType.AES);
|
||||
desfire.AuthenticateISO_AES(0x00, key_default._Key);
|
||||
|
||||
CipherKey key = new CipherKey(AES_Key_Master, CipherType.AES, 0x10);
|
||||
desfire.ChangeKey_AES(0x00, key._Key, key._KeyVersion);
|
||||
|
||||
test_successfully = true;
|
||||
|
||||
card.Disconnect();
|
||||
};
|
||||
|
||||
reader.CardDiscovered += handler;
|
||||
reader.Start();
|
||||
|
||||
Assert.AreEqual(true, test_successfully);
|
||||
|
||||
reader.Stop();
|
||||
reader.CardDiscovered -= handler;
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ChangeApplicationKey_1()
|
||||
{
|
||||
IHardware hardware = new Hardware();
|
||||
IReader reader = hardware.OpenReader(ReaderID);
|
||||
|
||||
bool test_successfully = false;
|
||||
|
||||
ReaderEventHandler handler = (sender, card) =>
|
||||
{
|
||||
card.Connect();
|
||||
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(card);
|
||||
|
||||
desfire.SelectApplication(AID);
|
||||
|
||||
CipherKey key_master = new CipherKey(AES_Key_Master, CipherType.AES, 0x10);
|
||||
desfire.AuthenticateISO_AES(0x00, key_master._Key);
|
||||
|
||||
CipherKey key_old = new CipherKey(AES_Key_1, CipherType.AES, 0x10);
|
||||
CipherKey key_new = new CipherKey(AES_Key_1, CipherType.AES, 0x10);
|
||||
desfire.ChangeOtherKey_AES(0x01, key_new._Key, key_old._Key, key_new._KeyVersion);
|
||||
|
||||
test_successfully = true;
|
||||
|
||||
card.Disconnect();
|
||||
};
|
||||
|
||||
reader.CardDiscovered += handler;
|
||||
reader.Start();
|
||||
|
||||
Assert.AreEqual(true, test_successfully);
|
||||
|
||||
reader.Stop();
|
||||
reader.CardDiscovered -= handler;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace NFC_Test.NXP_MIFARE_DESFire
|
||||
{
|
||||
class Command_Test
|
||||
{
|
||||
}
|
||||
}
|
@ -1,4 +1,5 @@
|
||||
using NFC;
|
||||
using NFC.Mifare_DESFire.Enums;
|
||||
using NFC.ISO7816_4;
|
||||
using NFC.Mifare_DESFire;
|
||||
using NFC.NXP_MIFARE_DESFire.Exceptions;
|
||||
@ -6,30 +7,48 @@ using NSubstitute;
|
||||
using NUnit.Framework;
|
||||
using System;
|
||||
|
||||
namespace NFC_Test.NXP_MIFARE_DESFire
|
||||
namespace NFC_Unit_Test.NXP_MIFARE_DESFire
|
||||
{
|
||||
[TestFixture]
|
||||
public class MIFARE_DESFire_Test
|
||||
{
|
||||
#region Helper Methods
|
||||
[Test]
|
||||
public void GenerateDefaultKey()
|
||||
public void GenerateEmptyArray()
|
||||
{
|
||||
uint i = 16;
|
||||
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(null);
|
||||
|
||||
byte[] data = desfire.GenerateEmptyKey(i);
|
||||
byte[] data = desfire.GenerateEmptyArray(i);
|
||||
|
||||
for(int e = 0; e < i; e++)
|
||||
for (int e = 0; e < i; e++)
|
||||
{
|
||||
if(data[e] != 0x00)
|
||||
if (data[e] != 0x00)
|
||||
{
|
||||
Assert.Fail("Data is not 0x00");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetSubArray()
|
||||
{
|
||||
byte[] array = new byte[]
|
||||
{
|
||||
0x01, 0x02, 0x03, 0x04, 0x05
|
||||
};
|
||||
|
||||
byte[] expected_subarray = new byte[]
|
||||
{
|
||||
0x02, 0x03, 0x04
|
||||
};
|
||||
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(null);
|
||||
|
||||
Assert.AreEqual(expected_subarray, desfire.GetSubArray(array, 1, 3));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CheckAPDUResponse__NULL()
|
||||
{
|
||||
@ -175,7 +194,6 @@ namespace NFC_Test.NXP_MIFARE_DESFire
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void CheckAPDUResponse__PARAMETER_ERROR()
|
||||
{
|
||||
@ -194,7 +212,6 @@ namespace NFC_Test.NXP_MIFARE_DESFire
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void CheckAPDUResponse__AUTHENTICATION_DELAY()
|
||||
{
|
||||
@ -370,6 +387,40 @@ namespace NFC_Test.NXP_MIFARE_DESFire
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ExpandToBlockSize()
|
||||
{
|
||||
byte[] data = new byte[]
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x01
|
||||
};
|
||||
|
||||
byte[] expected_lastblock = new byte[]
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00
|
||||
};
|
||||
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(null);
|
||||
|
||||
byte[] lastblock = desfire.ExpandToBlockSize(data, 8);
|
||||
|
||||
Assert.AreEqual(expected_lastblock, lastblock);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ExpandToBlockSize_Null()
|
||||
{
|
||||
byte[] data = null;
|
||||
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(null);
|
||||
|
||||
Assert.Throws<ArgumentNullException>(
|
||||
delegate
|
||||
{
|
||||
byte[] lastblock = desfire.ExpandToBlockSize(data, 8);
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RotateLeft()
|
||||
{
|
||||
@ -538,25 +589,113 @@ namespace NFC_Test.NXP_MIFARE_DESFire
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GenerateSessionKey_DES()
|
||||
{
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(null);
|
||||
|
||||
byte[] rndA = HexConverter.ConvertFromHexString("a541a9dc9138df07");
|
||||
Console.WriteLine(HexConverter.ConvertToHexString(rndA));
|
||||
byte[] rndB = HexConverter.ConvertFromHexString("cbe55aa893b2da25");
|
||||
Console.WriteLine(HexConverter.ConvertToHexString(rndB));
|
||||
|
||||
byte[] expected_sessionkey = HexConverter.ConvertFromHexString("a541a9dccbe55aa8a541a9dccbe55aa8");
|
||||
Console.WriteLine(HexConverter.ConvertToHexString(expected_sessionkey));
|
||||
|
||||
byte[] sessionkey = desfire.GenerateSesionKey_DES(rndA, rndB);
|
||||
Console.WriteLine(HexConverter.ConvertToHexString(sessionkey));
|
||||
Assert.AreEqual(expected_sessionkey, sessionkey);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GenerateSessionKey_AES()
|
||||
{
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(null);
|
||||
|
||||
byte[] rndA = desfire.ConvertFromHexString("bc14dfde20074617e45a8822f06fdd91");
|
||||
Console.WriteLine(desfire.ConvertToHexString(rndA));
|
||||
byte[] rndB = desfire.ConvertFromHexString("482ddc54426e6dee560413b8d95471f5");
|
||||
Console.WriteLine(desfire.ConvertToHexString(rndB));
|
||||
byte[] rndA = HexConverter.ConvertFromHexString("bc14dfde20074617e45a8822f06fdd91");
|
||||
Console.WriteLine(HexConverter.ConvertToHexString(rndA));
|
||||
byte[] rndB = HexConverter.ConvertFromHexString("482ddc54426e6dee560413b8d95471f5");
|
||||
Console.WriteLine(HexConverter.ConvertToHexString(rndB));
|
||||
|
||||
byte[] expected_sessionkey = desfire.ConvertFromHexString("bc14dfde482ddc54f06fdd91d95471f5");
|
||||
Console.WriteLine(desfire.ConvertToHexString(expected_sessionkey));
|
||||
byte[] expected_sessionkey = HexConverter.ConvertFromHexString("bc14dfde482ddc54f06fdd91d95471f5");
|
||||
Console.WriteLine(HexConverter.ConvertToHexString(expected_sessionkey));
|
||||
|
||||
byte[] sessionkey = desfire.GenerateSesionKey_AES(rndA, rndB);
|
||||
Console.WriteLine(desfire.ConvertToHexString(sessionkey));
|
||||
Console.WriteLine(HexConverter.ConvertToHexString(sessionkey));
|
||||
Assert.AreEqual(expected_sessionkey, sessionkey);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Configuration Generator
|
||||
[Test]
|
||||
public void GenerateKeySetting1()
|
||||
{
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(null);
|
||||
|
||||
Assert.AreEqual(0x0B, desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GenerateKeySetting1_ChangeKey()
|
||||
{
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(null);
|
||||
Assert.AreEqual(0x1B, desfire.GenerateKeySetting1(0x01, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GenerateKeySetting1_Wrong_KeyID()
|
||||
{
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(null);
|
||||
|
||||
Assert.Throws<ArgumentOutOfRangeException>(
|
||||
delegate
|
||||
{
|
||||
desfire.GenerateKeySetting1(0x10, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE);
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GenerateKeySetting2()
|
||||
{
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(null);
|
||||
|
||||
Assert.AreEqual(0x82, desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 0x02));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GenerateKeySetting2_Wrong_KeyNumbers()
|
||||
{
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(null);
|
||||
|
||||
Assert.Throws<ArgumentOutOfRangeException>(
|
||||
delegate
|
||||
{
|
||||
desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 0x10);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void GenerateFileAccessRights()
|
||||
{
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(null);
|
||||
|
||||
Assert.AreEqual(0x1234, desfire.GenerateFileAccessRights(0x01, 0x02, 0x03, 0x04));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GenerateFileAccessRights_OutOfRange()
|
||||
{
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(null);
|
||||
|
||||
Assert.Throws<ArgumentOutOfRangeException>(
|
||||
delegate
|
||||
{
|
||||
desfire.GenerateFileAccessRights(0x10, 0x00, 0x00, 0x00);
|
||||
});
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region DESFire Commands
|
||||
[Test]
|
||||
public void AuthenticateISO_DES()
|
||||
@ -588,7 +727,7 @@ namespace NFC_Test.NXP_MIFARE_DESFire
|
||||
desfire.AuthenticateISO_DES(0x00, key, rndA);
|
||||
|
||||
byte[] expected_sessionkey = HexConverter.ConvertFromHexString("849B36C54FD1B759849B36C54FD1B759");
|
||||
byte[] expected_iv = desfire.GenerateEmptyKey(8);
|
||||
byte[] expected_iv = HexConverter.ConvertFromHexString("0000000000000000");
|
||||
|
||||
Assert.AreEqual(expected_sessionkey, desfire._SessionKey);
|
||||
Assert.AreEqual(expected_iv, desfire._IV);
|
||||
@ -624,7 +763,7 @@ namespace NFC_Test.NXP_MIFARE_DESFire
|
||||
desfire.AuthenticateISO_AES(0x00, key, rndA);
|
||||
|
||||
byte[] expected_sessionkey = HexConverter.ConvertFromHexString("8a8b3c15c71d0cf46aead1f148f27703");
|
||||
byte[] expected_iv = desfire.GenerateEmptyKey(16);
|
||||
byte[] expected_iv = HexConverter.ConvertFromHexString("00000000000000000000000000000000");
|
||||
|
||||
Assert.AreEqual(expected_sessionkey, desfire._SessionKey);
|
||||
Assert.AreEqual(expected_iv, desfire._IV);
|
||||
@ -683,27 +822,5 @@ namespace NFC_Test.NXP_MIFARE_DESFire
|
||||
desfire.ChangeOtherKey_AES(0x01, new_key, old_key, 0x10);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Configuration Generator
|
||||
[Test]
|
||||
public void GenerateFileAccessRights()
|
||||
{
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(null);
|
||||
|
||||
Assert.AreEqual(0x1234, desfire.GenerateFileAccessRights(0x01, 0x02, 0x03, 0x04));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GenerateFileAccessRights_OutOfRange()
|
||||
{
|
||||
MIFARE_DESFire desfire = new MIFARE_DESFire(null);
|
||||
|
||||
Assert.Throws<ArgumentOutOfRangeException>(
|
||||
delegate
|
||||
{
|
||||
desfire.GenerateFileAccessRights(0x10, 0x00, 0x00, 0x00);
|
||||
});
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user