using NUnit.Framework; using System; using System.Collections.Generic; using System.Text; using NFC; using NFC.Readers.PCSC; using System.Threading; using NFC.Mifare_DESFire; using NFC.Mifare_DESFire.Enums; using NFC.ISO7816_4; using PCSC.Iso7816; namespace NFC_Test { [TestFixture, Explicit] public class REAL_Windows { [Test] public void GetReaders() { 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); } } } [TestCase("ACS ACR122U PICC Interface 0")] public void Connect(string readerID) { 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; } [TestCase("ACS ACR122U PICC Interface 0")] public void GetApplicationIDs(string readerID) { IHardware hardware = new Hardware(); IReader reader = hardware.OpenReader(readerID); bool transmit_successfully = false; ReaderEventHandler handler = (sender, card) => { card.Connect(); MIFARE_DESFire desfire = new MIFARE_DESFire(card); //APDUCommand cmd = desfire.GetApplicationIDs(); //APDUResponse response = card.Transmit(cmd); //if (response.StatusWord == NFC.Mifare_DESFire.APDUStatusWords.OK) //{ // UInt32[] ApplicationIDs = desfire.ConvertApplicationIDs(response); // foreach(UInt32 id in ApplicationIDs) // { // Console.WriteLine("0x{0:X3}", id); // } // transmit_successfully = true; //} card.Disconnect(); }; reader.CardDiscovered += handler; reader.Start(); Assert.AreEqual(true, transmit_successfully); reader.Stop(); reader.CardDiscovered -= handler; } [TestCase("ACS ACR122U PICC Interface 0", (UInt32)0xC0FFEE)] public void SelectApplication(string readerID, UInt32 applicationID) { IHardware hardware = new Hardware(); IReader reader = hardware.OpenReader(readerID); bool transmit_successfully = false; ReaderEventHandler handler = (sender, card) => { card.Connect(); //MIFARE_DESFire desfire = new MIFARE_DESFire(card); //APDUCommand cmd = desfire.SelectApplication(applicationID); //cmd.ToArray(); //APDUResponse response = card.Transmit(cmd); //if (response.StatusWord == NFC.Mifare_DESFire.APDUStatusWords.OK) //{ // transmit_successfully = true; //} card.Disconnect(); }; reader.CardDiscovered += handler; reader.Start(); Assert.AreEqual(true, transmit_successfully); reader.Stop(); reader.CardDiscovered -= handler; } [TestCase("ACS ACR122U PICC Interface 0", (UInt32)0xAAFFEE)] public void CreateApplication(string readerID, UInt32 applicationID) { //IHardware hardware = new Hardware(); //IReader reader = hardware.OpenReader(readerID); //bool transmit_successfully = false; //ReaderEventHandler handler = (sender, card) => //{ // card.Connect(); // MIFARE_DESFire desfire = new MIFARE_DESFire(card); // byte keysetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.NOKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); // byte keysetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.TDES, FileIdentifies.NOTUSED, 0x03); // APDUCommand cmd = desfire.CreateApplication(applicationID, keysetting1, keysetting2); // Console.WriteLine(cmd.ToArray()); // APDUResponse response = card.Transmit(cmd); // if (response.StatusWord == NFC.Mifare_DESFire.APDUStatusWords.OK) // { // transmit_successfully = true; // } // card.Disconnect(); //}; //reader.CardDiscovered += handler; //reader.Start(); //Assert.AreEqual(true, transmit_successfully); //reader.Stop(); //reader.CardDiscovered -= handler; } [TestCase("ACS ACR122U PICC Interface 0", (UInt32)0xAAFFEE)] public void DeleteApplication(string readerID, UInt32 applicationID) { IHardware hardware = new Hardware(); IReader reader = hardware.OpenReader(readerID); bool transmit_successfully = false; ReaderEventHandler handler = (sender, card) => { card.Connect(); MIFARE_DESFire desfire = new MIFARE_DESFire(card); desfire.SelectApplication(0x000000); desfire.AuthenticateDES(0x00, GenerateDefaultKey(8)); desfire.DeleteApplication(applicationID); transmit_successfully = true; card.Disconnect(); }; reader.CardDiscovered += handler; reader.Start(); Assert.AreEqual(true, transmit_successfully); reader.Stop(); reader.CardDiscovered -= handler; } public byte[] GenerateDefaultKey(int size) { List key = new List(); for(int i = 0; i < size; i++) { key.Add(0); } return key.ToArray(); } /// /// Used Default PICC Key with PICC authenticate /// /// [TestCase("ACS ACR122U PICC Interface 0")] public void Authenticate(string readerID) { IHardware hardware = new Hardware(); IReader reader = hardware.OpenReader(readerID); bool transmit_successfully = false; ReaderEventHandler handler = (sender, card) => { card.Connect(); MIFARE_DESFire desfire = new MIFARE_DESFire(card); desfire.SelectApplication(0x000000); desfire.AuthenticateDES(0x00, GenerateDefaultKey(8)); transmit_successfully = true; card.Disconnect(); }; reader.CardDiscovered += handler; reader.Start(); Assert.AreEqual(true, transmit_successfully); reader.Stop(); reader.CardDiscovered -= handler; } [TestCase("ACS ACR122U PICC Interface 0")] public void ChangeKey(string readerID) { IHardware hardware = new Hardware(); IReader reader = hardware.OpenReader(readerID); bool transmit_successfully = false; ReaderEventHandler handler = (sender, card) => { card.Connect(); MIFARE_DESFire desfire = new MIFARE_DESFire(card); desfire.SelectApplication(0xAAFFEE); desfire.AuthenticateDES(0x00, GenerateDefaultKey(8)); desfire.ChangeKeyDES(0x00, GenerateDefaultKey(8), new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF }); transmit_successfully = true; card.Disconnect(); }; reader.CardDiscovered += handler; reader.Start(); Assert.AreEqual(true, transmit_successfully); reader.Stop(); reader.CardDiscovered -= handler; } [TestCase("ACS ACR122U PICC Interface 0")] public void ChangeKey_Test(string readerID) { IHardware hardware = new Hardware(); IReader reader = hardware.OpenReader(readerID); bool transmit_successfully = false; ReaderEventHandler handler = (sender, card) => { card.Connect(); MIFARE_DESFire desfire = new MIFARE_DESFire(card); desfire.SelectApplication(0xAAFFEE); desfire.AuthenticateDES(0x00, GenerateDefaultKey(8)); APDUCommand cmd = new APDUCommand(IsoCase.Case4Short) { CLA = 0x90, INS = 0xC4, Data = GenerateDefaultKey(1 + 16 + 4 + 4) // KEY_NO, KEY, CRC32, PADDING }; card.Transmit(cmd); transmit_successfully = true; card.Disconnect(); }; reader.CardDiscovered += handler; reader.Start(); Assert.AreEqual(true, transmit_successfully); reader.Stop(); reader.CardDiscovered -= handler; } } }