Example #1
0
        private static Asn1Node ReadUniversalNode(Asn1UniversalNodeType type, Asn1TagForm tagForm, Stream stream)
        {
            switch (type)
            {
            case Asn1UniversalNodeType.Boolean: return(Asn1Boolean.ReadFrom(stream));

            case Asn1UniversalNodeType.Integer: return(Asn1Integer.ReadFrom(stream));

            case Asn1UniversalNodeType.BitString: return(Asn1BitString.ReadFrom(stream));

            case Asn1UniversalNodeType.OctetString: return(Asn1OctetString.ReadFrom(stream));

            case Asn1UniversalNodeType.Null: return(Asn1Null.ReadFrom(stream));

            case Asn1UniversalNodeType.ObjectId: return(Asn1ObjectIdentifier.ReadFrom(stream));

            case Asn1UniversalNodeType.Utf8String: return(Asn1Utf8String.ReadFrom(stream));

            case Asn1UniversalNodeType.PrintableString: return(Asn1PrintableString.ReadFrom(stream));

            case Asn1UniversalNodeType.Ia5String: return(Asn1Ia5String.ReadFrom(stream));

            case Asn1UniversalNodeType.UtcTime: return(Asn1UtcTime.ReadFrom(stream));

            case Asn1UniversalNodeType.Sequence: return(Asn1Sequence.ReadFrom(stream));

            case Asn1UniversalNodeType.Set: return(Asn1Set.ReadFrom(stream));

            default:
                throw new NotSupportedException($"unsupported universal type {type}");
            }
        }
Example #2
0
        public static Asn1DynamicArray ReadFrom(Asn1UniversalNodeType type, Stream stream)
        {
            Asn1DynamicArray array = new Asn1DynamicArray(type);
            Asn1Node         node;

            while ((node = Asn1Node.ReadNode(stream)) != null)
            {
                array.Nodes.Add(node);
            }
            return(array);
        }
Example #3
0
        public static Asn1CustomNode ReadFrom(Asn1UniversalNodeType type, Asn1TagForm tagForm, Stream stream)
        {
            if (tagForm == Asn1TagForm.Primitive)
            {
                var data = new byte[stream.Length];
                stream.Read(data, 0, data.Length);

                return(new Asn1CustomNode((int)type, tagForm)
                {
                    Data = data
                });
            }
            else
            {
                var res = new Asn1CustomNode((int)type, tagForm);
                res.ReadChildren(stream);
                return(res);
            }
        }
Example #4
0
        public static Asn1Node ReadNode(Stream stream)
        {
            var identifier                 = stream.ReadByte();
            Asn1UniversalNodeType type     = (Asn1UniversalNodeType)(identifier & 0x1f);
            Asn1TagClass          tagClass = (Asn1TagClass)(identifier >> 6);
            Asn1TagForm           tagForm  = (Asn1TagForm)((identifier >> 5) & 1);
            int?length = ReadTagLength(stream);

            if (identifier == 0 && length == 0)
            {
                return(null);                                   // EOC detected
            }
            if (length > stream.Length)
            {
                throw new Asn1ParsingException($"Try to read more bytes from stream than exists {length} > {stream.Length}");
            }
            if (length != null)
            {
                var data = new byte[(int)length];
                stream.Read(data, 0, (int)length);
                stream = new MemoryStream(data);
                if (tagClass == Asn1TagClass.Universal)
                {
                    var tag = ReadUniversalNode(type, tagForm, stream);
                    tag.TagClass = tagClass;
                    return(tag);
                }
                else
                {
                    var tag = Asn1CustomNode.ReadFrom(type, tagForm, stream);
                    tag.TagClass = tagClass;
                    return(tag);
                }
            }
            else
            {
                // We must just keep on reading the stream rather than keeping a separate memory buffer
                Asn1DynamicArray tag = Asn1DynamicArray.ReadFrom(type, stream);
                tag.TagClass = tagClass;
                return(tag);
            }
        }
Example #5
0
 public bool Is(Asn1UniversalNodeType nodeType)
 {
     return(TagClass == Asn1TagClass.Universal && NodeType == nodeType);
 }
Example #6
0
 public Asn1DynamicArray(Asn1UniversalNodeType type)
 {
     _type = type;
 }