public NTLMScheme(NTLMEngine engine) : base()
 {
     Args.NotNull(engine, "NTLM engine");
     this.engine    = engine;
     this.state     = NTLMScheme.State.Uninitiated;
     this.challenge = null;
 }
 /// <exception cref="Apache.Http.Auth.MalformedChallengeException"></exception>
 protected internal override void ParseChallenge(CharArrayBuffer buffer, int beginIndex
                                                 , int endIndex)
 {
     this.challenge = buffer.SubstringTrimmed(beginIndex, endIndex);
     if (this.challenge.Length == 0)
     {
         if (this.state == NTLMScheme.State.Uninitiated)
         {
             this.state = NTLMScheme.State.ChallengeReceived;
         }
         else
         {
             this.state = NTLMScheme.State.Failed;
         }
     }
     else
     {
         if (this.state.CompareTo(NTLMScheme.State.MsgType1Generated) < 0)
         {
             this.state = NTLMScheme.State.Failed;
             throw new MalformedChallengeException("Out of sequence NTLM response message");
         }
         else
         {
             if (this.state == NTLMScheme.State.MsgType1Generated)
             {
                 this.state = NTLMScheme.State.MsgType2Recevied;
             }
         }
     }
 }
        /// <exception cref="Apache.Http.Auth.AuthenticationException"></exception>
        public override Header Authenticate(Credentials credentials, IHttpRequest request
                                            )
        {
            NTCredentials ntcredentials = null;

            try
            {
                ntcredentials = (NTCredentials)credentials;
            }
            catch (InvalidCastException)
            {
                throw new InvalidCredentialsException("Credentials cannot be used for NTLM authentication: "
                                                      + credentials.GetType().FullName);
            }
            string response = null;

            if (this.state == NTLMScheme.State.Failed)
            {
                throw new AuthenticationException("NTLM authentication failed");
            }
            else
            {
                if (this.state == NTLMScheme.State.ChallengeReceived)
                {
                    response = this.engine.GenerateType1Msg(ntcredentials.GetDomain(), ntcredentials.
                                                            GetWorkstation());
                    this.state = NTLMScheme.State.MsgType1Generated;
                }
                else
                {
                    if (this.state == NTLMScheme.State.MsgType2Recevied)
                    {
                        response = this.engine.GenerateType3Msg(ntcredentials.GetUserName(), ntcredentials
                                                                .GetPassword(), ntcredentials.GetDomain(), ntcredentials.GetWorkstation(), this.
                                                                challenge);
                        this.state = NTLMScheme.State.MsgType3Generated;
                    }
                    else
                    {
                        throw new AuthenticationException("Unexpected state: " + this.state);
                    }
                }
            }
            CharArrayBuffer buffer = new CharArrayBuffer(32);

            if (IsProxy())
            {
                buffer.Append(AUTH.ProxyAuthResp);
            }
            else
            {
                buffer.Append(AUTH.WwwAuthResp);
            }
            buffer.Append(": NTLM ");
            buffer.Append(response);
            return(new BufferedHeader(buffer));
        }