private static void CreateEntry(EMVTagMeta emvTagMeta, byte[] value)
        {
            TLV tlv = TLV.Create(emvTagMeta.Tag);

            tlv.Value = value;
            EMVTagDefaultsList.AddToList(tlv);
        }
예제 #2
0
        public override void Deserialize(byte[] response)
        {
            base.Deserialize(response);
            if (!Succeeded)
            {
                return;
            }
            if (ResponseData[0] == 0x77)
            {
                tlvResponse = TLV.Create(EMVTagsEnum.RESPONSE_MESSAGE_TEMPLATE_FORMAT_2_77_KRN.Tag);
            }
            else
            {
                tlvResponse = TLV.Create(EMVTagsEnum.RESPONSE_MESSAGE_TEMPLATE_FORMAT_1_80_KRN.Tag);
            }
            tlvResponse.Deserialize(ResponseData, 0);

            if (!tlvResponse.Tag.IsConstructed)
            {
                CryptogramInformationData     = TLV.Create(EMVTagsEnum.CRYPTOGRAM_INFORMATION_DATA_9F27_KRN.Tag, GetData(tlvResponse.Value, 0, 1));
                ApplicationTransactionCounter = TLV.Create(EMVTagsEnum.APPLICATION_TRANSACTION_COUNTER_ATC_9F36_KRN.Tag, GetData(tlvResponse.Value, 0 + 1, 2));
                ApplicationCryptogram         = TLV.Create(EMVTagsEnum.APPLICATION_CRYPTOGRAM_9F26_KRN.Tag, GetData(tlvResponse.Value, 0 + 1 + 2, 8));
                IssuerApplicationData         = TLV.Create(EMVTagsEnum.ISSUER_APPLICATION_DATA_9F10_KRN.Tag, GetData(tlvResponse.Value, 0 + 1 + 2 + 8, 32));
            }
            else
            {
                CryptogramInformationData           = tlvResponse.Children.Get(EMVTagsEnum.CRYPTOGRAM_INFORMATION_DATA_9F27_KRN.Tag);
                ApplicationTransactionCounter       = tlvResponse.Children.Get(EMVTagsEnum.APPLICATION_TRANSACTION_COUNTER_ATC_9F36_KRN.Tag);
                ApplicationCryptogram               = tlvResponse.Children.Get(EMVTagsEnum.APPLICATION_CRYPTOGRAM_9F26_KRN.Tag);
                IssuerApplicationData               = tlvResponse.Children.Get(EMVTagsEnum.ISSUER_APPLICATION_DATA_9F10_KRN.Tag);
                POSCardholderInteractionInformation = tlvResponse.Children.Get(EMVTagsEnum.POS_CARDHOLDER_INTERACTION_INFORMATION_DF4B_KRN2.Tag);
            }
        }
예제 #3
0
 private static void AddDREntry(EMVTagMeta tag, KernelDatabaseBase database)
 {
     if (database.IsPresent(tag.Tag))
     {
         database.Get(EMVTagsEnum.DATA_RECORD_FF8105_KRN2).Children.AddToList(TLV.Create(tag.Tag, database.Get(tag).Value));
     }
 }
        private TLV Pack91(CryptoMetaData cryptoMetaData, byte[] arpc, TLV _8A)
        {
            TLV _91;

            if (arpc == null)
            {
                arpc = new byte[8];
            }

            switch (cryptoMetaData.SKDMethod)
            {
            case SKDMethod.VSDC:
                _91 = TLV.Create(EMVTagsEnum.ISSUER_AUTHENTICATION_DATA_91_KRN.Tag, Formatting.ConcatArrays(arpc, _8A.Value));
                break;

            case SKDMethod.MCHIP:
                _91 = TLV.Create(EMVTagsEnum.ISSUER_AUTHENTICATION_DATA_91_KRN.Tag, Formatting.ConcatArrays(arpc, _8A.Value));
                break;

            case SKDMethod.EMV_CSKD:
                _91 = TLV.Create(EMVTagsEnum.ISSUER_AUTHENTICATION_DATA_91_KRN.Tag, Formatting.ConcatArrays(arpc, PackCSU()));
                break;

            default:
                throw new SimulatedPaymentProviderException("Pack91: SKDMethod not supported:" + cryptoMetaData.SKDMethod);
            }
            return(_91);
        }
