/// <summary>
        /// Assert Primary type of node. Also read the value of the node and assert with given value. Then move to next node.
        /// </summary>
        /// <param name="reader">BerReader instance.</param>
        /// <param name="level">Depth of node in ASN.1 structure.</param>
        /// <param name="type">Type of given node to assert.</param>
        /// <param name="length">Length of given node to assert.</param>
        /// <param name="value">Value of the node to assert.</param>
        private static void AssertReadPri(BerReader reader, int level, Asn1Type type, int length, object value)
        {
            Assert.AreEqual(level, reader.Depth, "Depth");
            Assert.AreEqual(Asn1NodeType.Primitive, reader.CurrentNode.NodeType, "Node Tag");
            Assert.AreEqual(type, reader.CurrentNode.Identifier.Tag, "Tag");
            Assert.AreEqual(length, reader.CurrentNode.Length, "Length");
            Assert.IsFalse(reader.CurrentNode.IsConstructed, "IsConstructed");
            Assert.IsFalse(reader.CurrentNode.NodeType == Asn1NodeType.DocumentEnd, "EndOfDocument");

            reader.CurrentNode.RawValue = reader.ReadContentAsBuffer();

            switch (reader.CurrentNode.Identifier.Tag)
            {
            case Asn1Type.ObjectIdentifier:
                Assert.AreEqual(value, reader.CurrentNode.ReadContentAsObjectIdentifier());
                break;

            case Asn1Type.PrintableString:
            case Asn1Type.Ia5String:
            case Asn1Type.Utf8String:
                Assert.AreEqual(value, reader.CurrentNode.ReadContentAsString());
                break;

            case Asn1Type.GeneralizedTime:
            case Asn1Type.UtcTime:
                Assert.AreEqual(value, reader.CurrentNode.ReadConventAsDateTimeOffset());
                break;

            case Asn1Type.Integer:
                Assert.AreEqual(value, reader.CurrentNode.ReadContentAsBigInteger());
                break;

            case Asn1Type.Boolean:
                Assert.AreEqual(value, reader.CurrentNode.ReadContentAsBoolean());
                break;

            default:
                Assert.AreEqual(value, reader.CurrentNode.RawValue);
                break;
            }

            reader.Read();
        }
Пример #2
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);
        }
Пример #3
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);
        }