private void DoEntryPointB(DesFireTransactionTypeEnum desFireTransactionType) { Task.Run(() => { try { ProtocolActivation_B().ContinueWith((parentTask) => { try { if (cancellationTokenForPreProcessing.Token.IsCancellationRequested) { cancellationTokenForPreProcessing.Dispose(); return; } DesfireAccessHandler desfireAccess; byte[] sessionKey = new byte[0]; switch (desFireTransactionType) { case DesFireTransactionTypeEnum.ProcessTransaction: desfireAccess = new DesfireAccessHandler(cardQProcessor); CardDetails desfire = desfireAccess.ReadCardDetails(); Logger.Log("DesFire Card Details: " + Environment.NewLine + desfire.ToString()); //desfireAccess.SelectApplication(new byte[] { 0x00, 0x00, 0x01 }); //select installed application //sessionKey = desfireAccess.AuthenticateAES(); //Logger.Log("Session Key: " + Formatting.ByteArrayToHexString(sessionKey)); //byte[] dataWrittenAndReadBack = desfireAccess.WriteData(sessionKey, 0x01, 0x08); //Logger.Log("Data Written: " + Formatting.ByteArrayToHexString(dataWrittenAndReadBack)); OnProcessCompleted(new DesfireTerminalProcessingOutcome() { CardDetails = desfire, NextProcessState = EMVTerminalPreProcessingStateEnum.EndProcess, UIRequestOnOutcomePresent = true, UserInterfaceRequest = new UserInterfaceRequest() { MessageIdentifier = MessageIdentifiersEnum.ClearDisplay, Status = StatusEnum.ReadyToRead } }); break; case DesFireTransactionTypeEnum.InstallApp: desfireAccess = new DesfireAccessHandler(cardQProcessor); //auth to PICC application and get session key //PICC master key setting default does not require authentication to be done before creating an application //we will eventually change this desfireAccess.SelectApplication(new byte[] { 0x00, 0x00, 0x00 }); //select pic application //sessionKey = desfireAccess.AuthenticateAES(); //Logger.Log("Session Key: " + Formatting.ByteArrayToHexString(sessionKey)); desfireAccess.GetKeyVersion(0x00); desfireAccess.GetKeySettings(); desfireAccess.GetApplicationIDs(); desfireAccess.GetFileIDs(); desfireAccess.CreateApplication(new byte[] { 0x00, 0x00, 0x01 }); desfireAccess.SelectApplication(new byte[] { 0x00, 0x00, 0x01 }); //select installed application desfireAccess.CreateFile(0x01); OnProcessCompleted(new TerminalProcessingOutcome() { NextProcessState = EMVTerminalPreProcessingStateEnum.EndProcess, UIRequestOnOutcomePresent = true, UserInterfaceRequest = new UserInterfaceRequest() { MessageIdentifier = MessageIdentifiersEnum.ClearDisplay, Status = StatusEnum.ReadyToRead } }); break; default: throw new DesFireException("Unrecognised desfire transaction type: " + desFireTransactionType); } } catch (Exception ex) { OnExceptionOccured(ex); } }, TaskContinuationOptions.OnlyOnRanToCompletion); } catch (Exception ex) { OnExceptionOccured(ex); } }); }
public void StartTransactionRequest(DesFireTransactionTypeEnum desFireTransactionType) { cancellationTokenForPreProcessing = new CancellationTokenSource(); DoEntryPointB(desFireTransactionType); }