internal static bool Parse(byte[] data, out KerberosChecksum checksum) { checksum = null; try { KerberosChecksumGSSApi ret = new KerberosChecksumGSSApi(KerberosChecksumType.GSSAPI, data); BinaryReader reader = new BinaryReader(new MemoryStream(data)); int binding_length = reader.ReadInt32(); ret.ChannelBinding = reader.ReadAllBytes(binding_length); ret.ContextFlags = (KerberosChecksumGSSApiFlags)reader.ReadInt32(); if (ret.ContextFlags.HasFlagSet(KerberosChecksumGSSApiFlags.Delegate)) { ret.DelegationOptionIdentifier = reader.ReadInt32(); int cred_length = reader.ReadInt32(); ret.KerbCredential = reader.ReadAllBytes(cred_length); } if (reader.RemainingLength() > 0) { ret.Extensions = reader.ReadToEnd(); } checksum = ret; return(true); } catch (EndOfStreamException) { } return(false); }
internal static KerberosChecksum Parse(DERValue value) { if (!value.CheckSequence()) { throw new InvalidDataException(); } KerberosChecksumType type = 0; byte[] data = null; foreach (var next in value.Children) { if (next.Type != DERTagType.ContextSpecific) { throw new InvalidDataException(); } switch (next.Tag) { case 0: type = (KerberosChecksumType)next.ReadChildInteger(); break; case 1: data = next.ReadChildOctetString(); break; default: throw new InvalidDataException(); } } if (type == 0 || data == null) { throw new InvalidDataException(); } if (type == KerberosChecksumType.GSSAPI && KerberosChecksumGSSApi.Parse(data, out KerberosChecksum chksum)) { return(chksum); } return(new KerberosChecksum(type, data)); }