Ejemplo n.º 1
0
        private static EMVGetProcessingOptionsResponse genGPOResponse(bool includeSDAD, TLVList db)
        {
            TLVList response = new TLVList();

            //from perso
            response.AddToList(PersoAndCardStateStorage.APPLICATION_INTERCHANGE_PROFILE_82_KRN);
            response.AddToList(PersoAndCardStateStorage.TRACK_2_EQUIVALENT_DATA_57_KRN);
            response.AddToList(PersoAndCardStateStorage.CARDHOLDER_NAME_5F20_KRN);
            response.AddToList(PersoAndCardStateStorage.APPLICATION_PRIMARY_ACCOUNT_NUMBER_PAN_5A_KRN);
            response.AddToList(PersoAndCardStateStorage.APPLICATION_PRIMARY_ACCOUNT_NUMBER_PAN_SEQUENCE_NUMBER_5F34_KRN);
            response.AddToList(PersoAndCardStateStorage.FORM_FACTOR_INDICATOR_FFI_9F6E_KRN3);
            response.AddToList(PersoAndCardStateStorage.CUSTOMER_EXCLUSIVE_DATA_CED_9F7C_KRN3);

            //from storage and calculated
            response.AddToList(db.Get(EMVTagsEnum.APPLICATION_TRANSACTION_COUNTER_ATC_9F36_KRN.Tag));

            //calculated
            response.AddToList(db.Get(EMVTagsEnum.ISSUER_APPLICATION_DATA_9F10_KRN.Tag));
            response.AddToList(db.Get(EMVTagsEnum.APPLICATION_CRYPTOGRAM_9F26_KRN.Tag));
            response.AddToList(db.Get(EMVTagsEnum.CRYPTOGRAM_INFORMATION_DATA_9F27_KRN.Tag));
            response.AddToList(db.Get(EMVTagsEnum.CARD_TRANSACTION_QUALIFIERS_CTQ_9F6C_KRN3.Tag));
            if (includeSDAD)
            {
                response.AddToList(db.Get(EMVTagsEnum.SIGNED_DYNAMIC_APPLICATION_DATA_9F4B_KRN.Tag));
            }

            TLV _77 = TLV.Create(EMVTagsEnum.RESPONSE_MESSAGE_TEMPLATE_FORMAT_2_77_KRN.Tag, response.Serialize());

            EMVGetProcessingOptionsResponse resp = new EMVGetProcessingOptionsResponse();

            resp.SW1          = 0x90;
            resp.SW2          = 0x00;
            resp.ResponseData = _77.Serialize();
            return(resp);
        }
        public EMVGetProcessingOptionsRequest(TLV pdolRelatedData) : base(ISO7816Protocol.Cla.ProprietaryCla8x, EMVInstructionEnum.GetProcessingOptions, null, 0x00, 0x00)
        {
            ApduResponseType = typeof(EMVGetProcessingOptionsResponse);

            TLV tlv = TLV.Create(EMVTagsEnum.COMMAND_TEMPLATE_83_KRN.Tag, pdolRelatedData.Value);

            CommandData = tlv.Serialize();
            Logger.Log(ToPrintString());
        }
Ejemplo n.º 3
0
        public override void Deserialize(byte[] response)
        {
            base.Deserialize(response);
            if (!Succeeded)
            {
                return;
            }

            tlvResponse = TLV.Create(EMVTagsEnum.READ_RECORD_RESPONSE_MESSAGE_TEMPLATE_70_KRN.Tag);
            try
            {
                tlvResponse.Deserialize(ResponseData, 0);
            }
            catch
            {
                tlvResponse  = TLV.Create(EMVTagsEnum.READ_RECORD_RESPONSE_MESSAGE_TEMPLATE_70_KRN.Tag);
                ResponseData = tlvResponse.Serialize();
            }
            Logger.Log(ToPrintString());
        }
 private static void Do434(Kernel2Database database, bool signedFlag, int sfi, CardResponse cardResponse, TLVList responseTags)
 {
     #region 4.34
     if (signedFlag && database.ODAStatus == 0x80)
     {
         #region 4.35
         if (sfi <= 10)
         {
             int length = cardResponse.ApduResponse.ResponseData.Length - 2; //without tag '70' and length
             if (2048 - database.StaticDataToBeAuthenticated.Serialize().Length >= length)
             {
                 database.StaticDataToBeAuthenticated.AddListToList(responseTags);
             }
             else
             {
                 TERMINAL_VERIFICATION_RESULTS_95_KRN tvr = new TERMINAL_VERIFICATION_RESULTS_95_KRN(database);
                 tvr.Value.CDAFailed = true;
                 tvr.UpdateDB();
             }
         }
         else
         {
             int length = cardResponse.ApduResponse.ResponseData.Length;
             if (cardResponse.ApduResponse.ResponseData[0] == 0x70 && 2048 - database.StaticDataToBeAuthenticated.Serialize().Length >= length)
             {
                 TLV template = TLV.Create(EMVTagsEnum.READ_RECORD_RESPONSE_MESSAGE_TEMPLATE_70_KRN.Tag);
                 template.Children.AddListToList(responseTags);
                 template.Serialize();
                 database.StaticDataToBeAuthenticated.AddToList(template);
             }
             else
             {
                 TERMINAL_VERIFICATION_RESULTS_95_KRN tvr = new TERMINAL_VERIFICATION_RESULTS_95_KRN(database);
                 tvr.Value.CDAFailed = true;
                 tvr.UpdateDB();
             }
         }
         #endregion
     }
     #endregion
 }