예제 #5
0
        public static void PackRelatedDataTag(KernelDatabaseBase database, EMVTagMeta tagToPack, TLVList tagListForPack)
        {
            TLV           tlvRelatedData      = database.Get(tagToPack);
            List <byte[]> tlvRelatedDataBytes = new List <byte[]>();

            Logger.Log("Packing tag: " + tagListForPack.ToString());
            foreach (TLV tlv in tagListForPack)
            {
                TLV valForPackDb = database.Get(tlv.Tag.TagLable);
                TLV valForPack;
                if (valForPackDb == null)
                {
                    valForPack = TLV.Create(tlv.Tag.TagLable);
                }
                else
                {
                    byte[] copyVal = new byte[valForPackDb.Value.Length];
                    Array.Copy(valForPackDb.Value, copyVal, valForPackDb.Value.Length);
                    valForPack = TLV.Create(tlv.Tag.TagLable, copyVal);
                }
                valForPack.Val.PackValue(tlv.Val.GetLength());
                Logger.Log("Adding tag: " + valForPack.ToString());
                tlvRelatedDataBytes.Add(valForPack.Value);
            }
            tlvRelatedData.Value = tlvRelatedDataBytes.SelectMany(a => a).ToArray();
        }
예제 #6
0
        public static byte[] PackRelatedDataTag(KernelDatabaseBase database, TLV tagListForPack)
        {
            List <byte[]> tlvRelatedDataBytes = new List <byte[]>();
            TLVList       tags = TLV.DeserializeChildrenWithNoV(tagListForPack.Value, 0);

            Logger.Log("Packing tag: " + tagListForPack.ToString());
            foreach (TLV tlv in tags)
            {
                TLV valForPackDb = database.Get(tlv.Tag.TagLable);
                TLV valForPack;
                if (valForPackDb == null)
                {
                    valForPack = TLV.Create(tlv.Tag.TagLable);
                }
                else
                {
                    byte[] copyVal = new byte[valForPackDb.Value.Length];
                    Array.Copy(valForPackDb.Value, copyVal, valForPackDb.Value.Length);
                    valForPack = TLV.Create(tlv.Tag.TagLable, copyVal);
                }
                valForPack.Val.PackValue(tlv.Val.GetLength());
                Logger.Log("Adding tag: " + valForPack.ToString());
                tlvRelatedDataBytes.Add(valForPack.Value);
            }
            return(tlvRelatedDataBytes.SelectMany(a => a).ToArray());
        }
예제 #7
0
        private static TLVList DeserList(tlvXMLType[] serXML)
        {
            TLVList result = new TLVList();

            serXML.ToList().ForEach((x) =>
            {
                TLV tlvToAdd = TLV.Create(x.tag.Name);
                //x.tag.Description = TLVMetaDataSourceSingleton.Instance.DataSource.GetName(tlvToAdd.Tag.TagLable);
                result.AddToList(tlvToAdd);
                if (x.children != null)
                {
                    tlvToAdd.Children.AddListToList(DeserList(x.children));
                }
                else
                {
                    if (x.value != null)
                    {
                        if (x.value.Formatting == FormattingEnum.ASCII)
                        {
                            tlvToAdd.Value = Formatting.ASCIIStringToByteArray(x.value.Value);
                        }
                        else
                        {
                            tlvToAdd.Value = Formatting.HexStringToByteArray(x.value.Value);
                        }
                    }
                    if (x.valueC9 != null)
                    {
                    }
                }
            });
            return(result);
        }
 private void AddTTL(EMVTagMeta tag, KernelDatabaseBase database)
 {
     if (database.IsNotEmpty(tag.Tag))
     {
         Children.AddToList(TLV.Create(tag.Tag, database.Get(tag).Value));
     }
 }
