private IAsn1Element ParseSequence(Asn1ParsedElement element) { using (var dataStream = new MemoryStream(element.Data)) { var childElements = Parse(dataStream).ToArray(); var sequence = new Sequence(childElements); return(sequence); } }
private IAsn1Element ParseSequence(Asn1ParsedElement element) { using (var dataStream = new MemoryStream(element.Data)) { var childElements = Parse(dataStream).ToArray(); var sequence = new Sequence(childElements); return sequence; } }
private static Asn1ParsedElement GetAsn1ParsedElement(BinaryReader reader) { var tag = reader.ReadByte(); uint length = (uint)reader.ReadByte(); if (length > 128) { length = length - 128; switch (length) { case 1: length = reader.ReadByte(); break; case 2: length = (uint)reader.ReadByte() * 256 + (uint)reader.ReadByte(); break; case 3: length = (uint)reader.ReadByte() * 256 * 256 + (uint)reader.ReadByte() * 256 + (uint)reader.ReadByte(); break; case 4: length = (uint)reader.ReadByte() * 256 * 256 * 256 + (uint)reader.ReadByte() * 256 * 256 + (uint)reader.ReadByte() * 256 + (uint)reader.ReadByte(); break; default: throw new NotImplementedException( "asn elements with more than 4 length bytes are not supported"); } } if (length > int.MaxValue) { throw new NotImplementedException("asn elements with length > int.MaxValue are not supported"); } var data = new byte[length]; reader.Read(data, 0, (int)length); var element = new Asn1ParsedElement() { Tag = tag, Data = data }; return(element); }
private IAsn1Element ParseInteger(Asn1ParsedElement element) { if (element.Data.Length == 0) { return(new Integer(new byte[0])); } if (element.Data[0] == 0) { if (element.Data.Length == 1) { return(new Integer(new byte[] { 0 })); } if (element.Data[1] <= 127) { return(new Integer(element.Data)); } return(new Integer(element.Data.Skip(1).ToArray())); } return(new Integer(element.Data)); }
private IAsn1Element ParseInteger(Asn1ParsedElement element) { if (element.Data.Length == 0) { return new Integer(new byte[0]); } if (element.Data[0] == 0) { if (element.Data.Length == 1) { return new Integer(new byte[] { 0 }); } if (element.Data[1] <= 127) { return new Integer(element.Data); } return new Integer(element.Data.Skip(1).ToArray()); } return new Integer(element.Data); }
private IAsn1Element ParseOctetString(Asn1ParsedElement element) { return(new OctetString(element.Data)); }
private static Asn1ParsedElement GetAsn1ParsedElement(BinaryReader reader) { var tag = reader.ReadByte(); uint length = (uint) reader.ReadByte(); if (length > 128) { length = length - 128; switch (length) { case 1: length = reader.ReadByte(); break; case 2: length = (uint)reader.ReadByte() * 256 + (uint)reader.ReadByte(); break; case 3: length = (uint)reader.ReadByte() * 256 * 256 + (uint)reader.ReadByte() * 256 + (uint)reader.ReadByte(); break; case 4: length = (uint)reader.ReadByte() * 256 * 256 * 256 + (uint)reader.ReadByte() * 256 * 256 + (uint)reader.ReadByte() * 256 + (uint)reader.ReadByte(); break; default: throw new NotImplementedException( "asn elements with more than 4 length bytes are not supported"); } } if (length > int.MaxValue) { throw new NotImplementedException("asn elements with length > int.MaxValue are not supported"); } var data = new byte[length]; reader.Read(data, 0, (int) length); var element = new Asn1ParsedElement() {Tag = tag, Data = data}; return element; }
private IAsn1Element ParseOctetString(Asn1ParsedElement element) { return new OctetString(element.Data); }