Beispiel #1
0
        /// <summary>
        /// Builds DGI to be used with STORE DATA command for given FCI .
        /// </summary>
        /// <param name="fciModel"></param>
        /// <returns></returns>
        public string BuildDgi(FciModel fciModel)
        {
            var fields = new List <TagModel>();

            if (fciModel.Tags != null)
            {
                fields.AddRange(fciModel.Tags);
            }

            var tagModel = new TagModel {
                Tag = "A5", Fields = fields
            };
            var command = BuildDgi(tagModel);

            return($"{fciModel.Dgi}{TlvDataHelper.ToBerEncodedL((uint)command.Length / 2).ToHexa('\0')}{command}");
        }
Beispiel #2
0
        /// <summary>
        /// Builds UDR to be used with STORE DATA command for given FCI .
        /// </summary>
        /// <param name="fciModel"></param>
        /// <returns></returns>
        public string BuildDgi(FciModel fciModel)
        {
            var fields = new List <TagModel>();

            if (fciModel.Tags != null)
            {
                fields.AddRange(fciModel.Tags);
            }

            var tagModel = new TagModel {
                Tag = "A5", Fields = fields
            };
            var command = BuildDgi(tagModel);

            return(String.Format("{0}{1}{2}", fciModel.Dgi, TlvDataHelper.ToBerEncodedL((uint)command.Length / 2).ToHexa('\0'), command));
        }
Beispiel #3
0
        /// <summary>
        /// Builds UDR to be used with PUT DATA command for given record .
        /// </summary>
        /// <param name="recordModel"></param>
        /// <returns></returns>
        public string BuildDgi(RecordModel recordModel)
        {
            var fields = new List <TagModel>();

            if (recordModel.Fields != null)
            {
                fields.AddRange(recordModel.Fields.Select(t => new TagModel {
                    Tag = t
                }));
            }

            var tagModel = new TagModel {
                Tag = "70", Fields = fields
            };
            var command = BuildDgi(tagModel);

            return(String.Format("{0:X2}{1:X2}{2}{3}", recordModel.Sfi, recordModel.Index, TlvDataHelper.ToBerEncodedL((uint)command.Length / 2).ToHexa('\0'), command));
        }
Beispiel #4
0
        private TlvData GetAipTlv(TagModel tagModel)
        {
            var aipStrings = data.UnmanagedAttributes[tagModel.Tag]
                             .ToObject <string[]>();

            var aip = new ApplicationInterchangeProfile();

            foreach (var aipString in aipStrings)
            {
                switch (aipString)
                {
                case "sda":
                    aip.Sda = true;
                    break;

                case "dda":
                    aip.Dda = true;
                    break;

                case "cda":
                    aip.Cda = true;
                    break;

                case "cardholder-verification":
                    aip.CardholderVerification = true;
                    break;

                case "terminal-risk-management":
                    aip.TerminalRiskManagement = true;
                    break;

                case "issuer-authentication":
                    aip.IssuerAuthentication = true;
                    break;
                }
            }

            return(aip.Tlv);
        }
Beispiel #5
0
 /// <summary>
 /// Builds DGI to be used with STORE DATA command for given tag.
 /// </summary>
 /// <param name="tagModel"></param>
 /// <returns></returns>
 private string BuildDgi(TagModel tagModel)
 {
     return(BuildTlv(tagModel)
            .ToByteArray()
            .ToHexa('\0'));
 }
Beispiel #6
0
        public TlvData BuildTlv(TagModel tagModel)
        {
            var tlv = new TlvData {
                Tag = Convert.ToUInt32(tagModel.Tag, 16)
            };

            if (tagModel.Fields == null)
            {
                switch (tagModel.Tag)
                {
                case "57":     // Track 2 Equivalent Data
                    tlv.Value = data.UnmanagedAttributes[tagModel.Tag]
                                .ToObject <Track2EquivalentDataModel>()
                                .Track2EqDataFormat
                                .FromHexa();
                    break;

                case "5F2D":     // Language Preference
                    tlv.Value = data.UnmanagedAttributes[tagModel.Tag]
                                .ToObject <string[]>()
                                .Aggregate(String.Empty, (c, l) => c + l)
                                .FromString();
                    break;

                case "82":     // Application Interchange Profile
                    tlv.Value = GetAipTlv(tagModel).Value;
                    break;

                case "8F":
                    tlv.Value = issuerContext.CaPublicKeyIndex.FromHexa();
                    break;

                case "90":     // Issuer Public Key Certificate
                    tlv.Value = issuerContext.IssuerPublicKeyCertificate.FromHexa();
                    break;

                case "92":     // Issuer Public Key Remainder
                    tlv.Value = issuerContext.IssuerPublicKeyRemainder.FromHexa();
                    break;

                case "93":     // Signed Static Authentication Data
                    tlv.Value = ComputeSignedStaticApplicationData().Value;
                    break;

                case "94":     // Application File Locator
                    tlv.Value = GetAflTlv().Value;
                    break;

                case "9F32":     // Issuer Public Key Exponent
                    tlv.Value = issuerContext.IssuerPrivateKey.PublicExponent.FromHexa();
                    break;

                case "9F46":     // ICC Public Key Certificate
                    tlv.Value = iccContext.IccPublicKeyCertificate.FromHexa();
                    break;

                case "9F47":     // ICC Public Key Exponent
                    tlv.Value = iccContext.IccPrivateKey.PublicExponent.FromHexa();
                    break;

                case "9F48":     // ICC Public Key Remainder
                    tlv.Value = iccContext.IccPublicKeyRemainder.FromHexa();
                    break;

                case "8C":     // CDOL1
                case "8D":     // CDOL2
                case "9F4F":   // Log Format
                    tlv.Value = data.UnmanagedAttributes[tagModel.Tag]
                                .ToObject <TagLengthModel[]>()
                                .Aggregate(String.Empty, (c, tl) => c + String.Format("{0}{1:X2}", tl.Tag, tl.Length))
                                .FromHexa();
                    break;

                case "9F4D":     // Log Entry
                    var logModel = data.UnmanagedAttributes[tagModel.Tag]
                                   .ToObject <LogModel>();
                    tlv.Value = new[] { logModel.Sfi, logModel.Size };
                    break;

                case "50":     // Application Label
                case "5F20":   // Cardholder Name
                case "9D":     // Directory Definition File Name
                case "9F12":   // Application Preferred Name
                    tlv.Value = data.UnmanagedAttributes[tagModel.Tag]
                                .ToObject <string>()
                                .FromString();
                    break;

                default:
                    tlv.Value = data.UnmanagedAttributes[tagModel.Tag]
                                .ToObject <string>()
                                .FromHexa();
                    break;
                }
            }
            else
            {
                tlv.InnerTlvs = tagModel.Fields.Select(BuildTlv).ToList();
            }

            return(tlv);
        }