예제 #9
0
        public static byte[] VerifyCardSignature(TLV tlv)
        {
            CryptoMetaData cryptoMetaData = EMVDESSecurity.BuildCryptoMeta(tlv);

            //fire up HSM
            if (jcesecmod == null)
            {
                jcesecmod = new EMVDESSecurity(lmkFilePath);
            }

            TLV  _8A;
            bool isApproved = true;

            if (isApproved)
            {
                _8A = TLV.Create(EMVTagsEnum.AUTHORISATION_RESPONSE_CODE_8A_KRN.Tag, arcApproved);
            }
            else
            {
                _8A = TLV.Create(EMVTagsEnum.AUTHORISATION_RESPONSE_CODE_8A_KRN.Tag, arcDeclined);
            }

            byte[] arpc = jcesecmod.VerifyCryptogramGenARPC(tlv, cryptoMetaData, _8A.Value, mkACEncrypted, mkACEncryptedCV);

            return(arpc);
        }
        static PersoAndCardStateStorage()
        {
            APPLICATION_TRANSACTION_COUNTER_ATC_9F36_KRN = TLV.Create(EMVTagsEnum.APPLICATION_TRANSACTION_COUNTER_ATC_9F36_KRN.Tag, Formatting.HexStringToByteArray("0001"));
            APPLICATION_INTERCHANGE_PROFILE_82_KRN       = TLV.Create(EMVTagsEnum.APPLICATION_INTERCHANGE_PROFILE_82_KRN.Tag, Formatting.HexStringToByteArray("0000"));
            TRACK_2_EQUIVALENT_DATA_57_KRN = TLV.Create(EMVTagsEnum.TRACK_2_EQUIVALENT_DATA_57_KRN.Tag, calcTrack2());
            CARDHOLDER_NAME_5F20_KRN       = TLV.Create(EMVTagsEnum.CARDHOLDER_NAME_5F20_KRN.Tag, Formatting.HexStringToByteArray("202F"));
            APPLICATION_PRIMARY_ACCOUNT_NUMBER_PAN_5A_KRN = TLV.Create(EMVTagsEnum.APPLICATION_PRIMARY_ACCOUNT_NUMBER_PAN_5A_KRN.Tag, Formatting.HexStringToByteArray("1234567890123456"));
            APPLICATION_PRIMARY_ACCOUNT_NUMBER_PAN_SEQUENCE_NUMBER_5F34_KRN = TLV.Create(EMVTagsEnum.APPLICATION_PRIMARY_ACCOUNT_NUMBER_PAN_SEQUENCE_NUMBER_5F34_KRN.Tag, Formatting.HexStringToByteArray("01"));
            FORM_FACTOR_INDICATOR_FFI_9F6E_KRN3   = TLV.Create(EMVTagsEnum.FORM_FACTOR_INDICATOR_FFI_9F6E_KRN3.Tag, Formatting.HexStringToByteArray("00000000"));
            CUSTOMER_EXCLUSIVE_DATA_CED_9F7C_KRN3 = TLV.Create(EMVTagsEnum.CUSTOMER_EXCLUSIVE_DATA_CED_9F7C_KRN3.Tag, Formatting.HexStringToByteArray("0000000000000000000000000000000000000000000000000000000000000000"));
            CARD_ADDITIONAL_PROCESSES_9F68_KRN    = TLV.Create(EMVTagsEnum.CARD_ADDITIONAL_PROCESSES_9F68_KRN.Tag, new byte[] { 0x00, 0x60, (byte)0x80, 0x00 });

            ISSUER_APPLICATION_DATA_9F10_KRN = TLV.Create(EMVTagsEnum.ISSUER_APPLICATION_DATA_9F10_KRN.Tag);
            ISSUER_APPLICATION_DATA_9F10_KRN.Val.PackValue(32);
            ISSUER_APPLICATION_DATA_9F10_KRN.Value[0] = 0x06; //format
            ISSUER_APPLICATION_DATA_9F10_KRN.Value[1] = 0x00; //kdi
            ISSUER_APPLICATION_DATA_9F10_KRN.Value[2] = 0x11; //cvn , crypto 17

            ISSUER_APPLICATION_DATA_9F10_KRN.Value[3] = 0x00; //cvr byte 1
            ISSUER_APPLICATION_DATA_9F10_KRN.Value[4] = 0x00; //cvr byte 2
            ISSUER_APPLICATION_DATA_9F10_KRN.Value[5] = 0x00; //cvr byte 3
            ISSUER_APPLICATION_DATA_9F10_KRN.Value[6] = 0x00; //cvr byte 4

            //with emv demo app which uses the hsm
            ICC_MK = Formatting.HexStringToByteArray("8CB9F7D54362B0A240D0AE626780A86B");
            //with simulated provider, standard master ac test key -> 2315208C9110AD402315208C9110AD40 -> derives this key for this pan and this pan sequence number
            //ICC_MK = Formatting.HexStringToByteArray("3DAD707C897F49895D6D62526297497A");
        }
        private static bool VerifySDAD_Summaries_42(Kernel2Database database, CAPublicKeyCertificate capk, CardResponse cardResponse)
        {
            ICCDynamicData iccdd = VerifySAD.VerifySDAD(ICCDynamicDataType.IDS, true, database, database.StaticDataToBeAuthenticated, capk, cardResponse);

            if (iccdd == null)
            {
                return(false);
            }

            AddSDADDataToDatabase(database, iccdd);

            TLV ds2 = database.Get(EMVTagsEnum.DS_SUMMARY_2_DF8101_KRN2);
            TLV ds3 = database.Get(EMVTagsEnum.DS_SUMMARY_3_DF8102_KRN2);

            if (ds2 == null && iccdd.DSSummary2 != null)
            {
                ds2 = TLV.Create(EMVTagsEnum.DS_SUMMARY_2_DF8101_KRN2.Tag);
            }

            if (ds3 == null && iccdd.DSSummary3 != null)
            {
                ds3 = TLV.Create(EMVTagsEnum.DS_SUMMARY_3_DF8102_KRN2.Tag);
            }

            if (iccdd.DSSummary2 != null)
            {
                ds2.Value = iccdd.DSSummary2;
            }
            if (iccdd.DSSummary3 != null)
            {
                ds3.Value = iccdd.DSSummary3;
            }

            return(true);
        }
