public static bool IsClientResponseValid(byte[] message, ref State state)
        {
            Common.SecurityBufferDesciption ClientToken = new Common.SecurityBufferDesciption(message);
            Common.SecurityBufferDesciption ServerToken = new Common.SecurityBufferDesciption(Common.MaximumTokenSize);

            try
            {
                int result;

                result = AcceptSecurityContext(ref state.Credentials,                   // [in] handle to the credentials
                                               ref state.Context,                       // [in/out] handle of partially formed context.  Always NULL the first time through
                                               ref ClientToken,                         // [in] pointer to the input buffers
                                               Common.StandardContextAttributes,        // [in] required context attributes
                                               Common.SecurityNativeDataRepresentation, // [in] data representation on the target
                                               out state.Context,                       // [in/out] receives the new context handle
                                               out ServerToken,                         // [in/out] pointer to the output buffers
                                               out Common.NewContextAttributes,         // [out] receives the context attributes
                                               out Common.NewLifeTime);                 // [out] receives the life span of the security context

                if (result != Common.SuccessfulResult)
                {
                    return(false);
                }
            }
            finally
            {
                ClientToken.Dispose();
                ServerToken.Dispose();
            }

            return(true);
        }
        public static bool IsClientResponseValid(byte[] message, ref State state)
        {
            Common.SecurityBufferDesciption ClientToken = new Common.SecurityBufferDesciption(message);
            Common.SecurityBufferDesciption ServerToken = new Common.SecurityBufferDesciption(Common.MaximumTokenSize);

            try
            {
                int result;

                result = AcceptSecurityContext(ref state.Credentials,   // [in] handle to the credentials
                    ref state.Context,                                  // [in/out] handle of partially formed context.  Always NULL the first time through
                    ref ClientToken,                                    // [in] pointer to the input buffers
                    Common.StandardContextAttributes,                   // [in] required context attributes
                    Common.SecurityNativeDataRepresentation,            // [in] data representation on the target
                    out state.Context,                                  // [in/out] receives the new context handle    
                    out ServerToken,                                    // [in/out] pointer to the output buffers
                    out Common.NewContextAttributes,                    // [out] receives the context attributes        
                    out Common.NewLifeTime);                            // [out] receives the life span of the security context

                if (result != Common.SuccessfulResult)
                {
                    return false;
                }
            }
            finally
            {
                ClientToken.Dispose();
                ServerToken.Dispose();
            }

            return true;
        }
 public static extern int AcceptSecurityContext(ref Common.SecurityHandle phCredential,
                                                ref Common.SecurityHandle phContext,
                                                ref Common.SecurityBufferDesciption pInput,
                                                uint fContextReq,
                                                uint TargetDataRep,
                                                out Common.SecurityHandle phNewContext,
                                                out Common.SecurityBufferDesciption pOutput,
                                                out uint pfContextAttr, //managed ulong == 64 bits!!!
                                                out Common.SecurityInteger ptsTimeStamp);
        public static bool IsServerChallengeAcquired(ref byte[] message, out State state)
        {
            Common.SecurityBufferDesciption ClientToken = new Common.SecurityBufferDesciption(message);
            Common.SecurityBufferDesciption ServerToken = new Common.SecurityBufferDesciption(Common.MaximumTokenSize);

            try
            {
                int result;

                state = new State();

                result = AcquireCredentialsHandle(WindowsIdentity.GetCurrent().Name,
                                                  "NTLM",
                                                  Common.SecurityCredentialsInbound,
                                                  IntPtr.Zero,
                                                  IntPtr.Zero,
                                                  0,
                                                  IntPtr.Zero,
                                                  ref state.Credentials,
                                                  ref Common.NewLifeTime);

                if (result != Common.SuccessfulResult)
                {
                    // Credentials acquire operation failed.
                    return(false);
                }

                result = AcceptSecurityContext(ref state.Credentials,                   // [in] handle to the credentials
                                               IntPtr.Zero,                             // [in/out] handle of partially formed context.  Always NULL the first time through
                                               ref ClientToken,                         // [in] pointer to the input buffers
                                               Common.StandardContextAttributes,        // [in] required context attributes
                                               Common.SecurityNativeDataRepresentation, // [in] data representation on the target
                                               out state.Context,                       // [in/out] receives the new context handle
                                               out ServerToken,                         // [in/out] pointer to the output buffers
                                               out Common.NewContextAttributes,         // [out] receives the context attributes
                                               out Common.NewLifeTime);                 // [out] receives the life span of the security context

                if (result != Common.IntermediateResult)
                {
                    // Client challenge issue operation failed.
                    return(false);
                }
            }
            finally
            {
                message = ServerToken.GetBytes();

                ClientToken.Dispose();
                ServerToken.Dispose();
            }

            return(true);
        }
        public static bool IsServerChallengeAcquired(ref byte[] message, out State state)
        {
            Common.SecurityBufferDesciption ClientToken = new Common.SecurityBufferDesciption(message);
            Common.SecurityBufferDesciption ServerToken = new Common.SecurityBufferDesciption(Common.MaximumTokenSize);

            try
            {
                int result;

                state = new State();

                result = AcquireCredentialsHandle(WindowsIdentity.GetCurrent().Name,
                    "NTLM",
                    Common.SecurityCredentialsInbound,
                    IntPtr.Zero,
                    IntPtr.Zero,
                    0,
                    IntPtr.Zero,
                    ref state.Credentials,
                    ref Common.NewLifeTime);

                if (result != Common.SuccessfulResult)
                {
                    // Credentials acquire operation failed.
                    return false;
                }

                result = AcceptSecurityContext(ref state.Credentials,   // [in] handle to the credentials
                    IntPtr.Zero,                                        // [in/out] handle of partially formed context.  Always NULL the first time through
                    ref ClientToken,                                    // [in] pointer to the input buffers
                    Common.StandardContextAttributes,                   // [in] required context attributes
                    Common.SecurityNativeDataRepresentation,            // [in] data representation on the target
                    out state.Context,                                  // [in/out] receives the new context handle    
                    out ServerToken,                                    // [in/out] pointer to the output buffers
                    out Common.NewContextAttributes,                    // [out] receives the context attributes        
                    out Common.NewLifeTime);                            // [out] receives the life span of the security context

                if (result != Common.IntermediateResult)
                {
                    // Client challenge issue operation failed.
                    return false;
                }
            }
            finally
            {
                message = ServerToken.GetBytes();

                ClientToken.Dispose();
                ServerToken.Dispose();
            }

            return true;
        }