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
{
///
/// Test all DESFire Commands with empty Card
///
[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";
///
/// Get ReaderIDs form PC/SC API
///
[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;
}
}
}