예제 #12
0
        public override void Deserialize(byte[] response)
        {
            base.Deserialize(response);
            if (!Succeeded)
            {
                return;
            }
            if (ResponseData[0] == 0x77)
            {
                tlvResponse = TLV.Create(EMVTagsEnum.RESPONSE_MESSAGE_TEMPLATE_FORMAT_2_77_KRN.Tag);
            }
            else
            {
                tlvResponse = TLV.Create(EMVTagsEnum.RESPONSE_MESSAGE_TEMPLATE_FORMAT_1_80_KRN.Tag);
            }
            tlvResponse.Deserialize(ResponseData, 0);
            Logger.Log(ToPrintString());

            if (ResponseData[0] == 0x80)  //format 2
            {
                SignedApplicationData = TLV.Create(EMVTagsEnum.SIGNED_DYNAMIC_APPLICATION_DATA_9F4B_KRN.Tag, tlvResponse.Value);
            }
            if (ResponseData[0] == 0x77)  //format 1
            {
                SignedApplicationData = tlvResponse.Children.Get(EMVTagsEnum.SIGNED_DYNAMIC_APPLICATION_DATA_9F4B_KRN.Tag);
            }
        }
예제 #13
0
        protected override void DoEntryPointD(Tuple <EMVTerminalProcessingOutcome, EMVSelectApplicationResponse, TerminalSupportedKernelAidTransactionTypeCombination, CardKernelAidCombination, EntryPointPreProcessingIndicators> indicators)
        {
            //3.4.1.1
            KernelBase kernel = EMVContactlessKernelActivation.ActivateKernel(tr, cardQProcessor, tornTransactionLogManager, publicKeyCertificateManager, indicators.Item2, indicators.Item3, indicators.Item4, indicators.Item5, cardExceptionManager, configProvider);

            kernel.ExceptionOccured += Kernel_ExceptionOccured;

            //TODO: change config to load only kernel specific tags
            terminalConfigurationData.LoadTerminalConfigurationDataObjects(((TerminalSupportedContactlessKernelAidTransactionTypeCombination)indicators.Item3).KernelEnum, configProvider);

            TLVList requestInput = new TLVList();

            requestInput.AddToList(indicators.Item2.GetFCITemplateTag());
            requestInput.AddListToList(tr.GetTxDataTLV());
            //TERMINAL_TRANSACTION_QUALIFIERS_9F66_KRN ttq = ((TerminalSupportedContactlessKernelAidTransactionTypeCombination)indicators.Item3).TTQ;
            TERMINAL_TRANSACTION_QUALIFIERS_9F66_KRN ttq = indicators.Item5.TTQ;

            if (ttq != null)
            {
                requestInput.AddToList(TLV.Create(EMVTagsEnum.TERMINAL_TRANSACTION_QUALIFIERS_TTQ_9F66_KRN.Tag, ttq.Value.Value));
            }

            KernelRequest request = new KernelRequest(KernelTerminalReaderServiceRequestEnum.ACT, requestInput);

            kernel.KernelQ.EnqueueToInput(request);
            Task.Run(() => kernel.StartNewTransaction(), cancellationTokenForTerminalApplication.Token);
            Task.Run(() => OnProcessCompleted(StartServiceQPRocess(kernel)));
        }
        public TLVList GetResponseTags()
        {
            try
            {
                TLVList result = new TLVList();
                if (tlvResponse.Tag.TagLable == EMVTagsEnum.RESPONSE_MESSAGE_TEMPLATE_FORMAT_1_80_KRN.Tag)
                {
                    byte[] DeviceRelayResistanceEntropy            = new byte[4];
                    byte[] MinTimeForProcessingRelayResistanceAPDU = new byte[2];
                    byte[] MaxTimeForProcessingRelayResistanceAPDU = new byte[2];
                    byte[] DeviceEstimatedTransmissionTimeForRelayResistanceRAPDU = new byte[2];

                    Array.Copy(tlvResponse.Value, 0, DeviceRelayResistanceEntropy, 0, 4);
                    Array.Copy(tlvResponse.Value, 4, MinTimeForProcessingRelayResistanceAPDU, 0, 2);
                    Array.Copy(tlvResponse.Value, 6, MaxTimeForProcessingRelayResistanceAPDU, 0, 2);
                    Array.Copy(tlvResponse.Value, 8, DeviceEstimatedTransmissionTimeForRelayResistanceRAPDU, 0, 2);

                    result.AddToList(TLV.Create(EMVTagsEnum.DEVICE_RELAY_RESISTANCE_ENTROPY_DF8302_KRN2.Tag, DeviceRelayResistanceEntropy));
                    result.AddToList(TLV.Create(EMVTagsEnum.MIN_TIME_FOR_PROCESSING_RELAY_RESISTANCE_APDU_DF8303_KRN2.Tag, MinTimeForProcessingRelayResistanceAPDU));
                    result.AddToList(TLV.Create(EMVTagsEnum.MAX_TIME_FOR_PROCESSING_RELAY_RESISTANCE_APDU_DF8304_KRN2.Tag, MaxTimeForProcessingRelayResistanceAPDU));
                    result.AddToList(TLV.Create(EMVTagsEnum.DEVICE_ESTIMATED_TRANSMISSION_TIME_FOR_RELAY_RESISTANCE_RAPDU_DF8305_KRN2.Tag, DeviceEstimatedTransmissionTimeForRelayResistanceRAPDU));
                }
                else
                {
                    throw new EMVProtocolException("Unrecognised template received from Get Processing Options");
                }

                return(result);
            }
            catch (Exception ex)
            { throw new EMVProtocolException("RESPONSE_MESSAGE_TEMPLATE_FORMAT_1_80_KRN Tag not found:" + ex.Message); }
        }
