diff --git a/NFC_Android/NFC_Android.csproj b/NFC.Android/NFC.Android.csproj similarity index 100% rename from NFC_Android/NFC_Android.csproj rename to NFC.Android/NFC.Android.csproj diff --git a/NFC_PCSC/NFC_PCSC.csproj b/NFC.PCSC/NFC.PCSC.csproj similarity index 76% rename from NFC_PCSC/NFC_PCSC.csproj rename to NFC.PCSC/NFC.PCSC.csproj index a54e9d5..4e99ed7 100644 --- a/NFC_PCSC/NFC_PCSC.csproj +++ b/NFC.PCSC/NFC.PCSC.csproj @@ -1,7 +1,7 @@ - + - net7.0 + netstandard2.0 diff --git a/NFC.PCSC/NFCService.cs b/NFC.PCSC/NFCService.cs new file mode 100644 index 0000000..2417310 --- /dev/null +++ b/NFC.PCSC/NFCService.cs @@ -0,0 +1,316 @@ +using NFC.Interfaces; +using PCSClib = PCSC; +using PCSCIso7816 = PCSC.Iso7816; +using System; +using System.Collections.Generic; +using PCSC.Exceptions; +using NFC.Exceptions; +using PCSC.Iso7816; + +namespace NFC.PCSC +{ + public class NFCService : INFCService + { + #region Private Members + private PCSCIso7816.IsoReader _IsoReader; + private PCSClib.IContextFactory _ContextFactory; + private PCSClib.ISCardContext _SCardContext; + #endregion + + #region Constructors + public NFCService() + { + _ContextFactory = PCSClib.ContextFactory.Instance; + _SCardContext = _ContextFactory.Establish(PCSClib.SCardScope.System); + } + #endregion + + #region Members + /// + /// Indicates if NFC Hardware is available + /// + public bool IsAvailable + { + get + { + return true; + } + } + + /// + /// Indicates if NFC Hardware is enabled + /// + public bool IsEnabled + { + get + { + return true; + } + } + + /// + /// Indicates if NFC Card is connected + /// + public bool IsConnected + { + get + { + return _IsoReader != null; + } + } + #endregion + + #region Methods + /// + /// Get a list of availible NFC ReaderIDs + /// + public IList GetReaderIDs() + { + return new List(_SCardContext.GetReaders()); + } + + /// + /// Connect with ReaderID to NFC Card + /// + /// ReaderID from GetReaderIDs + /// + /// + /// + /// + public void Connect(string readerID) + { + if(string.IsNullOrEmpty(readerID)) + { + throw new ArgumentNullException(); + } + + try + { + _IsoReader = new PCSCIso7816.IsoReader(_SCardContext); + _IsoReader.Connect(readerID, PCSClib.SCardShareMode.Shared, PCSClib.SCardProtocol.Any); + } + catch (Exception exception) + { + switch(exception) + { + case InvalidContextException _: + case InvalidProtocolException _: + case InvalidValueException _: + case UnsupportedFeatureException _: + case CommunicationErrorException _: + case InternalErrorException _: + case WinErrorInsufficientBufferException _: + case InsufficientBufferException _: + throw new ConnectionException("Connect failed", exception); + + case NoServiceException _: + case NoReadersAvailableException _: + case NotReadyException _: + case PCSClib.Exceptions.ReaderUnavailableException _: + case SharingViolationException _: + case UnknownReaderException _: + throw new NFC.Exceptions.ReaderException("Reader connecting failed", exception); + + case NoSmartcardException _: + case UnpoweredCardException _: + case UnresponsiveCardException _: + case RemovedCardException _: + throw new CardException("Reader connecting failed", exception); + + case PCSCException _: + default: + throw new ConnectionException("Connect failed", exception); + } + } + } + + /// + /// Disconnects Reader from NFC Card + /// + /// + /// + public void Disconnect() + { + if(_IsoReader == null) + { + throw new InvalidOperationException(); + } + + try + { + _IsoReader.Disconnect(PCSClib.SCardReaderDisposition.Eject); + } + catch(Exception exception) + { + throw new ConnectionException("Disconnect failed", exception); + } + finally + { + _IsoReader.Dispose(); + _IsoReader = null; + } + } + + /// + /// Transmit APDUCommand to Card if connected + /// + /// + /// + /// + /// + /// + public APDUResponse Transmit(APDUCommand command) + { + if(_IsoReader == null) + { + throw new InvalidOperationException(); + } + if(command == null) + { + throw new ArgumentNullException(); + } + + try + { + PCSCIso7816.Response response = _IsoReader.Transmit(ConvertAPDUCommand(command)); + return Convert(response); + } + catch(Exception exception) + { + switch (exception) + { + case InvalidContextException _: + case InvalidProtocolException _: + case InvalidValueException _: + case UnsupportedFeatureException _: + case InternalErrorException _: + case WinErrorInsufficientBufferException _: + throw new ConnectionException("Connect failed", exception); + + case InvalidApduException _: + case InsufficientBufferException _: + case CommunicationErrorException _: + throw new ConnectionException("Transmit failed", exception); + + case NoServiceException _: + case NoReadersAvailableException _: + case NotReadyException _: + case ReaderUnavailableException _: + case SharingViolationException _: + case UnknownReaderException _: + throw new ReaderException("Reader connecting failed", exception); + + case NoSmartcardException _: + case UnpoweredCardException _: + case UnresponsiveCardException _: + case RemovedCardException _: + throw new CardException("Reader connecting failed", exception); + + case PCSCException _: + default: + throw new ConnectionException("Connect failed", exception); + } + } + } + #endregion + + #region Convert Methods + public PCSCIso7816.CommandApdu ConvertAPDUCommand(APDUCommand apdu_cmd) + { + switch (apdu_cmd.Case) + { + case NFC.IsoCase.Case1: + return new PCSCIso7816.CommandApdu(ConvertISOCase(apdu_cmd.Case), ConvertSCardProtocol(apdu_cmd.Protocol)) + { + CLA = apdu_cmd.CLA, + INS = apdu_cmd.INS, + P1 = apdu_cmd.P1, + P2 = apdu_cmd.P2 + }; + case NFC.IsoCase.Case2Short: + return new PCSCIso7816.CommandApdu(ConvertISOCase(apdu_cmd.Case), ConvertSCardProtocol(apdu_cmd.Protocol)) + { + CLA = apdu_cmd.CLA, + INS = apdu_cmd.INS, + P1 = apdu_cmd.P1, + P2 = apdu_cmd.P2, + Le = apdu_cmd.LE + }; + case NFC.IsoCase.Case3Short: + return new PCSCIso7816.CommandApdu(ConvertISOCase(apdu_cmd.Case), ConvertSCardProtocol(apdu_cmd.Protocol)) + { + CLA = apdu_cmd.CLA, + INS = apdu_cmd.INS, + P1 = apdu_cmd.P1, + P2 = apdu_cmd.P2, + Data = apdu_cmd.Data + }; + case NFC.IsoCase.Case4Short: + return new PCSCIso7816.CommandApdu(ConvertISOCase(apdu_cmd.Case), ConvertSCardProtocol(apdu_cmd.Protocol)) + { + CLA = apdu_cmd.CLA, + INS = apdu_cmd.INS, + P1 = apdu_cmd.P1, + P2 = apdu_cmd.P2, + Data = apdu_cmd.Data, + Le = apdu_cmd.LE + }; + default: + throw new Exception("Unknown IsoCase"); + } + } + + public PCSCIso7816.IsoCase ConvertISOCase(NFC.IsoCase isoCase) + { + switch (isoCase) + { + case NFC.IsoCase.Case1: + return PCSCIso7816.IsoCase.Case1; + case NFC.IsoCase.Case2Short: + return PCSCIso7816.IsoCase.Case2Short; + case NFC.IsoCase.Case3Short: + return PCSCIso7816.IsoCase.Case3Short; + case NFC.IsoCase.Case4Short: + return PCSCIso7816.IsoCase.Case4Short; + default: + throw new Exception("Unknown IsoCase"); + } + } + + public PCSClib.SCardProtocol ConvertSCardProtocol(NFC.SCardProtocol sCardProtocol) + { + switch (sCardProtocol) + { + case NFC.SCardProtocol.UNSET: + return PCSClib.SCardProtocol.Unset; + case NFC.SCardProtocol.T0: + return PCSClib.SCardProtocol.T0; + case NFC.SCardProtocol.T1: + return PCSClib.SCardProtocol.T1; + case NFC.SCardProtocol.RAW: + return PCSClib.SCardProtocol.Raw; + case NFC.SCardProtocol.T15: + return PCSClib.SCardProtocol.T15; + case NFC.SCardProtocol.ANY: + return PCSClib.SCardProtocol.Any; + default: + throw new NotSupportedException("Unknown SCardProtocol"); + } + } + + public APDUResponse Convert(PCSCIso7816.Response response) + { + PCSCIso7816.ResponseApdu responseApdu = response.Get(0); + + APDUResponse apduResponse = new APDUResponse() + { + SW1 = responseApdu.SW1, + SW2 = responseApdu.SW2, + Body = responseApdu.GetData() + }; + + return apduResponse; + } + #endregion + } +} diff --git a/NFC_iOS/Card_iOS.cs b/NFC.iOS/Card_iOS.cs similarity index 100% rename from NFC_iOS/Card_iOS.cs rename to NFC.iOS/Card_iOS.cs diff --git a/NFC_iOS/Hardware_iOS.cs b/NFC.iOS/Hardware_iOS.cs similarity index 100% rename from NFC_iOS/Hardware_iOS.cs rename to NFC.iOS/Hardware_iOS.cs diff --git a/NFC_iOS/NFC_iOS.csproj b/NFC.iOS/NFC.iOS.csproj similarity index 100% rename from NFC_iOS/NFC_iOS.csproj rename to NFC.iOS/NFC.iOS.csproj diff --git a/NFC_iOS/Reader_iOS.cs b/NFC.iOS/Reader_iOS.cs similarity index 100% rename from NFC_iOS/Reader_iOS.cs rename to NFC.iOS/Reader_iOS.cs diff --git a/NFC.sln b/NFC.sln index 4cdbb32..cb033fe 100644 --- a/NFC.sln +++ b/NFC.sln @@ -1,17 +1,17 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30717.126 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33122.133 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NFC", "NFC\NFC.csproj", "{1D12BCDF-033F-40DE-ABA9-8BA5ABE0CA3A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NFC", "NFC\NFC.csproj", "{1D12BCDF-033F-40DE-ABA9-8BA5ABE0CA3A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NFC_PCSC", "NFC_PCSC\NFC_PCSC.csproj", "{62DE4EBC-6F35-4D31-8717-DBC62D46035C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NFC.Android", "NFC.Android\NFC.Android.csproj", "{B2609012-9D21-42F0-A2F9-3FE97D356392}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NFC_Android", "NFC_Android\NFC_Android.csproj", "{B2609012-9D21-42F0-A2F9-3FE97D356392}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NFC.iOS", "NFC.iOS\NFC.iOS.csproj", "{C56A1E1A-976C-42ED-B7A2-08C6111AA0E8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NFC_iOS", "NFC_iOS\NFC_iOS.csproj", "{C56A1E1A-976C-42ED-B7A2-08C6111AA0E8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NFC_Test", "NFC_Test\NFC_Test.csproj", "{FE8A1426-8B19-4CDF-A75E-80397E55BA95}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NFC_Test", "NFC_Test\NFC_Test.csproj", "{FE8A1426-8B19-4CDF-A75E-80397E55BA95}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NFC.PCSC", "NFC.PCSC\NFC.PCSC.csproj", "{888BBBCA-D9F8-4D17-943F-81E0D83EE864}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -23,10 +23,6 @@ Global {1D12BCDF-033F-40DE-ABA9-8BA5ABE0CA3A}.Debug|Any CPU.Build.0 = Debug|Any CPU {1D12BCDF-033F-40DE-ABA9-8BA5ABE0CA3A}.Release|Any CPU.ActiveCfg = Release|Any CPU {1D12BCDF-033F-40DE-ABA9-8BA5ABE0CA3A}.Release|Any CPU.Build.0 = Release|Any CPU - {62DE4EBC-6F35-4D31-8717-DBC62D46035C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {62DE4EBC-6F35-4D31-8717-DBC62D46035C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {62DE4EBC-6F35-4D31-8717-DBC62D46035C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {62DE4EBC-6F35-4D31-8717-DBC62D46035C}.Release|Any CPU.Build.0 = Release|Any CPU {B2609012-9D21-42F0-A2F9-3FE97D356392}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B2609012-9D21-42F0-A2F9-3FE97D356392}.Debug|Any CPU.Build.0 = Debug|Any CPU {B2609012-9D21-42F0-A2F9-3FE97D356392}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -39,6 +35,10 @@ Global {FE8A1426-8B19-4CDF-A75E-80397E55BA95}.Debug|Any CPU.Build.0 = Debug|Any CPU {FE8A1426-8B19-4CDF-A75E-80397E55BA95}.Release|Any CPU.ActiveCfg = Release|Any CPU {FE8A1426-8B19-4CDF-A75E-80397E55BA95}.Release|Any CPU.Build.0 = Release|Any CPU + {888BBBCA-D9F8-4D17-943F-81E0D83EE864}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {888BBBCA-D9F8-4D17-943F-81E0D83EE864}.Debug|Any CPU.Build.0 = Debug|Any CPU + {888BBBCA-D9F8-4D17-943F-81E0D83EE864}.Release|Any CPU.ActiveCfg = Release|Any CPU + {888BBBCA-D9F8-4D17-943F-81E0D83EE864}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/NFC/Cards/NXP MIFARE DESFire/NXP_MIFARE_DESFire.cs b/NFC/Cards/NXP MIFARE DESFire/NXP_MIFARE_DESFire.cs index 8696ca2..dd1a1ca 100644 --- a/NFC/Cards/NXP MIFARE DESFire/NXP_MIFARE_DESFire.cs +++ b/NFC/Cards/NXP MIFARE DESFire/NXP_MIFARE_DESFire.cs @@ -28,10 +28,10 @@ namespace NFC.Cards.NXP_MIFARE_DESFire /// /// Construct MIFRARE_DESFire Object with ICard Interface /// - /// Implementation of ICard, only transmit is used - public NXP_MIFARE_DESFire(ICard card) + /// Implementation of ICard, only transmit is used + public NXP_MIFARE_DESFire(INFCService nfcService) { - _Card = card; + _NFCService = nfcService; } #endregion @@ -39,7 +39,7 @@ namespace NFC.Cards.NXP_MIFARE_DESFire /// /// ICard Implementation used to transmit APDUCommands and recive APDUResponses /// - private readonly ICard _Card; + private readonly INFCService _NFCService; /// /// SessionKey, is set after Successfull Authentication @@ -252,7 +252,7 @@ namespace NFC.Cards.NXP_MIFARE_DESFire }; _Log.Debug(cmd_SelectApplication.ToString()); HexConverter.ConvertToHexString(cmd_SelectApplication.ToArray()); - APDUResponse response = _Card.Transmit(cmd_SelectApplication); + APDUResponse response = _NFCService.Transmit(cmd_SelectApplication); _Log.DebugFormat(response.ToString()); CheckAPDUResponse(response); @@ -287,7 +287,7 @@ namespace NFC.Cards.NXP_MIFARE_DESFire }; _Log.Debug(cmd_challange_request.ToString()); - APDUResponse response = _Card.Transmit(cmd_challange_request); + APDUResponse response = _NFCService.Transmit(cmd_challange_request); _Log.Debug(response.ToString()); CheckAPDUResponse(response); @@ -327,7 +327,7 @@ namespace NFC.Cards.NXP_MIFARE_DESFire }; _Log.Debug(cmd_challange_response.ToString()); - response = _Card.Transmit(cmd_challange_response); + response = _NFCService.Transmit(cmd_challange_response); _Log.Debug(response.ToString()); CheckAPDUResponse(response); @@ -370,7 +370,7 @@ namespace NFC.Cards.NXP_MIFARE_DESFire }; _Log.Debug(cmd_format.ToString()); - APDUResponse response = _Card.Transmit(cmd_format); + APDUResponse response = _NFCService.Transmit(cmd_format); _Log.Debug(response.ToString()); CheckAPDUResponse(response); @@ -405,7 +405,7 @@ namespace NFC.Cards.NXP_MIFARE_DESFire }; _Log.Debug(cmd_CreateApplication.ToString()); - APDUResponse response = _Card.Transmit(cmd_CreateApplication); + APDUResponse response = _NFCService.Transmit(cmd_CreateApplication); _Log.Debug(response.ToString()); CheckAPDUResponse(response); @@ -440,7 +440,7 @@ namespace NFC.Cards.NXP_MIFARE_DESFire }; _Log.Debug(cmd_challange_request.ToString()); - APDUResponse response = _Card.Transmit(cmd_challange_request); + APDUResponse response = _NFCService.Transmit(cmd_challange_request); _Log.Debug(response.ToString()); CheckAPDUResponse(response); @@ -480,7 +480,7 @@ namespace NFC.Cards.NXP_MIFARE_DESFire }; _Log.Debug(cmd_challange_response.ToString()); - response = _Card.Transmit(cmd_challange_response); + response = _NFCService.Transmit(cmd_challange_response); _Log.Debug(response.ToString()); CheckAPDUResponse(response); @@ -560,7 +560,7 @@ namespace NFC.Cards.NXP_MIFARE_DESFire }; _Log.Debug(cmd_ChangeKey.ToString()); - APDUResponse response = _Card.Transmit(cmd_ChangeKey); + APDUResponse response = _NFCService.Transmit(cmd_ChangeKey); _Log.Debug(response.ToString()); CheckAPDUResponse(response); @@ -625,7 +625,7 @@ namespace NFC.Cards.NXP_MIFARE_DESFire }; _Log.Debug(cmd_ChangeKey.ToString()); - APDUResponse response = _Card.Transmit(cmd_ChangeKey); + APDUResponse response = _NFCService.Transmit(cmd_ChangeKey); _Log.Debug(response.ToString()); CheckAPDUResponse(response); @@ -670,7 +670,7 @@ namespace NFC.Cards.NXP_MIFARE_DESFire }; _Log.Debug(cmd_CreateFile_Standard.ToString()); - APDUResponse response = _Card.Transmit(cmd_CreateFile_Standard); + APDUResponse response = _NFCService.Transmit(cmd_CreateFile_Standard); _Log.DebugFormat(response.ToString()); CheckAPDUResponse(response); @@ -742,7 +742,7 @@ namespace NFC.Cards.NXP_MIFARE_DESFire Data = ByteOperation.Concatenate(file_id_array, offset_byte, length_byte, write_buffer) }; _Log.Debug(cmd_WriteData.ToString()); - +/* @@ -763,9 +763,9 @@ namespace NFC.Cards.NXP_MIFARE_DESFire _Log.Debug(cmd_WriteData.ToString()); +*/ - - APDUResponse response = _Card.Transmit(cmd_WriteData); + APDUResponse response = _NFCService.Transmit(cmd_WriteData); _Log.Debug(response.ToString()); CheckAPDUResponse(response); @@ -836,7 +836,7 @@ namespace NFC.Cards.NXP_MIFARE_DESFire }; _Log.Debug(cmd_ReadData.ToString()); - APDUResponse response = _Card.Transmit(cmd_ReadData); + APDUResponse response = _NFCService.Transmit(cmd_ReadData); _Log.Debug(response.ToString()); CheckAPDUResponse(response); @@ -862,7 +862,7 @@ namespace NFC.Cards.NXP_MIFARE_DESFire // INS = (byte)APDUInstructions.GET_APPLICATION_IDS // }; - // APDUResponse response = _Card.Transmit(cmd); + // APDUResponse response = _NFCService.Transmit(cmd); // CheckAPDUResponse(response); @@ -911,7 +911,7 @@ namespace NFC.Cards.NXP_MIFARE_DESFire // Le = 0x00 // }; - // APDUResponse response = _Card.Transmit(cmd); + // APDUResponse response = _NFCService.Transmit(cmd); // CheckAPDUResponse(response); //} #endregion diff --git a/NFC/Exceptions/CardException.cs b/NFC/Exceptions/CardException.cs new file mode 100644 index 0000000..9e2d767 --- /dev/null +++ b/NFC/Exceptions/CardException.cs @@ -0,0 +1,22 @@ +using System; + +namespace NFC.Exceptions +{ + public class CardException : Exception + { + public CardException() + { + + } + + public CardException(string message) : base(message) + { + + } + + public CardException(string message, Exception inner) : base(message, inner) + { + + } + } +} diff --git a/NFC/Exceptions/CardUnavailableException.cs b/NFC/Exceptions/CardUnavailableException.cs deleted file mode 100644 index ec9dbd8..0000000 --- a/NFC/Exceptions/CardUnavailableException.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace NFC.Exceptions -{ - public class CardUnavailableException : Exception - { - - } -} diff --git a/NFC/Exceptions/ConnectionException.cs b/NFC/Exceptions/ConnectionException.cs new file mode 100644 index 0000000..597b332 --- /dev/null +++ b/NFC/Exceptions/ConnectionException.cs @@ -0,0 +1,22 @@ +using System; + +namespace NFC.Exceptions +{ + public class ConnectionException : Exception + { + public ConnectionException() + { + + } + + public ConnectionException(string message) : base(message) + { + + } + + public ConnectionException(string message, Exception inner) : base(message, inner) + { + + } + } +} diff --git a/NFC/Exceptions/ReaderException.cs b/NFC/Exceptions/ReaderException.cs new file mode 100644 index 0000000..afbdd69 --- /dev/null +++ b/NFC/Exceptions/ReaderException.cs @@ -0,0 +1,22 @@ +using System; + +namespace NFC.Exceptions +{ + public class ReaderException : Exception + { + public ReaderException() + { + + } + + public ReaderException(string message) : base(message) + { + + } + + public ReaderException(string message, Exception inner) : base(message, inner) + { + + } + } +} diff --git a/NFC/Exceptions/ReaderUnavailableException.cs b/NFC/Exceptions/ReaderUnavailableException.cs deleted file mode 100644 index a685f0b..0000000 --- a/NFC/Exceptions/ReaderUnavailableException.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace NFC.Exceptions -{ - public class ReaderUnavailableException : Exception - { - - } -} diff --git a/NFC/Exceptions/TransmitException.cs b/NFC/Exceptions/TransmitException.cs new file mode 100644 index 0000000..17cfde6 --- /dev/null +++ b/NFC/Exceptions/TransmitException.cs @@ -0,0 +1,22 @@ +using System; + +namespace NFC.Exceptions +{ + public class TransmitException : Exception + { + public TransmitException() + { + + } + + public TransmitException(string message) : base(message) + { + + } + + public TransmitException(string message, Exception inner) : base(message, inner) + { + + } + } +} diff --git a/NFC/Interfaces/ICard.cs b/NFC/Interfaces/ICard.cs deleted file mode 100644 index 810624f..0000000 --- a/NFC/Interfaces/ICard.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace NFC.Interfaces -{ - public interface ICard - { - /// - /// Connect to Smartcard - /// - void Connect(); - - /// - /// Disconnect from Smartcard - /// - void Disconnect(); - - /// - /// Transmit APDU Command to Smartcard - /// - /// Application Protocol Data Unit Command - ISO 7816 - /// Application Protocol Data Unit Response - ISO 7816 - APDUResponse Transmit(APDUCommand apdu_cmd); - } -} diff --git a/NFC/Interfaces/IHardware.cs b/NFC/Interfaces/IHardware.cs deleted file mode 100644 index 17e94a4..0000000 --- a/NFC/Interfaces/IHardware.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; - -namespace NFC.Interfaces -{ - /// - /// Abstract representation of the platform specific NFC Hardware - /// - public interface IHardware - { - /// - /// Check if the device has nfc support - /// - /// Returns true if the device supports NFC - bool IsAvailable(); - - /// Returns all available readers - string[] GetReaders(); - - /// - /// Create a new reader instance from the specified id - /// - /// Returns the spatform specific reader that corresponds to the id - /// Invalid reader id - IReader OpenReader(string readerID); - } -} diff --git a/NFC/Interfaces/INFCService.cs b/NFC/Interfaces/INFCService.cs new file mode 100644 index 0000000..761badd --- /dev/null +++ b/NFC/Interfaces/INFCService.cs @@ -0,0 +1,59 @@ +using System.Collections.Generic; +using System; +using NFC.Exceptions; + +namespace NFC.Interfaces +{ + /// + /// Service to provide hardware specific NFC Interfaces + /// + public interface INFCService + { + /// + /// Indicates if NFC Hardware is available + /// + bool IsAvailable { get; } + + /// + /// Indicates if NFC Hardware is enabled + /// + bool IsEnabled { get; } + + /// + /// Indicates if NFC Card is connected + /// + bool IsConnected { get; } + + /// + /// Get a list of availible NFC ReaderIDs + /// + IList GetReaderIDs(); + + /// + /// Connect with ReaderID to NFC Card + /// + /// ReaderID from GetReaderIDs + /// + /// + /// + /// + void Connect(string readerID); + + /// + /// Disconnects Reader from NFC Card + /// + /// + /// + void Disconnect(); + + /// + /// Transmit APDUCommand to Card if connected + /// + /// + /// + /// + /// + /// + APDUResponse Transmit(APDUCommand command); + } +} diff --git a/NFC/Interfaces/IReader.cs b/NFC/Interfaces/IReader.cs deleted file mode 100644 index cc3c9e5..0000000 --- a/NFC/Interfaces/IReader.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace NFC.Interfaces -{ - public delegate void ReaderEventHandler(object sender, ICard card); - - /// - /// Abstraction of a platform-specifc reader that can communicate with NFC cards - /// - public interface IReader - { - /// - /// Event that will be called when a new tag was discovered - /// - event ReaderEventHandler CardDiscovered; - - /// - /// Event that will be called when a tag that is in use gets disconnected - /// - event ReaderEventHandler CardLost; - - void Start(); - - void Stop(); - } -} diff --git a/NFC_PCSC/Card_PCSC.cs b/NFC_PCSC/Card_PCSC.cs deleted file mode 100644 index 6514af5..0000000 --- a/NFC_PCSC/Card_PCSC.cs +++ /dev/null @@ -1,132 +0,0 @@ -using PCSC; -using PCSC.Iso7816; -using NFC.Interfaces; -using NFC; -using System; - -namespace NFC_PCSC -{ - public class Card_PCSC : ICard - { - private readonly IsoReader _ISOReader; - private readonly string _ReaderID; - - public Card_PCSC(IsoReader isoreader, string readerID) - { - _ISOReader = isoreader; - _ReaderID = readerID; - } - public void Connect() - { - _ISOReader.Connect(_ReaderID, SCardShareMode.Shared, PCSC.SCardProtocol.Any); - } - - public void Disconnect() - { - _ISOReader.Disconnect(SCardReaderDisposition.Eject); - } - - public APDUResponse Transmit(APDUCommand apdu_cmd) - { - Response response = _ISOReader.Transmit(ConvertAPDUCommand(apdu_cmd)); - return Convert(response); - } - - public CommandApdu ConvertAPDUCommand(APDUCommand apdu_cmd) - { - switch(apdu_cmd.Case) - { - case NFC.IsoCase.Case1: - return new CommandApdu(ConvertISOCase(apdu_cmd.Case), ConvertSCardProtocol(apdu_cmd.Protocol)) - { - CLA = apdu_cmd.CLA, - INS = apdu_cmd.INS, - P1 = apdu_cmd.P1, - P2 = apdu_cmd.P2 - }; - case NFC.IsoCase.Case2Short: - return new CommandApdu(ConvertISOCase(apdu_cmd.Case), ConvertSCardProtocol(apdu_cmd.Protocol)) - { - CLA = apdu_cmd.CLA, - INS = apdu_cmd.INS, - P1 = apdu_cmd.P1, - P2 = apdu_cmd.P2, - Le = apdu_cmd.LE - }; - case NFC.IsoCase.Case3Short: - return new CommandApdu(ConvertISOCase(apdu_cmd.Case), ConvertSCardProtocol(apdu_cmd.Protocol)) - { - CLA = apdu_cmd.CLA, - INS = apdu_cmd.INS, - P1 = apdu_cmd.P1, - P2 = apdu_cmd.P2, - Data = apdu_cmd.Data - }; - case NFC.IsoCase.Case4Short: - return new CommandApdu(ConvertISOCase(apdu_cmd.Case), ConvertSCardProtocol(apdu_cmd.Protocol)) - { - CLA = apdu_cmd.CLA, - INS = apdu_cmd.INS, - P1 = apdu_cmd.P1, - P2 = apdu_cmd.P2, - Data = apdu_cmd.Data, - Le = apdu_cmd.LE - }; - default: - throw new Exception("Unknown IsoCase"); - } - } - - public PCSC.Iso7816.IsoCase ConvertISOCase(NFC.IsoCase isoCase) - { - switch(isoCase) - { - case NFC.IsoCase.Case1: - return PCSC.Iso7816.IsoCase.Case1; - case NFC.IsoCase.Case2Short: - return PCSC.Iso7816.IsoCase.Case2Short; - case NFC.IsoCase.Case3Short: - return PCSC.Iso7816.IsoCase.Case3Short; - case NFC.IsoCase.Case4Short: - return PCSC.Iso7816.IsoCase.Case4Short; - default: - throw new Exception("Unknown IsoCase"); - } - } - - public PCSC.SCardProtocol ConvertSCardProtocol(NFC.SCardProtocol sCardProtocol) - { - switch (sCardProtocol) - { - case NFC.SCardProtocol.UNSET: - return PCSC.SCardProtocol.Unset; - case NFC.SCardProtocol.T0: - return PCSC.SCardProtocol.T0; - case NFC.SCardProtocol.T1: - return PCSC.SCardProtocol.T1; - case NFC.SCardProtocol.RAW: - return PCSC.SCardProtocol.Raw; - case NFC.SCardProtocol.T15: - return PCSC.SCardProtocol.T15; - case NFC.SCardProtocol.ANY: - return PCSC.SCardProtocol.Any; - default: - throw new NotSupportedException("Unknown SCardProtocol"); - } - } - - public APDUResponse Convert(Response response) - { - ResponseApdu responseApdu = response.Get(0); - - APDUResponse apduResponse = new APDUResponse() - { - SW1 = responseApdu.SW1, - SW2 = responseApdu.SW2, - Body = responseApdu.GetData() - }; - - return apduResponse; - } - } -} diff --git a/NFC_PCSC/Hardware_PCSC.cs b/NFC_PCSC/Hardware_PCSC.cs deleted file mode 100644 index 6588e61..0000000 --- a/NFC_PCSC/Hardware_PCSC.cs +++ /dev/null @@ -1,32 +0,0 @@ -using NFC.Interfaces; -using PCSC; - -namespace NFC_PCSC -{ - public class Hardware_PCSC : IHardware - { - public string[] GetReaders() - { - var contextFactory = ContextFactory.Instance; - using var context = contextFactory.Establish(SCardScope.System); - return context.GetReaders(); - } - - public bool IsAvailable() - { - if(GetReaders().Length == 0) - { - return false; - } - else - { - return true; - } - } - - public IReader OpenReader(string readerID) - { - return new Reader_PCSC(readerID); - } - } -} diff --git a/NFC_PCSC/Reader_PCSC.cs b/NFC_PCSC/Reader_PCSC.cs deleted file mode 100644 index 599da4e..0000000 --- a/NFC_PCSC/Reader_PCSC.cs +++ /dev/null @@ -1,50 +0,0 @@ -using NFC.Interfaces; -using PCSC; -using PCSC.Iso7816; -using System; - -namespace NFC_PCSC -{ - - public class Reader_PCSC : IReader, IDisposable - { - private string _ReaderID; - private IContextFactory _ContextFactory; - private ISCardContext _SCardContext; - private IsoReader _ISOReader; - private ICard _Card; - - public Reader_PCSC(string readerID) - { - _ReaderID = readerID; - } - - public event ReaderEventHandler CardDiscovered; - public event ReaderEventHandler CardLost; - - public void Dispose() - { - Stop(); - } - - public void Start() - { - _ContextFactory = ContextFactory.Instance; - _SCardContext = _ContextFactory.Establish(SCardScope.System); - - _ISOReader = new IsoReader(_SCardContext); - - _Card = new Card_PCSC(_ISOReader, _ReaderID); - - CardDiscovered?.Invoke(this, _Card); - } - - public void Stop() - { - CardLost?.Invoke(this, _Card); - - _ISOReader.Dispose(); - _SCardContext.Dispose(); - } - } -} diff --git a/NFC_Test/Cards/MIFARE_DESFire_Test.cs b/NFC_Test/Cards/MIFARE_DESFire_Test.cs index 816c923..e607253 100644 --- a/NFC_Test/Cards/MIFARE_DESFire_Test.cs +++ b/NFC_Test/Cards/MIFARE_DESFire_Test.cs @@ -413,9 +413,9 @@ namespace NFC_Test.Cards [Test] public void SelectApplication() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); APDUResponse response = new APDUResponse() { @@ -423,7 +423,7 @@ namespace NFC_Test.Cards SW2 = 0x00 }; - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "905a00000342414600")).Returns(response); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "905a00000342414600")).Returns(response); desfire.SelectApplication(0x464142); } @@ -431,7 +431,7 @@ namespace NFC_Test.Cards [Test] public void SelectApplication_InvalidAID() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(null); @@ -445,9 +445,9 @@ namespace NFC_Test.Cards [Test] public void AuthenticateISO_DES() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); APDUResponse response_challenge_request = new APDUResponse() { @@ -466,8 +466,8 @@ namespace NFC_Test.Cards byte[] rndA = HexConverter.ConvertFromHexString("5f7d1dd12d979173"); byte[] key = HexConverter.ConvertFromHexString("00000000000000000000000000000000"); - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "901a0000010000")).Returns(response_challenge_request); - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90af000010f8cdb2eaa42a3167dfcb53852ce267fd00")).Returns(response_challenge_response); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "901a0000010000")).Returns(response_challenge_request); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90af000010f8cdb2eaa42a3167dfcb53852ce267fd00")).Returns(response_challenge_response); desfire.AuthenticateISO_DES(0x00, key, rndA); @@ -493,9 +493,9 @@ namespace NFC_Test.Cards [Test] public void Format() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); APDUResponse response = new APDUResponse() { @@ -503,7 +503,7 @@ namespace NFC_Test.Cards SW2 = 0x00 }; - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90fc000000")).Returns(response); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90fc000000")).Returns(response); desfire.Format(); } @@ -511,9 +511,9 @@ namespace NFC_Test.Cards [Test] public void CreateApplication() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); APDUResponse response = new APDUResponse() { @@ -521,7 +521,7 @@ namespace NFC_Test.Cards SW2 = 0x00 }; - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90ca000005eeffaa0b8200")).Returns(response); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90ca000005eeffaa0b8200")).Returns(response); desfire.CreateApplication(0xAAFFEE, 0x0b, 0x82); } @@ -529,7 +529,7 @@ namespace NFC_Test.Cards [Test] public void CreateApplication_InvalidAID() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(null); @@ -543,9 +543,9 @@ namespace NFC_Test.Cards [Test] public void AuthenticateISO_AES() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); APDUResponse response_challenge_request = new APDUResponse() { @@ -564,8 +564,8 @@ namespace NFC_Test.Cards byte[] rndA = HexConverter.ConvertFromHexString("2176770e7a6eb4bef00d5e4b201d1e57"); byte[] key = HexConverter.ConvertFromHexString("00000000000000000000000000000000"); - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90aa0000010000")).Returns(response_challenge_request); - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90af000020cbe9726faf54bc76b2055d0b9700e7dc97ecad5627f1d1702a16e8408d2a0ada00")).Returns(response_challenge_response); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90aa0000010000")).Returns(response_challenge_request); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90af000020cbe9726faf54bc76b2055d0b9700e7dc97ecad5627f1d1702a16e8408d2a0ada00")).Returns(response_challenge_response); desfire.AuthenticateISO_AES(0x00, key, rndA); @@ -591,9 +591,9 @@ namespace NFC_Test.Cards [Test] public void ChangeKey_AES() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); APDUResponse response = new APDUResponse() { @@ -601,7 +601,7 @@ namespace NFC_Test.Cards SW2 = 0x00 }; - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90c400002100c2b54a718d0251845653199909bb32e8e38bd6719e8dc21799c29c922a0984fc00")).Returns(response); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90c400002100c2b54a718d0251845653199909bb32e8e38bd6719e8dc21799c29c922a0984fc00")).Returns(response); byte[] new_key = HexConverter.ConvertFromHexString("25432a462d4a614e645267556b587032"); @@ -629,9 +629,9 @@ namespace NFC_Test.Cards [Test] public void ChangeOtherKey_AES() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); APDUResponse response = new APDUResponse() { @@ -639,7 +639,7 @@ namespace NFC_Test.Cards SW2 = 0x00 }; - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90c400002101a8c5a61a06f56f38dc91266fed2e87dc00a5ad72a634ff0e62c8d6d80707dd6000")).Returns(response); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90c400002101a8c5a61a06f56f38dc91266fed2e87dc00a5ad72a634ff0e62c8d6d80707dd6000")).Returns(response); byte[] new_key = HexConverter.ConvertFromHexString("25432a462d4a614e645267556b587032"); byte[] old_key = HexConverter.ConvertFromHexString("00000000000000000000000000000000"); @@ -668,9 +668,9 @@ namespace NFC_Test.Cards [Test] public void CreateFile_Standard() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); APDUResponse response = new APDUResponse() { @@ -678,7 +678,7 @@ namespace NFC_Test.Cards SW2 = 0x00 }; - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90cd000007010000e0f0000000")).Returns(response); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90cd000007010000e0f0000000")).Returns(response); UInt16 accesRights = desfire.GenerateFileAccessRights((byte)FileAccessRights.FREE, 0x00, 0x00, 0x00); desfire.CreateFile_Standard(0x01, FileCommunication.PLAIN, accesRights, 0xF0); @@ -687,9 +687,9 @@ namespace NFC_Test.Cards [Test] public void CreateFile_Standard_InvalidFID() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); Assert.Throws( delegate @@ -701,9 +701,9 @@ namespace NFC_Test.Cards [Test] public void WriteData() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); APDUResponse response = new APDUResponse() { @@ -711,7 +711,9 @@ namespace NFC_Test.Cards SW2 = 0x00 }; - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "903d00000f01000000080000546573743132333400")).Returns(response); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "903d00000f01000000080000546573743132333400")).Returns(response); + + desfire._SessionKey = HexConverter.ConvertFromHexString("00000000000000000000000000000000"); desfire.WriteData(0x01, 0, Encoding.ASCII.GetBytes("Test1234")); } @@ -719,9 +721,9 @@ namespace NFC_Test.Cards [Test] public void WriteData_Long() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); APDUResponse response = new APDUResponse() { @@ -729,9 +731,11 @@ namespace NFC_Test.Cards SW2 = 0x00 }; - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "903d000036010000002f0000546573743132333454657374313233345465737431323334546573743132333454657374313233345465737431323300")).Returns(response); - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "903d000036012f00002f0000345465737431323334546573743132333454657374313233345465737431323334546573743132333454657374313200")).Returns(response); - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "903d000019015e000012000033345465737431323334546573743132333400")).Returns(response); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "903d000036010000002f0000546573743132333454657374313233345465737431323334546573743132333454657374313233345465737431323300")).Returns(response); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "903d000036012f00002f0000345465737431323334546573743132333454657374313233345465737431323334546573743132333454657374313200")).Returns(response); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "903d000019015e000012000033345465737431323334546573743132333400")).Returns(response); + + desfire._SessionKey = HexConverter.ConvertFromHexString("00000000000000000000000000000000"); desfire.WriteData(0x01, 0, Encoding.ASCII.GetBytes("Test1234Test1234Test1234Test1234Test1234Test1234Test1234Test1234Test1234Test1234Test1234Test1234Test1234Test1234")); } @@ -739,9 +743,9 @@ namespace NFC_Test.Cards [Test] public void WriteData_InvalidFileID() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); Assert.Throws( delegate @@ -753,9 +757,9 @@ namespace NFC_Test.Cards [Test] public void ReadData() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); APDUResponse response = new APDUResponse() { @@ -764,7 +768,7 @@ namespace NFC_Test.Cards Body = HexConverter.ConvertFromHexString("54657374313233340000000000000000000000000000000000000000000000009100") }; - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90bd0000070100000020000000")).Returns(response); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90bd0000070100000020000000")).Returns(response); byte[] data = desfire.ReadData(0x01, 0x00, 0x20); @@ -774,9 +778,9 @@ namespace NFC_Test.Cards [Test] public void ReadData_CMAC() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); APDUResponse response = new APDUResponse() { @@ -785,7 +789,7 @@ namespace NFC_Test.Cards Body = HexConverter.ConvertFromHexString("5465737431323334000000000000000000000000000000000000000000000000809a9bedbc559a5b9100") }; - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90bd0000070100000020000000")).Returns(response); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90bd0000070100000020000000")).Returns(response); byte[] data = desfire.ReadData(0x01, 0x00, 0x20); @@ -795,9 +799,9 @@ namespace NFC_Test.Cards [Test] public void ReadData_Long() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); APDUResponse response_1 = new APDUResponse() { @@ -820,9 +824,9 @@ namespace NFC_Test.Cards Body = HexConverter.ConvertFromHexString("00009100") }; - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90bd000007010000002f000000")).Returns(response_1); - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90bd000007012f00002f000000")).Returns(response_2); - card.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90bd000007015e000002000000")).Returns(response_3); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90bd000007010000002f000000")).Returns(response_1); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90bd000007012f00002f000000")).Returns(response_2); + nfcService.Transmit(Arg.Is(x => HexConverter.ConvertToHexString(x.ToArray()) == "90bd000007015e000002000000")).Returns(response_3); byte[] data = desfire.ReadData(0x01, 0x00, 0x60); @@ -832,9 +836,9 @@ namespace NFC_Test.Cards [Test] public void ReadData_InvalidFileID() { - ICard card = Substitute.For(); + INFCService nfcService = Substitute.For(); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); Assert.Throws( delegate diff --git a/NFC_Test/NFC_Test.csproj b/NFC_Test/NFC_Test.csproj index b56df76..7b65138 100644 --- a/NFC_Test/NFC_Test.csproj +++ b/NFC_Test/NFC_Test.csproj @@ -12,8 +12,8 @@ + - diff --git a/NFC_Test/REAL/REAL_DESFireCommands.cs b/NFC_Test/REAL/REAL_DESFireCommands.cs index b64fdf7..9a81aed 100644 --- a/NFC_Test/REAL/REAL_DESFireCommands.cs +++ b/NFC_Test/REAL/REAL_DESFireCommands.cs @@ -1,16 +1,16 @@ -using NFC.Cards.NXP_MIFARE_DESFire; -using NFC.Cards.NXP_MIFARE_DESFire.Enums; -using NFC.Helper.Crypto; +using NFC.Helper.Crypto; using NFC.Interfaces; -using NFC_PCSC; using NUnit.Framework; using System; using System.Text; +using NFC.PCSC; +using NFC.Cards.NXP_MIFARE_DESFire; +using NFC.Cards.NXP_MIFARE_DESFire.Enums; namespace NFC_Test.REAL { /// - /// Test all DESFire Commands with an Empty Card + /// Test all DESFire Commands with an Empty nfcService /// The Test are ordered to check the Commands one by one /// [TestFixture, Explicit] @@ -20,7 +20,7 @@ namespace NFC_Test.REAL /// Set ReaderID for PCSC Interface /// You can get the ID from REAL_Reader_PCSC /// - public readonly string ReaderID = "ACS ACR122U PICC Interface 0"; + public readonly string ReaderID = "ACS ACR122 0";//"ACS ACR122U PICC Interface 0"; #region Fixed Config Properties public readonly UInt32 ApplicationID = 0xAAFFEE; @@ -33,445 +33,285 @@ namespace NFC_Test.REAL [Test, Order(1)] public void SelectApplication() { - IHardware hardware = new Hardware_PCSC(); - IReader reader = hardware.OpenReader(ReaderID); + INFCService nfcService = new NFCService(); - bool test_successfully = false; + nfcService.Connect(ReaderID); - ReaderEventHandler handler = (sender, card) => - { - card.Connect(); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + desfire.SelectApplication(0x000000); - desfire.SelectApplication(0x000000); - - test_successfully = true; - - card.Disconnect(); - }; - - reader.CardDiscovered += handler; - reader.Start(); - - Assert.AreEqual(true, test_successfully); - - reader.Stop(); - reader.CardDiscovered -= handler; + nfcService.Disconnect(); } [Test, Order(2)] public void Authenticate_DES() { - IHardware hardware = new Hardware_PCSC(); - IReader reader = hardware.OpenReader(ReaderID); + INFCService nfcService = new NFCService(); - bool test_successfully = false; + nfcService.Connect(ReaderID); - ReaderEventHandler handler = (sender, card) => - { - card.Connect(); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + desfire.SelectApplication(0x000000); - desfire.SelectApplication(0x000000); + CipherKey key = new CipherKey(CipherType.TDES); + desfire.AuthenticateISO_DES(0x00, key._Key); - 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; + nfcService.Disconnect(); } [Test, Order(3)] public void Format() { - IHardware hardware = new Hardware_PCSC(); - IReader reader = hardware.OpenReader(ReaderID); + INFCService nfcService = new NFCService(); - bool test_successfully = false; + nfcService.Connect(ReaderID); - ReaderEventHandler handler = (sender, card) => - { - card.Connect(); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + desfire.SelectApplication(0x000000); - desfire.SelectApplication(0x000000); + CipherKey key = new CipherKey(CipherType.TDES); + desfire.AuthenticateISO_DES(0x00, key._Key); - CipherKey key = new CipherKey(CipherType.TDES); - desfire.AuthenticateISO_DES(0x00, key._Key); + desfire.Format(); - desfire.Format(); - - test_successfully = true; - - card.Disconnect(); - }; - - reader.CardDiscovered += handler; - reader.Start(); - - Assert.AreEqual(true, test_successfully); - - reader.Stop(); - reader.CardDiscovered -= handler; + nfcService.Disconnect(); } [Test, Order(4)] public void CreateApplication() { - IHardware hardware = new Hardware_PCSC(); - IReader reader = hardware.OpenReader(ReaderID); + INFCService nfcService = new NFCService(); - bool test_successfully = false; + nfcService.Connect(ReaderID); - ReaderEventHandler handler = (sender, card) => - { - card.Connect(); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + desfire.SelectApplication(0x000000); - desfire.SelectApplication(0x000000); + CipherKey key = new CipherKey(CipherType.TDES); + desfire.AuthenticateISO_DES(0x00, key._Key); - CipherKey key = new CipherKey(CipherType.TDES); - desfire.AuthenticateISO_DES(0x00, key._Key); + desfire.Format(); - desfire.Format(); + desfire.AuthenticateISO_DES(0x00, key._Key); - desfire.AuthenticateISO_DES(0x00, key._Key); + byte keysetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); + byte keysetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 2); - byte keysetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); - byte keysetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 2); + desfire.CreateApplication(ApplicationID, keysetting1, keysetting2); - desfire.CreateApplication(ApplicationID, keysetting1, keysetting2); - - test_successfully = true; - - card.Disconnect(); - }; - - reader.CardDiscovered += handler; - reader.Start(); - - Assert.AreEqual(true, test_successfully); - - reader.Stop(); - reader.CardDiscovered -= handler; + nfcService.Disconnect(); } [Test, Order(5)] public void Authenticate_AES() { - IHardware hardware = new Hardware_PCSC(); - IReader reader = hardware.OpenReader(ReaderID); + INFCService nfcService = new NFCService(); - bool test_successfully = false; + nfcService.Connect(ReaderID); - ReaderEventHandler handler = (sender, card) => - { - card.Connect(); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + desfire.SelectApplication(0x000000); - desfire.SelectApplication(0x000000); + CipherKey key = new CipherKey(CipherType.TDES); + desfire.AuthenticateISO_DES(0x00, key._Key); - CipherKey key = new CipherKey(CipherType.TDES); - desfire.AuthenticateISO_DES(0x00, key._Key); + desfire.Format(); - desfire.Format(); + desfire.AuthenticateISO_DES(0x00, key._Key); - desfire.AuthenticateISO_DES(0x00, key._Key); + byte keysetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); + byte keysetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 2); - byte keysetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); - byte keysetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 2); + desfire.CreateApplication(ApplicationID, keysetting1, keysetting2); - desfire.CreateApplication(ApplicationID, keysetting1, keysetting2); + desfire.SelectApplication(ApplicationID); - desfire.SelectApplication(ApplicationID); + CipherKey key_aes = new CipherKey(CipherType.AES); + desfire.AuthenticateISO_AES(0x00, key_aes._Key); - CipherKey key_aes = new CipherKey(CipherType.AES); - desfire.AuthenticateISO_AES(0x00, key_aes._Key); - - test_successfully = true; - - card.Disconnect(); - }; - - reader.CardDiscovered += handler; - reader.Start(); - - Assert.AreEqual(true, test_successfully); - - reader.Stop(); - reader.CardDiscovered -= handler; + nfcService.Disconnect(); } [Test, Order(6)] public void ChangeApplicationMasterKey() { - IHardware hardware = new Hardware_PCSC(); - IReader reader = hardware.OpenReader(ReaderID); + INFCService nfcService = new NFCService(); - bool test_successfully = false; + nfcService.Connect(ReaderID); - ReaderEventHandler handler = (sender, card) => - { - card.Connect(); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + desfire.SelectApplication(0x000000); - desfire.SelectApplication(0x000000); + CipherKey key = new CipherKey(CipherType.TDES); + desfire.AuthenticateISO_DES(0x00, key._Key); - CipherKey key = new CipherKey(CipherType.TDES); - desfire.AuthenticateISO_DES(0x00, key._Key); + desfire.Format(); - desfire.Format(); + desfire.AuthenticateISO_DES(0x00, key._Key); - desfire.AuthenticateISO_DES(0x00, key._Key); + byte keysetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); + byte keysetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 2); - byte keysetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); - byte keysetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 2); + desfire.CreateApplication(ApplicationID, keysetting1, keysetting2); - desfire.CreateApplication(ApplicationID, keysetting1, keysetting2); + desfire.SelectApplication(ApplicationID); - desfire.SelectApplication(ApplicationID); + CipherKey key_aes = new CipherKey(CipherType.AES); + desfire.AuthenticateISO_AES(0x00, key_aes._Key); - CipherKey key_aes = new CipherKey(CipherType.AES); - desfire.AuthenticateISO_AES(0x00, key_aes._Key); + CipherKey key_aes_new = new CipherKey(ApplicationMasterKey, CipherType.AES, 0x10); + desfire.ChangeKey_AES(0x00, key_aes_new._Key, key_aes_new._KeyVersion); - CipherKey key_aes_new = new CipherKey(ApplicationMasterKey, CipherType.AES, 0x10); - desfire.ChangeKey_AES(0x00, key_aes_new._Key, key_aes_new._KeyVersion); - - test_successfully = true; - - card.Disconnect(); - }; - - reader.CardDiscovered += handler; - reader.Start(); - - Assert.AreEqual(true, test_successfully); - - reader.Stop(); - reader.CardDiscovered -= handler; + nfcService.Disconnect(); } [Test, Order(7)] public void ChangeApplicationKey_1() { - IHardware hardware = new Hardware_PCSC(); - IReader reader = hardware.OpenReader(ReaderID); + INFCService nfcService = new NFCService(); - bool test_successfully = false; + nfcService.Connect(ReaderID); - ReaderEventHandler handler = (sender, card) => - { - card.Connect(); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + desfire.SelectApplication(0x000000); - desfire.SelectApplication(0x000000); + CipherKey key = new CipherKey(CipherType.TDES); + desfire.AuthenticateISO_DES(0x00, key._Key); - CipherKey key = new CipherKey(CipherType.TDES); - desfire.AuthenticateISO_DES(0x00, key._Key); + desfire.Format(); - desfire.Format(); + desfire.AuthenticateISO_DES(0x00, key._Key); - desfire.AuthenticateISO_DES(0x00, key._Key); + byte keysetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); + byte keysetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 2); - byte keysetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); - byte keysetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 2); + desfire.CreateApplication(ApplicationID, keysetting1, keysetting2); - desfire.CreateApplication(ApplicationID, keysetting1, keysetting2); + desfire.SelectApplication(ApplicationID); - desfire.SelectApplication(ApplicationID); + CipherKey key_aes = new CipherKey(CipherType.AES); + desfire.AuthenticateISO_AES(0x00, key_aes._Key); - CipherKey key_aes = new CipherKey(CipherType.AES); - desfire.AuthenticateISO_AES(0x00, key_aes._Key); + CipherKey key_new = new CipherKey(ApplicationKey_1, CipherType.AES, 0x10); + desfire.ChangeOtherKey_AES(0x01, key_new._Key, key_aes._Key, key_new._KeyVersion); - CipherKey key_new = new CipherKey(ApplicationKey_1, CipherType.AES, 0x10); - desfire.ChangeOtherKey_AES(0x01, key_new._Key, key_aes._Key, key_new._KeyVersion); - - test_successfully = true; - - card.Disconnect(); - }; - - reader.CardDiscovered += handler; - reader.Start(); - - Assert.AreEqual(true, test_successfully); - - reader.Stop(); - reader.CardDiscovered -= handler; + nfcService.Disconnect(); } [Test, Order(8)] public void CreateFile() { - IHardware hardware = new Hardware_PCSC(); - IReader reader = hardware.OpenReader(ReaderID); + INFCService nfcService = new NFCService(); - bool test_successfully = false; + nfcService.Connect(ReaderID); - ReaderEventHandler handler = (sender, card) => - { - card.Connect(); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + desfire.SelectApplication(0x000000); - desfire.SelectApplication(0x000000); + CipherKey key = new CipherKey(CipherType.TDES); + desfire.AuthenticateISO_DES(0x00, key._Key); - CipherKey key = new CipherKey(CipherType.TDES); - desfire.AuthenticateISO_DES(0x00, key._Key); + desfire.Format(); - desfire.Format(); + desfire.AuthenticateISO_DES(0x00, key._Key); - desfire.AuthenticateISO_DES(0x00, key._Key); + byte keysetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); + byte keysetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 2); - byte keysetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); - byte keysetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 2); + desfire.CreateApplication(ApplicationID, keysetting1, keysetting2); - desfire.CreateApplication(ApplicationID, keysetting1, keysetting2); + desfire.SelectApplication(ApplicationID); - desfire.SelectApplication(ApplicationID); + CipherKey key_aes = new CipherKey(CipherType.AES); + desfire.AuthenticateISO_AES(0x00, key_aes._Key); - CipherKey key_aes = new CipherKey(CipherType.AES); - desfire.AuthenticateISO_AES(0x00, key_aes._Key); + UInt16 accesRights = desfire.GenerateFileAccessRights((byte)FileAccessRights.FREE, 0x00, 0x00, 0x00); + desfire.CreateFile_Standard(FileID, FileCommunication.PLAIN, accesRights, FileSize); - UInt16 accesRights = desfire.GenerateFileAccessRights((byte)FileAccessRights.FREE, 0x00, 0x00, 0x00); - desfire.CreateFile_Standard(FileID, FileCommunication.PLAIN, accesRights, FileSize); - - test_successfully = true; - - card.Disconnect(); - }; - - reader.CardDiscovered += handler; - reader.Start(); - - Assert.AreEqual(true, test_successfully); - - reader.Stop(); - reader.CardDiscovered -= handler; + nfcService.Disconnect(); } [Test, Order(9)] public void WriteFile() { - IHardware hardware = new Hardware_PCSC(); - IReader reader = hardware.OpenReader(ReaderID); + INFCService nfcService = new NFCService(); - bool test_successfully = false; + nfcService.Connect(ReaderID); - ReaderEventHandler handler = (sender, card) => - { - card.Connect(); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + desfire.SelectApplication(0x000000); - desfire.SelectApplication(0x000000); + CipherKey key = new CipherKey(CipherType.TDES); + desfire.AuthenticateISO_DES(0x00, key._Key); - CipherKey key = new CipherKey(CipherType.TDES); - desfire.AuthenticateISO_DES(0x00, key._Key); + desfire.Format(); - desfire.Format(); + desfire.AuthenticateISO_DES(0x00, key._Key); - desfire.AuthenticateISO_DES(0x00, key._Key); + byte keysetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); + byte keysetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 2); - byte keysetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); - byte keysetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 2); + desfire.CreateApplication(ApplicationID, keysetting1, keysetting2); - desfire.CreateApplication(ApplicationID, keysetting1, keysetting2); + desfire.SelectApplication(ApplicationID); - desfire.SelectApplication(ApplicationID); + CipherKey key_aes = new CipherKey(CipherType.AES); + desfire.AuthenticateISO_AES(0x00, key_aes._Key); - CipherKey key_aes = new CipherKey(CipherType.AES); - desfire.AuthenticateISO_AES(0x00, key_aes._Key); + UInt16 accesRights = desfire.GenerateFileAccessRights((byte)FileAccessRights.FREE, 0x00, 0x00, 0x00); + desfire.CreateFile_Standard(FileID, FileCommunication.PLAIN, accesRights, FileSize); - UInt16 accesRights = desfire.GenerateFileAccessRights((byte)FileAccessRights.FREE, 0x00, 0x00, 0x00); - desfire.CreateFile_Standard(FileID, FileCommunication.PLAIN, accesRights, FileSize); + desfire.WriteData(FileID, 0, Encoding.ASCII.GetBytes("Test1234")); - desfire.WriteData(FileID, 0, Encoding.ASCII.GetBytes("Test1234")); - - test_successfully = true; - - card.Disconnect(); - }; - - reader.CardDiscovered += handler; - reader.Start(); - - Assert.AreEqual(true, test_successfully); - - reader.Stop(); - reader.CardDiscovered -= handler; + nfcService.Disconnect(); } [Test, Order(10)] public void ReadFile() { - IHardware hardware = new Hardware_PCSC(); - IReader reader = hardware.OpenReader(ReaderID); + INFCService nfcService = new NFCService(); - bool test_successfully = false; + nfcService.Connect(ReaderID); - ReaderEventHandler handler = (sender, card) => - { - card.Connect(); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + desfire.SelectApplication(0x000000); - desfire.SelectApplication(0x000000); + CipherKey key = new CipherKey(CipherType.TDES); + desfire.AuthenticateISO_DES(0x00, key._Key); - CipherKey key = new CipherKey(CipherType.TDES); - desfire.AuthenticateISO_DES(0x00, key._Key); + desfire.Format(); - desfire.Format(); + desfire.AuthenticateISO_DES(0x00, key._Key); - desfire.AuthenticateISO_DES(0x00, key._Key); + byte keysetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); + byte keysetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 2); - byte keysetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); - byte keysetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 2); + desfire.CreateApplication(ApplicationID, keysetting1, keysetting2); - desfire.CreateApplication(ApplicationID, keysetting1, keysetting2); + desfire.SelectApplication(ApplicationID); - desfire.SelectApplication(ApplicationID); + CipherKey key_aes = new CipherKey(CipherType.AES); + desfire.AuthenticateISO_AES(0x00, key_aes._Key); - CipherKey key_aes = new CipherKey(CipherType.AES); - desfire.AuthenticateISO_AES(0x00, key_aes._Key); + UInt16 accesRights = desfire.GenerateFileAccessRights((byte)FileAccessRights.FREE, 0x00, 0x00, 0x00); + desfire.CreateFile_Standard(FileID, FileCommunication.PLAIN, accesRights, FileSize); - UInt16 accesRights = desfire.GenerateFileAccessRights((byte)FileAccessRights.FREE, 0x00, 0x00, 0x00); - desfire.CreateFile_Standard(FileID, FileCommunication.PLAIN, accesRights, FileSize); + desfire.WriteData(FileID, 0, Encoding.ASCII.GetBytes("Test1234")); - desfire.WriteData(FileID, 0, Encoding.ASCII.GetBytes("Test1234")); + byte[] data = desfire.ReadData(FileID, 0, FileSize); + Console.WriteLine(Encoding.ASCII.GetString(data).Replace("\u0000", "")); - byte[] data = desfire.ReadData(FileID, 0, FileSize); - Console.WriteLine(Encoding.ASCII.GetString(data).Replace("\u0000", "")); - - test_successfully = true; - - card.Disconnect(); - }; - - reader.CardDiscovered += handler; - reader.Start(); - - Assert.AreEqual(true, test_successfully); - - reader.Stop(); - reader.CardDiscovered -= handler; + nfcService.Disconnect(); } } } diff --git a/NFC_Test/REAL/REAL_EncFile.cs b/NFC_Test/REAL/REAL_EncFile.cs index c02c879..7292119 100644 --- a/NFC_Test/REAL/REAL_EncFile.cs +++ b/NFC_Test/REAL/REAL_EncFile.cs @@ -1,18 +1,18 @@ using NFC; -using NFC.Cards.NXP_MIFARE_DESFire; -using NFC.Cards.NXP_MIFARE_DESFire.Enums; using NFC.Helper; using NFC.Helper.Crypto; using NFC.Interfaces; -using NFC_PCSC; using NUnit.Framework; using System; using System.Text; +using NFC.PCSC; +using NFC.Cards.NXP_MIFARE_DESFire.Enums; +using NFC.Cards.NXP_MIFARE_DESFire; namespace NFC_Test.REAL { /// - /// Test all DESFire Commands with an Empty Card + /// Test all DESFire Commands with an Empty nfcService /// The Test are ordered to check the Commands one by one /// [TestFixture, Explicit] @@ -22,7 +22,7 @@ namespace NFC_Test.REAL /// Set ReaderID for PCSC Interface /// You can get the ID from REAL_Reader_PCSC /// - public readonly string ReaderID = "ACS ACR122U PICC Interface 0"; + public readonly string ReaderID = "ACS ACR122 0";// "ACS ACR122U PICC Interface 0"; #region Fixed Config Properties public readonly UInt32 ApplicationID = 0xAAFFEE; @@ -35,66 +35,50 @@ namespace NFC_Test.REAL [Test, Order(1)] public void CreateFile() { - IHardware hardware = new Hardware_PCSC(); - IReader reader = hardware.OpenReader(ReaderID); + INFCService nfcService = new NFCService(); - bool test_successfully = false; + nfcService.Connect(ReaderID); - ReaderEventHandler handler = (sender, card) => + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); + + desfire.SelectApplication(0x000000); + + CipherKey key = new CipherKey(CipherType.TDES); + desfire.AuthenticateISO_DES(0x00, key._Key); + + desfire.Format(); + + desfire.AuthenticateISO_DES(0x00, key._Key); + + byte keysetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); + byte keysetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 2); + + desfire.CreateApplication(ApplicationID, keysetting1, keysetting2); + + desfire.SelectApplication(ApplicationID); + + CipherKey key_aes = new CipherKey(CipherType.AES); + desfire.AuthenticateISO_AES(0x00, key_aes._Key); + + UInt16 accesRights = desfire.GenerateFileAccessRights((byte)FileAccessRights.FREE, 0x00, 0x00, 0x00); + desfire.CreateFile_Standard(FileID, FileCommunication.ENCRYPT, accesRights, FileSize); + + desfire.WriteData(FileID, 0, Encoding.ASCII.GetBytes("Test1234")); + + APDUCommand cmd_WriteData = new APDUCommand(IsoCase.Case4Short) { - card.Connect(); - - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); - - desfire.SelectApplication(0x000000); - - CipherKey key = new CipherKey(CipherType.TDES); - desfire.AuthenticateISO_DES(0x00, key._Key); - - desfire.Format(); - - desfire.AuthenticateISO_DES(0x00, key._Key); - - byte keysetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); - byte keysetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 2); - - desfire.CreateApplication(ApplicationID, keysetting1, keysetting2); - - desfire.SelectApplication(ApplicationID); - - CipherKey key_aes = new CipherKey(CipherType.AES); - desfire.AuthenticateISO_AES(0x00, key_aes._Key); - - UInt16 accesRights = desfire.GenerateFileAccessRights((byte)FileAccessRights.FREE, 0x00, 0x00, 0x00); - desfire.CreateFile_Standard(FileID, FileCommunication.ENCRYPT, accesRights, FileSize); - - desfire.WriteData(FileID, 0, Encoding.ASCII.GetBytes("Test1234")); - - APDUCommand cmd_WriteData = new APDUCommand(IsoCase.Case4Short) - { - CLA = 0x90, - INS = 0x3D, - Data = ByteOperation.GenerateEmptyArray(8) - }; - Console.WriteLine(cmd_WriteData.ToString()); - APDUResponse response = card.Transmit(cmd_WriteData); - Console.WriteLine(response.ToString()); - - byte[] data = desfire.ReadData(FileID, 0, FileSize); - Console.WriteLine(Encoding.ASCII.GetString(data).Replace("\u0000", "")); - - test_successfully = true; - - card.Disconnect(); + CLA = 0x90, + INS = 0x3D, + Data = ByteOperation.GenerateEmptyArray(8) }; + Console.WriteLine(cmd_WriteData.ToString()); + APDUResponse response = nfcService.Transmit(cmd_WriteData); + Console.WriteLine(response.ToString()); - reader.CardDiscovered += handler; - reader.Start(); + byte[] data = desfire.ReadData(FileID, 0, FileSize); + Console.WriteLine(Encoding.ASCII.GetString(data).Replace("\u0000", "")); - Assert.AreEqual(true, test_successfully); - - reader.Stop(); - reader.CardDiscovered -= handler; + nfcService.Disconnect(); } } } diff --git a/NFC_Test/REAL/REAL_FabAccess_OTA.cs b/NFC_Test/REAL/REAL_FabAccess_OTA.cs index 3553509..c0057f9 100644 --- a/NFC_Test/REAL/REAL_FabAccess_OTA.cs +++ b/NFC_Test/REAL/REAL_FabAccess_OTA.cs @@ -1,24 +1,24 @@ -using NFC.Cards.NXP_MIFARE_DESFire; -using NFC.Cards.NXP_MIFARE_DESFire.Enums; -using NFC.Helper.Crypto; +using NFC.Helper.Crypto; using NFC.Interfaces; -using NFC_PCSC; using NUnit.Framework; using System; using System.Text; +using NFC.PCSC; +using NFC.Cards.NXP_MIFARE_DESFire; +using NFC.Cards.NXP_MIFARE_DESFire.Enums; namespace NFC_Test.REAL { [TestFixture, Explicit] public class REAL_FabAccess_OTA { - private string _ReaderID = "ACS ACR122U PICC Interface 0"; + private string _ReaderID = "ACS ACR122 0";//"ACS ACR122U PICC Interface 0"; private UInt32 _FabAccess_AID = 0x2A472D; private byte _FabAccess_FID = 0x01; private UInt32 _FabAccess_FSize = 0xF0; // Change of PICC Key is not implementet yet - // private CipherKey _FabAccess_Card_MasterKey = new CipherKey("294A404E635266556A576E5A72347537", CipherType.AES, 0x10); + // private CipherKey _FabAccess_nfcService_MasterKey = new CipherKey("294A404E635266556A576E5A72347537", CipherType.AES, 0x10); private CipherKey _FabAccess_Application_MasterKey = new CipherKey("50645367566B59703273357638792F42", CipherType.AES, 0x10); private CipherKey _FabAccess_Application_AuthKey = new CipherKey("6D5A7134743677397A24432646294A40", CipherType.AES, 0x10); @@ -35,52 +35,36 @@ namespace NFC_Test.REAL [Test, Order(1)] public void Init_EmptyCard() { - IHardware hardware = new Hardware_PCSC(); - IReader reader = hardware.OpenReader(_ReaderID); + INFCService nfcService = new NFCService(); - bool transmit_successfully = false; + nfcService.Connect(_ReaderID); - ReaderEventHandler handler = (sender, card) => - { - card.Connect(); + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + desfire.SelectApplication(0x000000); + desfire.AuthenticateISO_DES(0x00, _Default_DESKey._Key); + desfire.Format(); - desfire.SelectApplication(0x000000); - desfire.AuthenticateISO_DES(0x00, _Default_DESKey._Key); - desfire.Format(); + desfire.AuthenticateISO_DES(0x00, _Default_DESKey._Key); - desfire.AuthenticateISO_DES(0x00, _Default_DESKey._Key); + byte keySetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); + byte keySetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 0x02); + desfire.CreateApplication(_FabAccess_AID, keySetting1, keySetting2); - byte keySetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE); - byte keySetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 0x02); - desfire.CreateApplication(_FabAccess_AID, keySetting1, keySetting2); + desfire.SelectApplication(_FabAccess_AID); + desfire.AuthenticateISO_AES(0x00, _Default_AESKey._Key); - desfire.SelectApplication(_FabAccess_AID); - desfire.AuthenticateISO_AES(0x00, _Default_AESKey._Key); + desfire.ChangeKey_AES(0x00, _FabAccess_Application_MasterKey._Key, _FabAccess_Application_MasterKey._KeyVersion); - desfire.ChangeKey_AES(0x00, _FabAccess_Application_MasterKey._Key, _FabAccess_Application_MasterKey._KeyVersion); + desfire.AuthenticateISO_AES(0x00, _FabAccess_Application_MasterKey._Key); + desfire.ChangeOtherKey_AES(0x01, _FabAccess_Application_AuthKey._Key, _Default_AESKey._Key, _FabAccess_Application_AuthKey._KeyVersion); - desfire.AuthenticateISO_AES(0x00, _FabAccess_Application_MasterKey._Key); - desfire.ChangeOtherKey_AES(0x01, _FabAccess_Application_AuthKey._Key, _Default_AESKey._Key, _FabAccess_Application_AuthKey._KeyVersion); + UInt16 accesRights = desfire.GenerateFileAccessRights((byte)FileAccessRights.FREE, 0x00, 0x00, 0x00); + desfire.CreateFile_Standard(_FabAccess_FID, FileCommunication.PLAIN, accesRights, _FabAccess_FSize); - UInt16 accesRights = desfire.GenerateFileAccessRights((byte)FileAccessRights.FREE, 0x00, 0x00, 0x00); - desfire.CreateFile_Standard(_FabAccess_FID, FileCommunication.PLAIN, accesRights, _FabAccess_FSize); + desfire.WriteData(_FabAccess_FID, 0, Encoding.ASCII.GetBytes(_FabAccess_UserDomain)); - desfire.WriteData(_FabAccess_FID, 0, Encoding.ASCII.GetBytes(_FabAccess_UserDomain)); - - transmit_successfully = true; - - card.Disconnect(); - }; - - reader.CardDiscovered += handler; - reader.Start(); - - Assert.AreEqual(true, transmit_successfully); - - reader.Stop(); - reader.CardDiscovered -= handler; + nfcService.Disconnect(); } /// @@ -89,42 +73,26 @@ namespace NFC_Test.REAL [Test, Order(2)] public void Authenticate() { - IHardware hardware = new Hardware_PCSC(); - IReader reader = hardware.OpenReader(_ReaderID); + INFCService nfcService = new NFCService(); - bool transmit_successfully = false; + nfcService.Connect(_ReaderID); - ReaderEventHandler handler = (sender, card) => + NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(nfcService); + + desfire.SelectApplication(_FabAccess_AID); + byte[] nfcService_data = desfire.ReadData(_FabAccess_FID, 0x00, _FabAccess_FSize); + string userdomain = Encoding.ASCII.GetString(nfcService_data).Replace("\u0000", ""); + + string domain = userdomain.Split('@')[1]; + if (domain != _FabAccess_Domain) { - card.Connect(); + throw new Exception("Incorrect Domain"); + } - NXP_MIFARE_DESFire desfire = new NXP_MIFARE_DESFire(card); + desfire.SelectApplication(_FabAccess_AID); + desfire.AuthenticateISO_AES(0x01, _FabAccess_Application_AuthKey._Key); - desfire.SelectApplication(_FabAccess_AID); - byte[] card_data = desfire.ReadData(_FabAccess_FID, 0x00, _FabAccess_FSize); - string userdomain = Encoding.ASCII.GetString(card_data).Replace("\u0000", ""); - - string domain = userdomain.Split('@')[1]; - if(domain != _FabAccess_Domain) - { - throw new Exception("Incorrect Domain"); - } - - desfire.SelectApplication(_FabAccess_AID); - desfire.AuthenticateISO_AES(0x01, _FabAccess_Application_AuthKey._Key); - - transmit_successfully = true; - - card.Disconnect(); - }; - - reader.CardDiscovered += handler; - reader.Start(); - - Assert.AreEqual(true, transmit_successfully); - - reader.Stop(); - reader.CardDiscovered -= handler; + nfcService.Disconnect(); } } } diff --git a/NFC_Test/REAL/REAL_Reader_PCSC.cs b/NFC_Test/REAL/REAL_Reader_PCSC.cs index 6cd6cef..4bb3ae9 100644 --- a/NFC_Test/REAL/REAL_Reader_PCSC.cs +++ b/NFC_Test/REAL/REAL_Reader_PCSC.cs @@ -1,7 +1,8 @@ using NFC.Interfaces; -using NFC_PCSC; +using NFC.PCSC; using NUnit.Framework; using System; +using System.Collections.Generic; namespace NFC_Test.REAL { @@ -14,12 +15,12 @@ namespace NFC_Test.REAL [Test] public void GetReaders() { - IHardware hardware = new Hardware_PCSC(); - string[] readers = hardware.GetReaders(); + INFCService nfcService = new NFCService(); + IList readers = nfcService.GetReaderIDs(); - Console.WriteLine("PCSC Readers detected: {0}", readers.Length); + Console.WriteLine("PCSC Readers detected: {0}", readers.Count); - if (readers.Length > 0) + if (readers.Count > 0) { Console.WriteLine("List of ReaderIDs:"); foreach (string readerID in readers) @@ -33,30 +34,15 @@ namespace NFC_Test.REAL /// Connect to specific PCSC Reader by ReaderID /// /// ReaderID from GetReaders - [TestCase("ACS ACR122U PICC Interface 0")] + //[TestCase("ACS ACR122U PICC Interface 0")] + [TestCase("ACS ACR122 0")] public void Connect(string readerID) { - IHardware hardware = new Hardware_PCSC(); - IReader reader = hardware.OpenReader(readerID); + INFCService nfcService = new NFCService(); - bool connected_successfully = false; + nfcService.Connect(readerID); - 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; + nfcService.Disconnect(); } } }