Ejemplo n.º 1
0
        /// <summary>
        /// Декодируем из байтового массива в формате ASN1
        /// </summary>
        /// <param name="baAsn1">Байтовый массив в формате ASN1</param>
        /// <returns>Текстовое представление пакета ASN1</returns>
        public string DecodeFromAsn1(byte[] baAsn1)
        {
            var memoryStream = new MemoryStream(baAsn1);

            using (var berReader = new BerReader(memoryStream))
            {
                //Формируем маркант
                try
                {
                    var    node   = berReader.ReadToEnd().ChildNodes[0];
                    string result = "";
                    foreach (var childNode in node.ChildNodes)
                    {
                        result = berReader.PrintStructure(childNode, result, 1, true);
                    }

                    Version = (int)node.ChildNodes[0].ReadContentAsBigInteger();

                    SessionKey = node.ChildNodes[1].RawValue;

                    IV = node.ChildNodes[2].RawValue;

                    PublicKey = node.ChildNodes[3].RawValue;

                    return(result);
                }
                catch (Exception e)
                {
                    throw new Exception("Invalid markant format", e);
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Формирует строка со структурным представлением байтового массива в формате ASN1
        /// </summary>
        /// <param name="baAsn1">Байтовый массив в формате ASN1</param>
        /// <returns>Строка с текстовым представлением байтового массива в формате ASN1</returns>
        public static string PrintFromAsn1(byte[] baAsn1)
        {
            var memoryStream = new MemoryStream(baAsn1);

            using (var berReader = new BerReader(memoryStream))
            {
                //Формируем текстовое представление марканта
                try
                {
                    var    node   = berReader.ReadToEnd().ChildNodes[0];
                    string result = "ASN1:";
                    foreach (var childNode in node.ChildNodes)
                    {
                        result = berReader.PrintStructure(childNode, result, 1, true);
                    }

                    return(result);
                }
                catch (Exception e)
                {
                    throw new Exception("Invalid ASN format", e);
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Печатает ASN.1 структуру
        /// </summary>
        /// <param name="reader">Объект BerReader</param>
        /// <param name="node">Узел дерева</param>
        /// <param name="relativeResult">Предыдущий результат работы данного метода</param>
        /// <param name="depth">Глубина вложенности</param>
        /// <param name="dumpValues">Печатать значения</param>
        /// <returns>Структура ASN.1 представленная в виде строки</returns>
        internal static string PrintStructure(this BerReader reader, InternalNode node, string relativeResult, int depth, bool dumpValues)
        {
            var offsetAndLength = String.Format("({0},{1})",
                                                node.StartPosition.ToString(CultureInfo.InvariantCulture),
                                                node.Length.ToString(CultureInfo.InvariantCulture));

            var structure = String.Format("{0} {1}",
                                          offsetAndLength,
                                          (node.Identifier.Class == Asn1Class.ContextSpecific)
                    ? String.Format("{0} ({1})", node.Identifier.Class, (int)node.Identifier.Tag)
                    : node.Identifier.Tag.ToString());

            if (dumpValues)
            {
                if (node.NodeType == Asn1NodeType.Primitive)
                {
                    string stringValue;
                    node.RawValue = reader.ReadContentAsBuffer(node);

                    switch (node.Identifier.Tag)
                    {
                    case Asn1Type.ObjectIdentifier:
                        stringValue = node.ReadContentAsObjectIdentifier();
                        break;

                    case Asn1Type.PrintableString:
                    case Asn1Type.Ia5String:
                    case Asn1Type.Utf8String:
                        stringValue = node.ReadContentAsString();
                        break;

                    case Asn1Type.GeneralizedTime:
                    case Asn1Type.UtcTime:
                        stringValue = node.ReadConventAsDateTimeOffset().ToString();
                        break;

                    case Asn1Type.Integer:
                        stringValue = node.ReadContentAsBigInteger().ToString();
                        break;

                    case Asn1Type.Boolean:
                        stringValue = node.ReadContentAsBoolean().ToString();
                        break;

                    default:
                        stringValue = node.RawValue.ToHexString();
                        break;
                    }

                    structure = string.Format("{0} : {1}", structure, stringValue);
                }
            }

            for (int i = 0; i < depth; i++)
            {
                structure = "\t" + structure;
            }

            string res = relativeResult + Environment.NewLine + structure;

            var innerdepth = (node.ChildNodes.Count > 0) ? depth + 1 : depth;

            foreach (var innerNode in node.ChildNodes)
            {
                res = reader.PrintStructure(innerNode, res, innerdepth, dumpValues);
            }

            return(res);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Prints structure of given ASN.1 node. Node should be the result of ReadToEnd method called before.
        /// </summary>
        /// <param name="reader">Extended object</param>
        /// <param name="node">Node to print structure of.</param>
        /// <param name="relativeResult">Relative result of this method. Used when iterating through the structure to build on top of previous results of this method.</param>
        /// <param name="depth">Actual depth of parser.</param>
        /// <param name="dumpValues">Flag indicating if values should be printed out.</param>
        /// <returns>Structure of ASN.1 node as string.</returns>
        internal static string PrintStructure(this BerReader reader, InternalNode node, string relativeResult, int depth, bool dumpValues)
        {
            // print offset in source stream and length of ASN.1 node
            var offsetAndLength = String.Format("({0},{1})",
                                                node.StartPosition.ToString(CultureInfo.InvariantCulture),
                                                node.Length.ToString(CultureInfo.InvariantCulture));

            // append tag name
            var structure = String.Format("{0} {1}",
                                          offsetAndLength,
                                          (node.Identifier.Class == Asn1Class.ContextSpecific)
                    ? String.Format("{0} ({1})", node.Identifier.Class, (int)node.Identifier.Tag)
                    : node.Identifier.Tag.ToString());

            // append value of ASN.1 node
            if (dumpValues)
            {
                if (node.NodeType == Asn1NodeType.Primitive)
                {
                    string stringValue;
                    node.RawValue = reader.ReadContentAsBuffer(node);

                    switch (node.Identifier.Tag)
                    {
                    case Asn1Type.ObjectIdentifier:
                        stringValue = node.ReadContentAsObjectIdentifier();
                        break;

                    case Asn1Type.PrintableString:
                    case Asn1Type.Ia5String:
                    case Asn1Type.Utf8String:
                        stringValue = node.ReadContentAsString();
                        break;

                    case Asn1Type.GeneralizedTime:
                    case Asn1Type.UtcTime:
                        stringValue = node.ReadConventAsDateTimeOffset().ToString();
                        break;

                    case Asn1Type.Integer:
                        stringValue = node.ReadContentAsBigInteger().ToString();
                        break;

                    case Asn1Type.Boolean:
                        stringValue = node.ReadContentAsBoolean().ToString();
                        break;

                    default:
                        stringValue = node.RawValue.ToHexString();
                        break;
                    }

                    structure = string.Format("{0} : {1}", structure, stringValue);
                }
            }

            // apply depth
            for (int i = 0; i < depth; i++)
            {
                structure = "\t" + structure;
            }

            // append new line
            string res = relativeResult + Environment.NewLine + structure;

            // count new depth if node has children
            var innerdepth = (node.ChildNodes.Count > 0) ? depth + 1 : depth;

            // recursively go through children and print structure of them
            foreach (var innerNode in node.ChildNodes)
            {
                res = reader.PrintStructure(innerNode, res, innerdepth, dumpValues);
            }

            // return result
            return(res);
        }