예제 #15
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 TLVList GetResponseTags()
        {
            try
            {
                TLVList result = new TLVList();
                if (tlvResponse.Tag.TagLable == EMVTagsEnum.RESPONSE_MESSAGE_TEMPLATE_FORMAT_1_80_KRN.Tag)
                {
                    byte[] aip = EMVTagsEnum.APPLICATION_INTERCHANGE_PROFILE_82_KRN.InitValue();
                    byte[] afl = new byte[tlvResponse.Value.Length - aip.Length];
                    Array.Copy(tlvResponse.Value, 0, aip, 0, aip.Length);
                    Array.Copy(tlvResponse.Value, aip.Length, afl, 0, afl.Length);
                    result.AddToList(TLV.Create(EMVTagsEnum.APPLICATION_INTERCHANGE_PROFILE_82_KRN.Tag, aip));
                    result.AddToList(TLV.Create(EMVTagsEnum.APPLICATION_FILE_LOCATOR_AFL_94_KRN.Tag, afl));
                }
                else if (tlvResponse.Tag.TagLable == EMVTagsEnum.RESPONSE_MESSAGE_TEMPLATE_FORMAT_2_77_KRN.Tag)
                {
                    return(tlvResponse.Children);
                }
                else
                {
                    throw new EMVProtocolException("Unrecognised template received from Get Processing Options");
                }

                return(result);
            }
            catch (Exception ex)
            { throw new EMVProtocolException("APPLICATION_IDENTIFIER_CARD_4F Tag not found:" + ex.Message); }
        }
