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