internal static bool TryParse(byte[] data, BinaryReader reader, out NtlmAuthenticationToken token) { token = null; if (!NtlmUtils.TryParseStringValues(reader, out int target_name_length, out int target_name_position)) { return(false); } NtlmNegotiateFlags flags = (NtlmNegotiateFlags)reader.ReadInt32(); byte[] server_challenge = reader.ReadBytes(8); if (server_challenge.Length < 8) { return(false); } byte[] reserved = reader.ReadBytes(8); if (reserved.Length < 8) { return(false); } if (!NtlmUtils.TryParseStringValues(reader, out int target_info_length, out int target_info_position)) { return(false); } if (!NtlmUtils.TryParse(reader, out Version version)) { return(false); } string target_name = string.Empty; if (flags.HasFlagSet(NtlmNegotiateFlags.RequestTarget)) { if (!NtlmUtils.ParseString(flags, data, target_name_length, target_name_position, out target_name)) { return(false); } } IEnumerable <NtlmAvPair> pairs = new NtlmAvPair[0]; if (flags.HasFlagSet(NtlmNegotiateFlags.TargetInfo)) { if (!NtlmUtils.ParseBytes(data, target_info_length, target_info_position, out byte[] target_info))
internal static bool TryParseAvPairs(BinaryReader reader, out List <NtlmAvPair> av_pairs) { av_pairs = new List <NtlmAvPair>(); while (reader.RemainingLength() > 0) { if (!NtlmAvPair.TryParse(reader, out NtlmAvPair pair)) { return(false); } if (pair.Type == MsAvPairType.EOL) { break; } av_pairs.Add(pair); } return(true); }
internal static bool TryParse(BinaryReader reader, out NtlmAvPair av_pair) { av_pair = null; if (reader.RemainingLength() < 4) { return(false); } MsAvPairType type = (MsAvPairType)reader.ReadInt16(); int length = reader.ReadUInt16(); if (reader.RemainingLength() < length) { return(false); } switch (type) { case MsAvPairType.DnsComputerName: case MsAvPairType.DnsDomainName: case MsAvPairType.DnsTreeName: case MsAvPairType.NbComputerName: case MsAvPairType.NbDomainName: case MsAvPairType.TargetName: if ((length % 1) != 0) { return(false); } av_pair = new NtlmAvPairString(type, Encoding.Unicode.GetString(reader.ReadBytes(length))); break; case MsAvPairType.Timestamp: if (length != 8) { return(false); } av_pair = new NtlmAvPairTimestamp(type, reader.ReadInt64()); break; case MsAvPairType.Flags: if (length != 4) { return(false); } av_pair = new NtlmAvPairFlags(type, reader.ReadInt32()); break; case MsAvPairType.SingleHost: if (length != 48) { return(false); } reader.ReadInt32(); uint z4 = reader.ReadUInt32(); byte[] custom_data = reader.ReadBytes(8); byte[] machine_id = reader.ReadBytes(32); av_pair = new NtlmAvPairSingleHostData(type, z4, custom_data, machine_id); break; default: av_pair = new NtlmAvPairBytes(type, reader.ReadBytes(length)); break; } return(true); }