예제 #17
0
        private void ContactlessApp_PinRequest(TLVList data)
        {
            CapturePin();
            //TODO: encrypt the pin
            TLV pin = TLV.Create(EMVTagsEnum.TRANSACTION_PERSONAL_IDENTIFICATION_NUMBER_PIN_DATA_99_KRN.Tag, Formatting.HexStringToByteArray(pinEntryTCS.Task.Result));

            data.AddToList(pin);
        }
예제 #18
0
 protected override TLV GetTLVResponse()
 {
     if (tlvResponse == null)
     {
         tlvResponse = TLV.Create(EMVTagsEnum.FILE_CONTROL_INFORMATION_FCI_TEMPLATE_6F_KRN.Tag);
         tlvResponse.Deserialize(ResponseData, 0);
     }
     return(tlvResponse);
 }
        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());
        }
 public override void Deserialize(byte[] response)
 {
     base.Deserialize(response);
     if (!Succeeded)
     {
         return;
     }
     tlvResponse = TLV.Create(EMVTagsEnum.RESPONSE_MESSAGE_TEMPLATE_FORMAT_1_80_KRN.Tag);
     tlvResponse.Deserialize(ResponseData, 0);
 }
예제 #21
0
 public override void Deserialize(byte[] response)
 {
     base.Deserialize(response);
     if (!Succeeded)
     {
         return;
     }
     tlvResponse = TLV.Create(EMVTagsEnum.FILE_CONTROL_INFORMATION_FCI_TEMPLATE_6F_KRN.Tag);
     tlvResponse.Deserialize(ResponseData, 0);
     Logger.Log(ToPrintString());
 }
예제 #22
0
        public static TLV InitializeDiscretionaryData(KernelDatabaseBase database)
        {
            TLV disc = database.Get(EMVTagsEnum.DISCRETIONARY_DATA_FF8106_KRN2);

            if (disc == null)
            {
                disc = TLV.Create(EMVTagsEnum.DISCRETIONARY_DATA_FF8106_KRN2.Tag);
                database.AddToList(disc);
            }
            return(disc);
        }
예제 #23
0
 public TLVList GetTxDataTLV()
 {
     TxData = new TLVList();
     TxData.AddToList(TLV.Create(EMVTagsEnum.AMOUNT_AUTHORISED_NUMERIC_9F02_KRN.Tag, Formatting.StringToBcd(Convert.ToString(amount), EMVTagsEnum.AMOUNT_AUTHORISED_NUMERIC_9F02_KRN.DataFormatter.GetMaxLength(), false)));
     TxData.AddToList(TLV.Create(EMVTagsEnum.AMOUNT_OTHER_NUMERIC_9F03_KRN.Tag, Formatting.StringToBcd(Convert.ToString(amountOther), EMVTagsEnum.AMOUNT_OTHER_NUMERIC_9F03_KRN.DataFormatter.GetMaxLength(), false)));
     TxData.AddToList(TLV.Create(EMVTagsEnum.TRANSACTION_TYPE_9C_KRN.Tag, new byte[] { (byte)transactionTypeEnum }));
     TxData.AddToList(TLV.Create(EMVTagsEnum.TRANSACTION_DATE_9A_KRN.Tag, EMVTagsEnum.TRANSACTION_DATE_9A_KRN.FormatFromDateTime(transactionDate)));
     TxData.AddToList(TLV.Create(EMVTagsEnum.TRANSACTION_TIME_9F21_KRN.Tag, EMVTagsEnum.TRANSACTION_TIME_9F21_KRN.FormatFromDateTime(transactionDate)));
     TxData.AddToList(TLV.Create(EMVTagsEnum.POINTOFSERVICE_POS_ENTRY_MODE_9F39_KRN.Tag, Formatting.HexStringToByteArray("00")));
     TxData.AddToList(TLV.Create(EMVTagsEnum.TRANSACTION_CURRENCY_CODE_5F2A_KRN.Tag, Formatting.StringToBcd(Convert.ToString(ISOCurrencyCodesEnum.ZAR.Code).PadLeft(4, '0'), false)));
     return(TxData);
 }
