private static void Do22_25(KernelDatabaseBase database, CardHolderVerificationRule cvrCurrentlySelected) { CARDHOLDER_VERIFICATION_METHOD_CVM_RESULTS_9F34_KRN cvr = new CARDHOLDER_VERIFICATION_METHOD_CVM_RESULTS_9F34_KRN(database); TERMINAL_VERIFICATION_RESULTS_95_KRN tvr = new TERMINAL_VERIFICATION_RESULTS_95_KRN(database); KernelCVMEnum cvmEnum = KernelCVMEnum.N_A; #region cvm.22 cvmEnum = KernelCVMEnum.NO_CVM; tvr.Value.CardholderVerificationWasNotSuccessful = true; CommonRoutines.UpdateOutcomeParameterSet(database, cvmEnum); tvr.UpdateDB(); #endregion #region cvm.23 if (((byte)cvrCurrentlySelected.CVMConditionCode & 0x3F) == 0x00) #endregion { #region cvm.24 cvr.Value.CVMPerformed = cvrCurrentlySelected.CVMRule; cvr.Value.CVMCondition = (byte)cvrCurrentlySelected.CVMConditionCode; cvr.Value.CVMResult = 0x01;//failed #endregion } else { #region cvm.25 cvr.Value.CVMPerformed = 0x3F; cvr.Value.CVMCondition = 0x00; cvr.Value.CVMResult = 0x01;//failed #endregion } cvr.UpdateDB(); }
private static void Do_CVM_14(KernelDatabaseBase database, CARDHOLDER_VERIFICATION_METHOD_CVM_RESULTS_9F34_KRN cvr) { KernelCVMEnum cvmEnum = KernelCVMEnum.N_A; #region cvm.14 cvmEnum = KernelCVMEnum.NO_CVM; cvr.Value.CVMPerformed = 0x3F; //No CVM performed cvr.Value.CVMCondition = 0x00; cvr.Value.CVMResult = 0x01; //failed CommonRoutines.UpdateOutcomeParameterSet(database, cvmEnum); cvr.UpdateDB(); TERMINAL_VERIFICATION_RESULTS_95_KRN tvr = new TERMINAL_VERIFICATION_RESULTS_95_KRN(database); tvr.Value.CardholderVerificationWasNotSuccessful = true; tvr.UpdateDB(); #endregion }
public static void CVMSelection(KernelDatabaseBase database, Func <bool> kernelSupportedCallback) { CARDHOLDER_VERIFICATION_METHOD_CVM_RESULTS_9F34_KRN cvmResults = new CARDHOLDER_VERIFICATION_METHOD_CVM_RESULTS_9F34_KRN(database); //#region support for Refunds pg 177 //byte transactionType = database.Get(EMVTagsEnum.TRANSACTION_TYPE_9C_KRN).Value[0]; //if (transactionType == (byte)TransactionTypeEnum.Refund) //{ // Do_CVM_14(database, cvmResults); // return; //} //#endregion APPLICATION_INTERCHANGE_PROFILE_82_KRN aip = new APPLICATION_INTERCHANGE_PROFILE_82_KRN(database); TERMINAL_VERIFICATION_RESULTS_95_KRN tvr = new TERMINAL_VERIFICATION_RESULTS_95_KRN(database); KernelCVMEnum cvmEnum = KernelCVMEnum.N_A; CardHolderVerificationRule cvrCurrentlySelected; if (aip.Value.OnDeviceCardholderVerificationIsSupported && kernelSupportedCallback.Invoke()) { #region cvm.2 long aa = Formatting.BcdToLong(database.Get(EMVTagsEnum.AMOUNT_AUTHORISED_NUMERIC_9F02_KRN).Value); long rcvml = Formatting.BcdToLong(database.Get(EMVTagsEnum.READER_CVM_REQUIRED_LIMIT_DF8126_KRN2).Value); if (aa > rcvml) #endregion { #region cvm.4 cvmEnum = KernelCVMEnum.CONFIRMATION_CODE_VERIFIED; cvmResults.Value.CVMPerformed = 0x01; //on-device cardholder verification performed cvmResults.Value.CVMCondition = 0x00; cvmResults.Value.CVMResult = 0x02; //successful CommonRoutines.UpdateOutcomeParameterSet(database, cvmEnum); cvmResults.UpdateDB(); return; #endregion } else { #region cvm.3 cvmEnum = KernelCVMEnum.NO_CVM; cvmResults.Value.CVMPerformed = 0x3F; //No CVM performed cvmResults.Value.CVMCondition = 0x00; cvmResults.Value.CVMResult = 0x02; //successful CommonRoutines.UpdateOutcomeParameterSet(database, cvmEnum); cvmResults.UpdateDB(); return; #endregion } } #region cvm.5 if (!aip.Value.CardholderVerificationIsSupported) #endregion { #region cvm.6 cvmEnum = KernelCVMEnum.NO_CVM; cvmResults.Value.CVMPerformed = 0x3F; //No CVM performed cvmResults.Value.CVMCondition = 0x00; cvmResults.Value.CVMResult = 0x00; //unknown CommonRoutines.UpdateOutcomeParameterSet(database, cvmEnum); cvmResults.UpdateDB(); return; #endregion } #region cvm.7 if (database.IsNotPresent(EMVTagsEnum.CARDHOLDER_VERIFICATION_METHOD_CVM_LIST_8E_KRN.Tag) || database.IsEmpty(EMVTagsEnum.CARDHOLDER_VERIFICATION_METHOD_CVM_LIST_8E_KRN.Tag)) #endregion { #region cvm.8 cvmEnum = KernelCVMEnum.NO_CVM; cvmResults.Value.CVMPerformed = 0x3F; //No CVM performed cvmResults.Value.CVMCondition = 0x00; cvmResults.Value.CVMResult = 0x00; //unknown CommonRoutines.UpdateOutcomeParameterSet(database, cvmEnum); cvmResults.UpdateDB(); tvr.Value.ICCDataMissing = true; tvr.UpdateDB(); return; #endregion } #region cvm.9 CARDHOLDER_VERIFICATION_METHOD_CVM_LIST_8E_KRN cvl = new CARDHOLDER_VERIFICATION_METHOD_CVM_LIST_8E_KRN(database); #endregion BackToIterate: CVMListIterationReturn result; do { cvrCurrentlySelected = cvl.Value.CardHolderVerificationRules[database.CVMCurrentlySelectedCounter]; #region cvm.10 cvm.11 result = IterateCVM(database, cvrCurrentlySelected, cvl.Value.AmountX, cvl.Value.AmountY); #endregion database.CVMCurrentlySelectedCounter++; #region cvm.12 cvm.13 } while (database.CVMCurrentlySelectedCounter < cvl.Value.CardHolderVerificationRules.Count && result != CVMListIterationReturn.ConditionsMet); #endregion if (result != CVMListIterationReturn.ConditionsMet) { Do_CVM_14(database, cvmResults); return; } #region cvm.15 if (!cvrCurrentlySelected.IsCVMRecognised()) #endregion { #region cvm.16 tvr = new TERMINAL_VERIFICATION_RESULTS_95_KRN(database); tvr.Value.UnrecognisedCVM = true; tvr.UpdateDB(); #endregion } else { #region cvm.17 if (cvrCurrentlySelected.IsSupported(database) && cvrCurrentlySelected.GetCVMCode() != (byte)CVMCode.FailCVMProcessing) #endregion { #region cvm.18 and from EMV Book 3 Section 10.5 switch ((byte)(cvrCurrentlySelected.CVMRule & 0x3F)) { //Pin processing (U,X,Z) continues in PinProcessing Procedure after CVM Selection case (byte)CVMCode.EncipheredPINVerifiedOnline: cvmEnum = KernelCVMEnum.ONLINE_PIN; cvmResults.Value.CVMResult = 0x00; //unknown tvr.Value.OnlinePINEntered = true; break; case (byte)CVMCode.EncipheredPINVerificationPerformedByICC: case (byte)CVMCode.PlaintextPINVerificationPerformedByICC: cvmEnum = KernelCVMEnum.OFFLINE_PIN; cvmResults.Value.CVMResult = 0x00; //unknown break; case (byte)CVMCode.EncipheredPINVerificationPerformedByICCAndSignature_Paper: case (byte)CVMCode.PlaintextPINVerificationPerformedByICCAndSignature_Paper: cvmEnum = KernelCVMEnum.COMBO; cvmResults.Value.CVMResult = 0x00; //unknown break; //V in diagram case (byte)CVMCode.Signature_Paper: cvmEnum = KernelCVMEnum.OBTAIN_SIGNATURE; cvmResults.Value.CVMResult = 0x00; //unknown CommonRoutines.UpdateOutcomeParameterSet(database, true); break; //W in diagram case (byte)CVMCode.NoCVMRequired: cvmEnum = KernelCVMEnum.NO_CVM; cvmResults.Value.CVMResult = 0x02; //successful break; case (byte)CVMCode.RFU: cvmEnum = KernelCVMEnum.N_A; tvr.Value.UnrecognisedCVM = true; cvmResults.Value.CVMResult = 0x01; //failed break; default: goto BackToIterate; } #endregion cvmResults.Value.CVMPerformed = cvrCurrentlySelected.CVMRule; cvmResults.Value.CVMCondition = (byte)cvrCurrentlySelected.CVMConditionCode; cvmResults.UpdateDB(); int depth = 0; Logger.Log(cvmResults.ToPrintString(ref depth)); CommonRoutines.UpdateOutcomeParameterSet(database, cvmEnum); tvr.UpdateDB(); return; } } #region cvm.19 if (((byte)cvrCurrentlySelected.CVMConditionCode & 0x40) == (byte)CVMFailureCondition.ApplySucceedingCVRuleIfThisCVMIsUnsuccessful) #endregion { #region cvm.20 if (database.CVMCurrentlySelectedCounter < cvl.Value.CardHolderVerificationRules.Count) #endregion { #region cvm.10 goto BackToIterate; #endregion } else { Do22_25(database, cvrCurrentlySelected); return; } } else { Do22_25(database, cvrCurrentlySelected); return; } }
public static void CreateEMVDataRecord(KernelDatabaseBase database) { //Table 4.7 if (database.Get(EMVTagsEnum.DATA_RECORD_FF8105_KRN2) == null) { database.AddToList(TLV.Create(EMVTagsEnum.DATA_RECORD_FF8105_KRN2.Tag)); } CARDHOLDER_VERIFICATION_METHOD_CVM_RESULTS_9F34_KRN cvr = new CARDHOLDER_VERIFICATION_METHOD_CVM_RESULTS_9F34_KRN(database); if (cvr.Value.GetCVMPerformed() == CVMCode.EncipheredPINVerifiedOnline && cvr.Value.GetCVMResult() != CVMResult.Failed) { AddDREntry(EMVTagsEnum.TRANSACTION_PERSONAL_IDENTIFICATION_NUMBER_PIN_DATA_99_KRN, database); } AddDREntry(EMVTagsEnum.POINTOFSERVICE_POS_ENTRY_MODE_9F39_KRN, database); AddDREntry(EMVTagsEnum.AMOUNT_AUTHORISED_NUMERIC_9F02_KRN, database); AddDREntry(EMVTagsEnum.AMOUNT_OTHER_NUMERIC_9F03_KRN, database); AddDREntry(EMVTagsEnum.APPLICATION_CRYPTOGRAM_9F26_KRN, database); AddDREntry(EMVTagsEnum.APPLICATION_EXPIRATION_DATE_5F24_KRN, database); AddDREntry(EMVTagsEnum.APPLICATION_INTERCHANGE_PROFILE_82_KRN, database); AddDREntry(EMVTagsEnum.APPLICATION_LABEL_50_KRN, database); AddDREntry(EMVTagsEnum.APPLICATION_PRIMARY_ACCOUNT_NUMBER_PAN_5A_KRN, database); AddDREntry(EMVTagsEnum.APPLICATION_PRIMARY_ACCOUNT_NUMBER_PAN_SEQUENCE_NUMBER_5F34_KRN, database); AddDREntry(EMVTagsEnum.APPLICATION_PREFERRED_NAME_9F12_KRN, database); AddDREntry(EMVTagsEnum.APPLICATION_TRANSACTION_COUNTER_ATC_9F36_KRN, database); AddDREntry(EMVTagsEnum.APPLICATION_USAGE_CONTROL_9F07_KRN, database); AddDREntry(EMVTagsEnum.APPLICATION_VERSION_NUMBER_TERMINAL_9F09_KRN, database); AddDREntry(EMVTagsEnum.CRYPTOGRAM_INFORMATION_DATA_9F27_KRN, database); AddDREntry(EMVTagsEnum.CARDHOLDER_VERIFICATION_METHOD_CVM_RESULTS_9F34_KRN, database); AddDREntry(EMVTagsEnum.DEDICATED_FILE_DF_NAME_84_KRN, database); AddDREntry(EMVTagsEnum.INTERFACE_DEVICE_IFD_SERIAL_NUMBER_9F1E_KRN, database); AddDREntry(EMVTagsEnum.ISSUER_APPLICATION_DATA_9F10_KRN, database); AddDREntry(EMVTagsEnum.ISSUER_CODE_TABLE_INDEX_9F11_KRN, database); AddDREntry(EMVTagsEnum.TERMINAL_CAPABILITIES_9F33_KRN, database); AddDREntry(EMVTagsEnum.TERMINAL_COUNTRY_CODE_9F1A_KRN, database); AddDREntry(EMVTagsEnum.TERMINAL_TYPE_9F35_KRN, database); AddDREntry(EMVTagsEnum.TERMINAL_VERIFICATION_RESULTS_95_KRN, database); AddDREntry(EMVTagsEnum.TRACK_2_EQUIVALENT_DATA_57_KRN, database); AddDREntry(EMVTagsEnum.TRANSACTION_CURRENCY_CODE_5F2A_KRN, database); AddDREntry(EMVTagsEnum.TRANSACTION_DATE_9A_KRN, database); AddDREntry(EMVTagsEnum.TRANSACTION_TYPE_9C_KRN, database); AddDREntry(EMVTagsEnum.UNPREDICTABLE_NUMBER_9F37_KRN, database); AddDREntry(EMVTagsEnum.TRANSACTION_STATUS_INFORMATION_9B_KRN, database); #region c-3 kernel 3 req 3.2.1.3 AddDREntry(EMVTagsEnum.PAYMENT_ACCOUNT_REFERENCE_9F24_KRN, database); #endregion //Kernel 2 AddDREntry(EMVTagsEnum.TRANSACTION_CATEGORY_CODE_9F53_KRN2, database); //Kernel 3 #region c-3 kernel 3 req 3.2.1.2 AddDREntry(EMVTagsEnum.FORM_FACTOR_INDICATOR_FFI_9F6E_KRN3, database); AddDREntry(EMVTagsEnum.CUSTOMER_EXCLUSIVE_DATA_CED_9F7C_KRN3, database); #endregion #region c-3 kernel 3 req 4.1.1.1 TLV ffi = database.Get(EMVTagsEnum.FORM_FACTOR_INDICATOR_FFI_9F6E_KRN3); if (ffi != null) { ffi.Value[3] = (byte)(ffi.Value[3] & 0xF0);//indicating that the transaction was conducted using [ISO 14443] } #endregion }