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); } } }
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()); }