예제 #24
0
        public void Initialize(string tagLabel)
        {
            TLV tlv = DataObjects.Get(tagLabel);

            if (tlv != null)
            {
                DataObjects.Get(tagLabel).Initialize();
            }
            else
            {
                AddToList(TLV.Create(tagLabel));
            }
        }
예제 #25
0
        public void DoPinReponse(string pin)
        {
            if (kernel == null)
            {
                throw new EMVProtocolException("DoPinReponse called without kernel being activated");
            }
            TLVList requestInput = new TLVList();

            requestInput.AddToList(TLV.Create(EMVTagsEnum.TRANSACTION_PERSONAL_IDENTIFICATION_NUMBER_PIN_DATA_99_KRN.Tag, Formatting.ASCIIStringToByteArray(pin)));
            KernelRequest request = new KernelRequest(KernelTerminalReaderServiceRequestEnum.PIN, requestInput);

            kernel.KernelQ.EnqueueToInput(request);
        }
예제 #26
0
        public override void Deserialize(byte[] response)
        {
            base.Deserialize(response);
            if (!Succeeded)
            {
                return;
            }
            int pos = 0;

            TLV.T t = TLV.T.Create(ResponseData, ref pos);
            tlvResponse = TLV.Create(t.TagLable);
            tlvResponse.Deserialize(ResponseData, 0);
            Logger.Log(ToPrintString());
        }
예제 #27
0
        public static void CreateMSDiscretionaryDataRecord(KernelDatabaseBase database)
        {
            //Table 4.8
            if (database.Get(EMVTagsEnum.DISCRETIONARY_DATA_FF8106_KRN2) == null)
            {
                database.AddToList(TLV.Create(EMVTagsEnum.DISCRETIONARY_DATA_FF8106_KRN2.Tag));
            }

            AddDDEntry(EMVTagsEnum.APPLICATION_CAPABILITIES_INFORMATION_9F5D_KRN2, database);
            AddDDEntry(EMVTagsEnum.DD_CARD_TRACK1_DF812A_KRN2, database);
            AddDDEntry(EMVTagsEnum.DD_CARD_TRACK2_DF812B_KRN2, database);
            AddDDEntry(EMVTagsEnum.ERROR_INDICATION_DF8115_KRN2, database);
            AddDDEntry(EMVTagsEnum.THIRD_PARTY_DATA_9F6E_KRN2, database);
        }
