public static ACTypeEnum TerminalActionAnalysis(KernelDatabaseBase database) { TERMINAL_VERIFICATION_RESULTS_95_KRN tvr = new TERMINAL_VERIFICATION_RESULTS_95_KRN(database); ulong tvrAsNumber = Formatting.ConvertToInt64(tvr.Value.Value); ulong tacAsNumber = Formatting.ConvertToInt64(database.Get(EMVTagsEnum.TERMINAL_ACTION_CODE_DENIAL_DF8121_KRN2).Value); #region taa.1 if (database.IsNotEmpty(EMVTagsEnum.ISSUER_ACTION_CODE_DENIAL_9F0E_KRN.Tag)) #endregion { #region taa.4 ulong iacAsNumber = Formatting.ConvertToInt64(database.Get(EMVTagsEnum.ISSUER_ACTION_CODE_DENIAL_9F0E_KRN).Value); if (!( ((tacAsNumber | iacAsNumber) & tvrAsNumber) == 0) ) #endregion { #region taa.5 Logger.Log("Declining: !(((tacAsNumber | iacAsNumber) & tvrAsNumber) == 0)):" + ((tacAsNumber | iacAsNumber) & tvrAsNumber)); Logger.Log("tacAsNumber: " + tacAsNumber); Logger.Log("iacAsNumber: " + iacAsNumber); int depth = 0; Logger.Log(tvr.ToPrintString(ref depth)); return(ACTypeEnum.AAC); #endregion } } else { #region taa.2 if (!((tacAsNumber & tvrAsNumber) == 0)) #endregion { #region taa.3 Logger.Log("Declining: !((tacAsNumber & tvrAsNumber) == 0)"); Logger.Log("tacAsNumber: " + tacAsNumber); int depth = 0; Logger.Log(tvr.ToPrintString(ref depth)); return(ACTypeEnum.AAC); #endregion } } #region taa.4.1 TERMINAL_TYPE_9F35_KRN tt = new TERMINAL_TYPE_9F35_KRN(database); if (tt.Value.TerminalType.Code == 0x11 || tt.Value.TerminalType.Code == 0x21 || tt.Value.TerminalType.Code == 0x14 || tt.Value.TerminalType.Code == 0x24 || tt.Value.TerminalType.Code == 0x34) #endregion { #region taa.4.2 return(ACTypeEnum.ARQC); #endregion } #region taa.6 if (tt.Value.TerminalType.Code == 0x23 || tt.Value.TerminalType.Code == 0x26 || tt.Value.TerminalType.Code == 0x36 || tt.Value.TerminalType.Code == 0x13 || tt.Value.TerminalType.Code == 0x16) #endregion { #region taa.13 if (database.IsNotEmpty(EMVTagsEnum.ISSUER_ACTION_CODE_DEFAULT_9F0D_KRN.Tag)) #endregion { ulong iacDefaultNumber = Formatting.ConvertToInt64(database.Get(EMVTagsEnum.ISSUER_ACTION_CODE_DEFAULT_9F0D_KRN).Value); ulong taDefaultAsNumber = Formatting.ConvertToInt64(database.Get(EMVTagsEnum.TERMINAL_ACTION_CODE_DEFAULT_DF8120_KRN2).Value); #region taa.16 if (((iacDefaultNumber | taDefaultAsNumber) & tvrAsNumber) == 0) #endregion { #region taa.18 return(ACTypeEnum.TC); #endregion } else { #region taa.17 Logger.Log("Declining: ((iacDefaultNumber | taDefaultAsNumber) & tvrAsNumber) == 0"); Logger.Log("iacDefaultNumber: " + iacDefaultNumber); Logger.Log("taDefaultAsNumber: " + taDefaultAsNumber); int depth = 0; Logger.Log(tvr.ToPrintString(ref depth)); return(ACTypeEnum.AAC); #endregion } } else { #region taa.14 if (tvrAsNumber == 0) #endregion { #region taa.15 return(ACTypeEnum.TC); #endregion } else { #region taa.17 Logger.Log("Declining: tvrAsNumber == 0"); int depth = 0; Logger.Log(tvr.ToPrintString(ref depth)); return(ACTypeEnum.AAC); #endregion } } } else { #region taa.7 if (database.IsNotEmpty(EMVTagsEnum.ISSUER_ACTION_CODE_ONLINE_9F0F_KRN.Tag)) #endregion { ulong iacOnlineNumber = Formatting.ConvertToInt64(database.Get(EMVTagsEnum.ISSUER_ACTION_CODE_ONLINE_9F0F_KRN).Value); ulong tacOnlineAsNumber = Formatting.ConvertToInt64(database.Get(EMVTagsEnum.TERMINAL_ACTION_CODE_ONLINE_DF8122_KRN2).Value); #region taa.10 if (((tacOnlineAsNumber | iacOnlineNumber) & tvrAsNumber) == 0) #endregion { #region taa.12 return(ACTypeEnum.TC); #endregion } else { #region taa.11 return(ACTypeEnum.ARQC); #endregion } } else { #region taa.8 if (tvrAsNumber == 0) #endregion { #region taa.9 return(ACTypeEnum.TC); #endregion } else { #region taa.11 return(ACTypeEnum.ARQC); #endregion } } } }
public static void ProcessingRestrictions(KernelDatabaseBase database) { TERMINAL_VERIFICATION_RESULTS_95_KRN tvr = new TERMINAL_VERIFICATION_RESULTS_95_KRN(database); if (database.IsNotEmpty(EMVTagsEnum.APPLICATION_VERSION_NUMBER_CARD_9F08_KRN.Tag)) { #region pre.2 string pvnCard = Formatting.ByteArrayToHexString(database.Get(EMVTagsEnum.APPLICATION_VERSION_NUMBER_CARD_9F08_KRN).Value); string pvnTerm = Formatting.ByteArrayToHexString(database.Get(EMVTagsEnum.APPLICATION_VERSION_NUMBER_TERMINAL_9F09_KRN).Value); if (pvnCard != pvnTerm) #endregion { #region pre.3 tvr.Value.ICCAndTerminalHaveDifferentApplicationVersions = true; tvr.UpdateDB(); #endregion } } DateTime transactionDate = EMVTagsEnum.TRANSACTION_DATE_9A_KRN.FormatAsDateTime(database.Get(EMVTagsEnum.TRANSACTION_DATE_9A_KRN).Value); DateTime appExpiryDate = EMVTagsEnum.APPLICATION_EXPIRATION_DATE_5F24_KRN.FormatAsDateTime(database.Get(EMVTagsEnum.APPLICATION_EXPIRATION_DATE_5F24_KRN).Value); #region pre.4 if (database.IsNotEmpty(EMVTagsEnum.APPLICATION_EFFECTIVE_DATE_5F25_KRN.Tag)) #endregion { DateTime appEffectiveDate = EMVTagsEnum.APPLICATION_EFFECTIVE_DATE_5F25_KRN.FormatAsDateTime(database.Get(EMVTagsEnum.APPLICATION_EFFECTIVE_DATE_5F25_KRN).Value); #region pre.5 if (transactionDate < appEffectiveDate) #endregion { #region pre.6 tvr.Value.ApplicationNotYetEffective = true; tvr.UpdateDB(); #endregion } } #region pre.7 if (transactionDate > appExpiryDate) #endregion { #region pre.8 tvr.Value.ExpiredApplication = true; tvr.UpdateDB(); #endregion } #region pre.9 if (database.IsEmpty(EMVTagsEnum.APPLICATION_USAGE_CONTROL_9F07_KRN.Tag)) { return; } #endregion #region pre.10 TERMINAL_TYPE_9F35_KRN tt = new TERMINAL_TYPE_9F35_KRN(database); ADDITIONAL_TERMINAL_CAPABILITIES_9F40_KRN atc = new ADDITIONAL_TERMINAL_CAPABILITIES_9F40_KRN(database); APPLICATION_USAGE_CONTROL_9F07_KRN auc = new APPLICATION_USAGE_CONTROL_9F07_KRN(database); if ((tt.Value.TerminalType.Code == 0x14 || tt.Value.TerminalType.Code == 0x15 || tt.Value.TerminalType.Code == 0x16) && atc.Value.IsCash) #endregion { #region pre.12 if (!auc.Value.IsValidAtATMs) #endregion { #region pre.13 tvr.Value.RequestedServiceNotAllowedForCardProduct = true; tvr.UpdateDB(); return; #endregion } } else { #region pre.11 if (!auc.Value.IsValidAtTerminalsOtherThanATMs) #endregion { #region pre.13 tvr.Value.RequestedServiceNotAllowedForCardProduct = true; tvr.UpdateDB(); return; #endregion } } #region pre.14 if (database.IsEmpty(EMVTagsEnum.ISSUER_COUNTRY_CODE_5F28_KRN.Tag)) { tvr.UpdateDB(); return; } #endregion string tcc = Formatting.ByteArrayToHexString(database.Get(EMVTagsEnum.TERMINAL_COUNTRY_CODE_9F1A_KRN).Value); string icc = Formatting.ByteArrayToHexString(database.Get(EMVTagsEnum.ISSUER_COUNTRY_CODE_5F28_KRN).Value); byte transactionType = database.Get(EMVTagsEnum.TRANSACTION_TYPE_9C_KRN).Value[0]; #region pre.15 if (transactionType == (byte)TransactionTypeEnum.CashWithdrawal || transactionType == (byte)TransactionTypeEnum.CashDisbursement) #endregion { #region pre.16 if (tcc == icc) #endregion { #region pre.17 if (!auc.Value.IsValidForDomesticCashTransactions) #endregion { #region pre.19 tvr.Value.RequestedServiceNotAllowedForCardProduct = true; #endregion } } else { #region pre.18 if (!auc.Value.IsValidForInternationalCashTransactions) #endregion { #region pre.19 tvr.Value.RequestedServiceNotAllowedForCardProduct = true; #endregion } } } #region pre.20 if (transactionType == (byte)TransactionTypeEnum.PurchaseGoodsAndServices || transactionType == (byte)TransactionTypeEnum.PurchaseWithCashback) #endregion { #region pre.21 if (tcc == icc) #endregion { #region pre.22 if (!(auc.Value.IsValidForDomesticGoods || auc.Value.IsValidForDomesticServices)) #endregion { #region pre.24 tvr.Value.RequestedServiceNotAllowedForCardProduct = true; #endregion } } else { #region pre.23 if (!(auc.Value.IsValidForInternationalGoods || auc.Value.IsValidForInternationalServices)) #endregion { #region pre.24 tvr.Value.RequestedServiceNotAllowedForCardProduct = true; #endregion } } } #region pre.25 if (database.IsNotPresent(EMVTagsEnum.AMOUNT_OTHER_NUMERIC_9F03_KRN.Tag)) { tvr.UpdateDB(); return; } if (Formatting.BcdToLong(database.Get(EMVTagsEnum.AMOUNT_OTHER_NUMERIC_9F03_KRN).Value) == 0) { tvr.UpdateDB(); return; } #endregion #region pre.26 if (tcc == icc) #endregion { #region pre.27 if (auc.Value.IsDomesticCashbackAllowed) { tvr.UpdateDB(); return; } #endregion } else { #region pre.28 if (auc.Value.IsInternationalCashbackAllowed) { tvr.UpdateDB(); return; } #endregion } #region pre.29 tvr.Value.RequestedServiceNotAllowedForCardProduct = true; tvr.UpdateDB(); #endregion }
private static SignalsEnum DoProcessingRestrictions(Kernel3Database database, KernelQ qManager, CardExceptionManager cardExceptionManager) { #region 5.5.1.1 DateTime transactionDate = EMVTagsEnum.TRANSACTION_DATE_9A_KRN.FormatAsDateTime(database.Get(EMVTagsEnum.TRANSACTION_DATE_9A_KRN).Value); DateTime appExpiryDate = DateTime.Now; TLV appExiryDateTLV = database.Get(EMVTagsEnum.APPLICATION_EXPIRATION_DATE_5F24_KRN); if (appExiryDateTLV != null) { appExpiryDate = EMVTagsEnum.APPLICATION_EXPIRATION_DATE_5F24_KRN.FormatAsDateTime(appExiryDateTLV.Value); } if (appExiryDateTLV == null || (transactionDate > appExpiryDate)) { CARD_TRANSACTION_QUALIFIERS_CTQ_9F6C_KRN3 ctq = new CARD_TRANSACTION_QUALIFIERS_CTQ_9F6C_KRN3(database); if (ctq.Value.GoOnlineIfApplicationExpired) { database.OnlineRequiredByReaderIndicator = true; } else { database.DeclineRequiredByReaderIndicator = true; return(SignalsEnum.NONE); } } #endregion #region 5.5.1.2 string pan = Formatting.ByteArrayToHexString(database.Get(EMVTagsEnum.APPLICATION_PRIMARY_ACCOUNT_NUMBER_PAN_5A_KRN).Value); if (database.Kernel3Configuration.ExceptionFileEnabled && cardExceptionManager.CheckForCardException(pan)) { database.DeclineRequiredByReaderIndicator = true; return(SignalsEnum.NONE); } #endregion TransactionTypeEnum tt = (TransactionTypeEnum)Formatting.GetEnum(typeof(TransactionTypeEnum), database.Get(EMVTagsEnum.TRANSACTION_TYPE_9C_KRN).Value[0]); #region 5.5.1.3 if (tt == TransactionTypeEnum.CashWithdrawal || tt == TransactionTypeEnum.CashDisbursement && database.Kernel3Configuration.AUCManualCheckSupported) { TLV icc = database.Get(EMVTagsEnum.ISSUER_COUNTRY_CODE_5F28_KRN); if (icc == null) { database.DeclineRequiredByReaderIndicator = true; return(SignalsEnum.NONE); } TLV tcc = database.Get(EMVTagsEnum.TERMINAL_COUNTRY_CODE_9F1A_KRN); APPLICATION_USAGE_CONTROL_9F07_KRN auc = new APPLICATION_USAGE_CONTROL_9F07_KRN(database); if (!((Formatting.ByteArrayToHexString(icc.Value) == Formatting.ByteArrayToHexString(tcc.Value) && auc.Value.IsValidForDomesticCashTransactions) || (Formatting.ByteArrayToHexString(icc.Value) != Formatting.ByteArrayToHexString(tcc.Value) && auc.Value.IsValidForInternationalCashTransactions))) { CARD_TRANSACTION_QUALIFIERS_CTQ_9F6C_KRN3 ctq = new CARD_TRANSACTION_QUALIFIERS_CTQ_9F6C_KRN3(database); if (database.IsEmpty(EMVTagsEnum.CARD_TRANSACTION_QUALIFIERS_CTQ_9F6C_KRN3.Tag) || ctq.Value.SwitchInterfaceForCashTransactions) { return(CommonRoutines.PostOutcome(database, qManager, KernelMessageidentifierEnum.N_A, KernelStatusEnum.PROCESSING_ERROR, null, Kernel2OutcomeStatusEnum.TRY_ANOTHER_INTERFACE, Kernel2StartEnum.N_A, true, KernelMessageidentifierEnum.N_A, L1Enum.NOT_SET, null, L2Enum.STATUS_BYTES, L3Enum.NOT_SET)); } else { database.DeclineRequiredByReaderIndicator = true; return(SignalsEnum.NONE); } } } #endregion #region 5.5.1.4 if (tt == TransactionTypeEnum.PurchaseWithCashback && database.Kernel3Configuration.AUCCashbackCheckSupported) { TLV icc = database.Get(EMVTagsEnum.ISSUER_COUNTRY_CODE_5F28_KRN); if (icc == null) { database.DeclineRequiredByReaderIndicator = true; return(SignalsEnum.NONE); } TLV tcc = database.Get(EMVTagsEnum.TERMINAL_COUNTRY_CODE_9F1A_KRN); APPLICATION_USAGE_CONTROL_9F07_KRN auc = new APPLICATION_USAGE_CONTROL_9F07_KRN(database); if (!((Formatting.ByteArrayToHexString(icc.Value) == Formatting.ByteArrayToHexString(tcc.Value) && auc.Value.IsValidForDomesticCashTransactions) || (Formatting.ByteArrayToHexString(icc.Value) != Formatting.ByteArrayToHexString(tcc.Value) && auc.Value.IsValidForInternationalCashTransactions))) { CARD_TRANSACTION_QUALIFIERS_CTQ_9F6C_KRN3 ctq = new CARD_TRANSACTION_QUALIFIERS_CTQ_9F6C_KRN3(database); if (database.IsEmpty(EMVTagsEnum.CARD_TRANSACTION_QUALIFIERS_CTQ_9F6C_KRN3.Tag) || ctq.Value.SwitchInterfaceForCashBackTransactions) { return(CommonRoutines.PostOutcome(database, qManager, KernelMessageidentifierEnum.N_A, KernelStatusEnum.PROCESSING_ERROR, null, Kernel2OutcomeStatusEnum.TRY_ANOTHER_INTERFACE, Kernel2StartEnum.N_A, true, KernelMessageidentifierEnum.N_A, L1Enum.NOT_SET, null, L2Enum.STATUS_BYTES, L3Enum.NOT_SET)); } else { database.DeclineRequiredByReaderIndicator = true; return(SignalsEnum.NONE); } } } #endregion #region 5.5.1.5 if (database.Kernel3Configuration.ATMOfflineCheck) { TERMINAL_TYPE_9F35_KRN termType = new TERMINAL_TYPE_9F35_KRN(database); if (termType.Value.TerminalType.Code == 0x14 || termType.Value.TerminalType.Code == 0x15 || termType.Value.TerminalType.Code == 0x16) { if (database.IsEmpty(EMVTagsEnum.CARD_TRANSACTION_QUALIFIERS_CTQ_9F6C_KRN3.Tag)) { database.DeclineRequiredByReaderIndicator = true; return(SignalsEnum.NONE); } else { CARD_TRANSACTION_QUALIFIERS_CTQ_9F6C_KRN3 ctq = new CARD_TRANSACTION_QUALIFIERS_CTQ_9F6C_KRN3(database); if (!ctq.Value.ValidForContactlessATMTransactions) { database.OnlineRequiredByReaderIndicator = true; } else { APPLICATION_USAGE_CONTROL_9F07_KRN auc = new APPLICATION_USAGE_CONTROL_9F07_KRN(database); if (auc == null) { database.OnlineRequiredByReaderIndicator = true; } else if (!auc.Value.IsValidAtATMs) { database.DeclineRequiredByReaderIndicator = true; return(SignalsEnum.NONE); } else { return(CommonRoutines.PostOutcome(database, qManager, KernelMessageidentifierEnum.N_A, KernelStatusEnum.PROCESSING_ERROR, null, Kernel2OutcomeStatusEnum.TRY_ANOTHER_INTERFACE, Kernel2StartEnum.N_A, true, KernelMessageidentifierEnum.N_A, L1Enum.NOT_SET, null, L2Enum.STATUS_BYTES, L3Enum.NOT_SET)); } } } } } #endregion return(SignalsEnum.NONE); }