mirror of
https://gitlab.com/fabinfra/fabaccess/borepin.git
synced 2025-03-13 23:31:48 +01:00
309 lines
8.6 KiB
C#
309 lines
8.6 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|