Added: Complete Real Test

This commit is contained in:
TheJoKlLa
2020-11-07 01:14:51 +01:00
parent 872aeccee7
commit 6c51e40891
23 changed files with 1020 additions and 1199 deletions

View File

@ -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;
}
}
}

View File

@ -1,10 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace NFC_Test.NXP_MIFARE_DESFire
{
class Command_Test
{
}
}

View File

@ -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
}
}