Ejemplo n.º 5
0
        internal static SignalsEnum PostOutcome(KernelDatabaseBase database, KernelQ qManager,
                                                KernelMessageidentifierEnum uiMessage,
                                                KernelStatusEnum uiStatus,
                                                byte[] holdTime,
                                                Kernel2OutcomeStatusEnum status,
                                                Kernel2StartEnum start,
                                                bool?isUIRequestOnOutcomePresent,
                                                KernelMessageidentifierEnum messageOnError,
                                                L1Enum l1Enum,
                                                byte[] SW12,
                                                L2Enum l2Enum,
                                                L3Enum l3Enum,
                                                ValueQualifierEnum valueQualifierEnum,
                                                byte[] valueQualifier,
                                                byte[] currencyCode,
                                                bool receipt,
                                                KernelCVMEnum cvmStatus)
        {
            if (messageOnError != KernelMessageidentifierEnum.N_A || l1Enum != L1Enum.NOT_SET || l2Enum != L2Enum.NOT_SET || l3Enum != L3Enum.NOT_SET)
            {
                TLV disc = InitializeDiscretionaryData(database);

                ERROR_INDICATION_DF8115_KRN2 kei = new ERROR_INDICATION_DF8115_KRN2(database);
                kei.Value.MsgOnError = messageOnError;
                kei.Value.L1Enum     = l1Enum;
                kei.Value.L2Enum     = l2Enum;
                kei.Value.L3Enum     = l3Enum;
                if (SW12 != null)
                {
                    kei.Value.SW12 = SW12;
                }
                kei.UpdateDB();

                disc.Children.AddToList(kei);
                disc.Serialize();
            }

            if (uiMessage != KernelMessageidentifierEnum.N_A || uiStatus != KernelStatusEnum.N_A)
            {
                USER_INTERFACE_REQUEST_DATA_DF8116_KRN2 uird = new USER_INTERFACE_REQUEST_DATA_DF8116_KRN2(database);
                uird.Value.KernelMessageidentifierEnum = uiMessage;
                uird.Value.KernelStatusEnum            = uiStatus;
                if (holdTime == null)
                {
                    TLV holdTimeTLV = database.GetDefault(EMVTagsEnum.MESSAGE_HOLD_TIME_DF812D_KRN2);
                    if (holdTimeTLV != null)
                    {
                        holdTime = holdTimeTLV.Value;
                    }
                    else
                    {
                        holdTime = new byte[] { 0x00, 0x00, 0x00 }
                    };
                }
                uird.Value.HoldTime = holdTime;
                if (valueQualifier != null)
                {
                    uird.Value.ValueQualifier = valueQualifier;
                }
                uird.Value.ValueQualifierEnum = valueQualifierEnum;
                if (currencyCode != null)
                {
                    uird.Value.CurrencyCode = currencyCode;
                }
                uird.UpdateDB();
            }

            OUTCOME_PARAMETER_SET_DF8129_KRN2 kops = new OUTCOME_PARAMETER_SET_DF8129_KRN2(database);

            kops.Value.Status = status;
            kops.Value.Start  = start;
            if (isUIRequestOnOutcomePresent == null)
            {
                kops.Value.UIRequestOnOutcomePresent = isUIRequestOnOutcomePresent == false;
                kops.Value.UIRequestOnRestartPresent = isUIRequestOnOutcomePresent == false;
            }
            else
            {
                kops.Value.UIRequestOnOutcomePresent = isUIRequestOnOutcomePresent == true ? true : false;
                kops.Value.UIRequestOnRestartPresent = isUIRequestOnOutcomePresent == true ? false : true;
            }
            kops.Value.DataRecordPresent        = database.Get(EMVTagsEnum.DATA_RECORD_FF8105_KRN2) != null ? true : false;
            kops.Value.DiscretionaryDataPresent = database.Get(EMVTagsEnum.DISCRETIONARY_DATA_FF8106_KRN2) != null ? true : false;
            //kops.Value.Receipt = receipt;
            kops.Value.CVM = cvmStatus;
            kops.UpdateDB();

            qManager.EnqueueToOutput(new KernelOUTResponse(
                                         database.Get(EMVTagsEnum.OUTCOME_PARAMETER_SET_DF8129_KRN2),
                                         database.Get(EMVTagsEnum.ERROR_INDICATION_DF8115_KRN2),
                                         database.Get(EMVTagsEnum.DATA_RECORD_FF8105_KRN2),
                                         database.Get(EMVTagsEnum.DISCRETIONARY_DATA_FF8106_KRN2),
                                         database.Get(EMVTagsEnum.USER_INTERFACE_REQUEST_DATA_DF8116_KRN2)));

            return(SignalsEnum.STOP);
        }