예제 #28
0
        public override void Deserialize(byte[] response)
        {
            base.Deserialize(response);
            if (!Succeeded)
            {
                return;
            }
            if (ResponseData[0] == 0x77)
            {
                tlvResponse = TLV.Create(EMVTagsEnum.RESPONSE_MESSAGE_TEMPLATE_FORMAT_2_77_KRN.Tag);
            }
            else
            {
                tlvResponse = TLV.Create(EMVTagsEnum.RESPONSE_MESSAGE_TEMPLATE_FORMAT_1_80_KRN.Tag);
            }
            tlvResponse.Deserialize(ResponseData, 0);
            Logger.Log(ToPrintString());

            if (!tlvResponse.Tag.IsConstructed) //Format 1 is not used if CDA is performed.
            {
                CDAPerformed = false;
                CryptogramInformationData     = TLV.Create(EMVTagsEnum.CRYPTOGRAM_INFORMATION_DATA_9F27_KRN.Tag, GetData(tlvResponse.Value, 0, 1));
                ApplicationTransactionCounter = TLV.Create(EMVTagsEnum.APPLICATION_TRANSACTION_COUNTER_ATC_9F36_KRN.Tag, GetData(tlvResponse.Value, 0 + 1, 2));
                ApplicationCryptogram         = TLV.Create(EMVTagsEnum.APPLICATION_CRYPTOGRAM_9F26_KRN.Tag, GetData(tlvResponse.Value, 0 + 1 + 2, 8));
                IssuerApplicationData         = TLV.Create(EMVTagsEnum.ISSUER_APPLICATION_DATA_9F10_KRN.Tag, GetData(tlvResponse.Value, 0 + 1 + 2 + 8, tlvResponse.Value.Length - (0 + 1 + 2 + 8)));
            }
            else //format 2
            {
                //CDA Not Performed
                if (tlvResponse.Children.IsNotPresent(EMVTagsEnum.SIGNED_DYNAMIC_APPLICATION_DATA_9F4B_KRN.Tag))
                {
                    CDAPerformed = false;
                    CryptogramInformationData           = tlvResponse.Children.Get(EMVTagsEnum.CRYPTOGRAM_INFORMATION_DATA_9F27_KRN.Tag);
                    ApplicationTransactionCounter       = tlvResponse.Children.Get(EMVTagsEnum.APPLICATION_TRANSACTION_COUNTER_ATC_9F36_KRN.Tag);
                    ApplicationCryptogram               = tlvResponse.Children.Get(EMVTagsEnum.APPLICATION_CRYPTOGRAM_9F26_KRN.Tag);
                    IssuerApplicationData               = tlvResponse.Children.Get(EMVTagsEnum.ISSUER_APPLICATION_DATA_9F10_KRN.Tag);
                    POSCardholderInteractionInformation = tlvResponse.Children.Get(EMVTagsEnum.POS_CARDHOLDER_INTERACTION_INFORMATION_DF4B_KRN2.Tag);
                }
                else//CDA Performed
                {
                    CDAPerformed = true;
                    CryptogramInformationData           = tlvResponse.Children.Get(EMVTagsEnum.CRYPTOGRAM_INFORMATION_DATA_9F27_KRN.Tag);
                    ApplicationTransactionCounter       = tlvResponse.Children.Get(EMVTagsEnum.APPLICATION_TRANSACTION_COUNTER_ATC_9F36_KRN.Tag);
                    SignedDynamicApplicationData        = tlvResponse.Children.Get(EMVTagsEnum.SIGNED_DYNAMIC_APPLICATION_DATA_9F4B_KRN.Tag);
                    IssuerApplicationData               = tlvResponse.Children.Get(EMVTagsEnum.ISSUER_APPLICATION_DATA_9F10_KRN.Tag);
                    POSCardholderInteractionInformation = tlvResponse.Children.Get(EMVTagsEnum.POS_CARDHOLDER_INTERACTION_INFORMATION_DF4B_KRN2.Tag);
                }
            }
        }
예제 #29
0
        public TLVList DoGPOTest(String data)
        {
            TLV tlv = TLV.Create("DF8111");

            tlv.Value = Formatting.HexStringToByteArray(data);
            EMVGetProcessingOptionsRequest  request  = new EMVGetProcessingOptionsRequest(tlv);
            EMVGetProcessingOptionsResponse response = SendCommand(request) as EMVGetProcessingOptionsResponse;

            if (!response.Succeeded)
            {
                throw new Exception("Failure doing GPO, SW=" + response.SW + " (" + response.SWTranslation + ")");
            }

            return(response.GetResponseTags());
        }
예제 #30
0
        public void InitializeDefaultDataObjects(TransactionTypeEnum tt, IConfigurationProvider configProvider)
        {
            DataObjects = new TLVList();
            LoadKernelDefaultConfigurationDataObjects(tt, configProvider);
            TLVList defaults = KernelConfigurationData.Get(tt);

            foreach (TLV tlv in defaults)
            {
                byte[] val = new byte[tlv.Value.Length];
                Array.Copy(tlv.Value, 0, val, 0, val.Length);
                AddToList(TLV.Create(tlv.Tag.TagLable, val));
            }

            ActiveAFL = new APPLICATION_FILE_LOCATOR_AFL_94_KRN(this);
        }