CombinationSelection_FromB(CardQProcessor cardInterfaceManager,
                            Tuple <EMVTerminalProcessingOutcome, EMVSelectApplicationResponse, TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> lastCandidateSelected,
                            List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > candidates,
                            IUICallbackProvider uiProvider)
 {
     return(CombinationSelection_FromA(cardInterfaceManager, uiProvider));
 }
Exemplo n.º 2
0
        public EMVTxCtl()
        {
            InitializeComponent();
            QRMetaDataSourceSingleton.Instance.DataSource  = new EMVQRMetaDataSource();
            TLVMetaDataSourceSingleton.Instance.DataSource = new EMVTLVMetaDataSource();

            uiProvider = new UICallbackProvider(ContactApp_DisplayAppsOnCard);

            totalAmount              = new TotalAmountViewModel();
            totalAmount.Total        = "";
            txtAmount.BindingContext = totalAmount;
            lblTotal.BindingContext  = totalAmount;

            totalAmount.Total = "1000";

            //if(!String.IsNullOrEmpty(totalAmount.Total))
            //{
            //    CmdNextToPaymentApp_Clicked(null,null);
            //}
            //else
            //{
            lblStatusAskAmount.Text = "Enter the amount below";
            //}
        }
Exemplo n.º 3
0
 public EMVContactTerminalApplication(CardQProcessor cardQProcessor, IConfigurationProvider configProvider, IUICallbackProvider uiProvider)
     : base(cardQProcessor, configProvider)
 {
     this.uiProvider = uiProvider;
 }
        CombinationSelection_FromA(CardQProcessor cardInterfaceManager, IUICallbackProvider uiProvider)
        {
            List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > candidates = new List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> >();

            #region 12.3.2 Book1 12.2.2 and 12.3.2 Step 1
            EMVSelectPPSEResponse responsePPSE = SelectPSEApplication(cardInterfaceManager);

            //card blocked
            if (responsePPSE.SW1 == 0x6A && responsePPSE.SW2 == 0x81)
            {
                return(Tuple.Create(
                           new EMVTerminalProcessingOutcome()
                {
                    NextProcessState = EMVTerminalPreProcessingStateEnum.EndProcess,
                    UIRequestOnOutcomePresent = true,
                    UserInterfaceRequest = new UserInterfaceRequest()
                    {
                        MessageIdentifier = MessageIdentifiersEnum.InsertSwipeOrTryAnotherCard, Status = StatusEnum.ReadyToRead
                    },
                    UIRequestOnRestartPresent = false,
                }, (EMVSelectApplicationResponse)null, (TerminalSupportedKernelAidTransactionTypeCombination)null, (CardKernelAidCombination)null,
                           (List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> >)null));
            }
            #endregion

            //cards supports selection by PSE
            if (responsePPSE.Succeeded && responsePPSE.GetSFI_88() != null)
            {
                #region 12.3.2 12.3.2 Book1 Step 2
                TLVList records = ReadAllPSERecords(responsePPSE.GetSFI_88(), cardInterfaceManager);
                #endregion

                //do matching
                #region 12.3.2 Book1 12.3.2 Step 3
                candidates = CreateCandidateListFromPSERecords(records);
                #endregion

                #region 12.3.2 Book1 Step 4 and 5
                if (candidates.Count != 0)
                {
                    return(ProcessCandidates(cardInterfaceManager, candidates, uiProvider));
                }
                #endregion
            }
            candidates = CreateCandidateListByDirMethod(cardInterfaceManager);
            if (candidates.Count == 0)
            {
                return(Tuple.Create(
                           new EMVTerminalProcessingOutcome()
                {
                    NextProcessState = EMVTerminalPreProcessingStateEnum.EndProcess,
                    UIRequestOnOutcomePresent = true,
                    UserInterfaceRequest = new UserInterfaceRequest()
                    {
                        MessageIdentifier = MessageIdentifiersEnum.TryAnotherCard, Status = StatusEnum.ReadyToRead
                    },
                    UIRequestOnRestartPresent = false,
                }, (EMVSelectApplicationResponse)null, (TerminalSupportedKernelAidTransactionTypeCombination)null, (CardKernelAidCombination)null,
                           (List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> >)null));
            }
            return(ProcessCandidates(cardInterfaceManager, candidates, uiProvider));
        }
        CandidatesPrioritizeAndPromptUser(List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > candidateList, IUICallbackProvider uiProvider)
        {
            if (candidateList.Count == 1)
            {
                #region 12.3.2 Book1 12.4 Step 2
                if ((candidateList.ElementAt(0).Item2.ApplicationPriorityIndicatorTag.Value[0] & 0x80) == 0x00)
                {
                    return(Optional <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > .Create(new Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination>(candidateList.ElementAt(0).Item1, candidateList.ElementAt(0).Item2)));
                }
                #endregion
            }

            #region 12.3.2 Book1 12.4 Step 4
            List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > filteredNoZero = candidateList.Where(x =>
            {
                if (x.Item2.ApplicationPriorityIndicatorTag != null)
                {
                    if ((x.Item2.ApplicationPriorityIndicatorTag.Value[0] & 0x0F) != 0x00) //0 = no priority
                    {
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }
            }).OrderBy(y => y.Item2.ApplicationPriorityIndicatorTag.Value[0] & 0x0F).ToList();

            List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > filteredZero = candidateList.Where(x =>
            {
                if (x.Item2.ApplicationPriorityIndicatorTag == null)
                {
                    return(true);
                }
                else
                if ((x.Item2.ApplicationPriorityIndicatorTag.Value[0] & 0x0F) == 0x00)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }).ToList();

            List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > result = new List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> >();
            result.AddRange(filteredNoZero);
            result.AddRange(filteredZero);
            #endregion

            #region 12.3.2 Book1 12.4 Step 3
            return(AskCardHolderToSelect(result, uiProvider));

            #endregion
        }
        private static Optional <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > AskCardHolderToSelect(List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > candidateList, IUICallbackProvider uiProvider)
        {
            List <String> candidatesStrings = candidateList.Select(x => Formatting.ByteArrayToASCIIString(x.Item2.ApplicationLabel.Value) + ":" + Formatting.ByteArrayToHexString(x.Item2.AdfNameTag.Value)).ToList();
            String        selected          = uiProvider.DisplayApplicationList(candidatesStrings);

            if (!string.IsNullOrEmpty(selected))
            {
                Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> selectedTuple =
                    candidateList.Where(x => Formatting.ByteArrayToHexString(x.Item2.AdfNameTag.Value) == selected).First();
                return(Optional <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > .Create(selectedTuple));
            }
            else
            {
                return(Optional <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > .CreateEmpty());
            }
        }
        ProcessCandidates(CardQProcessor cardInterfaceManager,
                          List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> >
                          candidates, IUICallbackProvider uiProvider)
        {
            if (candidates.Count == 0)
            {
                return(Tuple.Create(
                           new EMVTerminalProcessingOutcome()
                {
                    NextProcessState = EMVTerminalPreProcessingStateEnum.EndProcess,
                    UIRequestOnOutcomePresent = true,
                    UserInterfaceRequest = new UserInterfaceRequest()
                    {
                        MessageIdentifier = MessageIdentifiersEnum.InsertSwipeOrTryAnotherCard, Status = StatusEnum.ReadyToRead
                    },
                    UIRequestOnRestartPresent = false,
                }, (EMVSelectApplicationResponse)null, (TerminalSupportedKernelAidTransactionTypeCombination)null, (CardKernelAidCombination)null,
                           (List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> >)null));
            }

BackToStep3:
            //prioritize if more than 1 candidate
            Optional <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > candidate = CandidatesPrioritizeAndPromptUser(candidates, uiProvider);

            if (!candidate.IsPresent())
            {
                return(Tuple.Create(
                           new EMVTerminalProcessingOutcome()
                {
                    NextProcessState = EMVTerminalPreProcessingStateEnum.EndProcess,
                    UIRequestOnOutcomePresent = true,
                    UserInterfaceRequest = new UserInterfaceRequest()
                    {
                        MessageIdentifier = MessageIdentifiersEnum.InsertSwipeOrTryAnotherCard, Status = StatusEnum.ReadyToRead
                    },
                    UIRequestOnRestartPresent = false,
                }, (EMVSelectApplicationResponse)null, (TerminalSupportedKernelAidTransactionTypeCombination)null, (CardKernelAidCombination)null,
                           (List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> >)null));
            }

            //select the application
            Tuple <EMVTerminalProcessingOutcome,
                   EMVSelectApplicationResponse,
                   TerminalSupportedKernelAidTransactionTypeCombination> result = SelectAppChosen(cardInterfaceManager, candidate.Get().Item1, candidate.Get().Item2);

            if (result.Item1.NextProcessState == EMVTerminalPreProcessingStateEnum.CombinationSelection_StartC)
            {
                candidates.Remove(candidate.Get());
                if (candidates.Count == 0)
                {
                    return(Tuple.Create(
                               new EMVTerminalProcessingOutcome()
                    {
                        NextProcessState = EMVTerminalPreProcessingStateEnum.EndProcess,
                        UIRequestOnOutcomePresent = true,
                        UserInterfaceRequest = new UserInterfaceRequest()
                        {
                            MessageIdentifier = MessageIdentifiersEnum.InsertSwipeOrTryAnotherCard, Status = StatusEnum.ReadyToRead
                        },
                        UIRequestOnRestartPresent = false,
                    }, (EMVSelectApplicationResponse)null, (TerminalSupportedKernelAidTransactionTypeCombination)null, (CardKernelAidCombination)null,
                               (List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> >)null));
                }
                else
                {
                    goto BackToStep3;
                }
            }

            return(Tuple.Create(result.Item1, result.Item2, result.Item3, candidate.Get().Item2, candidates));
        }
 CombinationSelection_FromC(CardQProcessor cardInterfaceManager, List <Tuple <TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination> > candidates, IUICallbackProvider uiProvider)
 {
     return(ProcessCandidates(cardInterfaceManager, candidates, uiProvider));
 }