public static DERValue ReadValue(this BinaryReader reader, long offset)
        {
            DERValue ret = new DERValue();

            ret.Offset = offset + reader.BaseStream.Position;
            byte id = reader.ReadByte();

            ret.Type        = (DERTagType)(id >> 6);
            ret.Constructed = (id & 0x20) != 0;
            ret.Tag         = id & 0x1F;
            if (ret.Tag == 0x1F)
            {
                ret.Tag = reader.ReadEncodedInt();
            }
            // TODO: Handle indefinite length?
            int length = reader.ReadLength();

            ret.DataOffset = offset + reader.BaseStream.Position;
            ret.Data       = reader.ReadBytes(length);
            if (ret.Data.Length != length)
            {
                throw new EndOfStreamException();
            }
            return(ret);
        }
        private static void DumpValue(StringBuilder builder, DERValue v, int depth)
        {
            builder.AppendFormat("{0} {1:X}/{1} {2} {3} {4} {5:X}", new string(' ', depth * 2),
                                 v.Offset, v.Type, v.Constructed, v.FormatTag(), v.FormatValue());
            builder.AppendLine();

            if (v.Children != null)
            {
                foreach (var c in v.Children)
                {
                    DumpValue(builder, c, depth + 1);
                }
            }
        }
Esempio n. 3
0
        private static DERValue[] ParseData(long offset, byte[] data, int index)
        {
            MemoryStream stm = new MemoryStream();

            stm.Write(data, index, data.Length - index);
            stm.Position = 0;
            BinaryReader    reader = new BinaryReader(stm);
            List <DERValue> values = new List <DERValue>();

            while (reader.RemainingLength() > 0)
            {
                DERValue v = reader.ReadValue(offset);
                if (v.Constructed)
                {
                    v.Children = ParseData(v.DataOffset, v.Data, 0);
                }
                values.Add(v);
            }
            return(values.ToArray());
        }