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))
Exemplo n.º 2
0
 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);
 }
Exemplo n.º 3
0
        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);
        }