internal static int InitializeSecurityContext(ref SecurityHandle credential, ref SecurityHandle context, string targetName, int requirements, Endianness datarep, SecurityBufferClass inputBuffer, ref SecurityHandle newContext, SecurityBufferClass outputBuffer, ref int attributes, ref long timestamp)
        {
            SecurityBufferClass[] inputBuffers = null;
            SecurityBufferClass[] array        = null;
            if (inputBuffer != null)
            {
                inputBuffers = new SecurityBufferClass[]
                {
                    inputBuffer
                };
            }
            if (outputBuffer != null)
            {
                array = new SecurityBufferClass[]
                {
                    outputBuffer
                };
            }
            int result = SSPIWrapper.InitializeSecurityContext(ref credential, ref context, targetName, requirements, datarep, inputBuffers, ref newContext, array, ref attributes, ref timestamp);

            outputBuffer.type  = array[0].type;
            outputBuffer.size  = array[0].size;
            outputBuffer.token = array[0].token;
            return(result);
        }
        public byte[] GetOutgoingBlob(byte[] incomingBlob, out bool handshakeComplete)
        {
            handshakeComplete = true;
            if (this.m_SecurityContext.Handle.Initialized && incomingBlob == null)
            {
                return(null);
            }
            SecurityBufferClass inputBuffer = null;

            if (incomingBlob != null)
            {
                inputBuffer = new SecurityBufferClass(incomingBlob, BufferType.Token);
            }
            SecurityBufferClass securityBufferClass = new SecurityBufferClass(this.m_TokenSize, BufferType.Token);
            int num  = SSPIWrapper.InitializeSecurityContext(ref this.m_CredentialsHandle.Handle, ref this.m_SecurityContext.Handle, this.m_RemotePeerId, (int)this.m_RequestedFlags, this.m_Endianness, inputBuffer, ref this.m_SecurityContext.Handle, securityBufferClass, ref this.m_ContextFlags, ref this.m_SecurityContext.TimeStamp);
            int num2 = num & -2147483648;

            if (num2 != 0)
            {
                throw new Win32Exception(num);
            }
            if (num != 0 && this.m_SecurityContext.Handle.Initialized)
            {
                handshakeComplete = false;
            }
            else
            {
                switch (this.m_SecurityContext.SecurityContextMode)
                {
                case SecurityContextMode.stream:
                    this.CheckIfFlagWasObtainedIfRequested(ContextFlags.Stream);
                    break;
                }
                this.CheckIfFlagWasObtainedIfRequested(ContextFlags.MutualAuth);
                this.CheckIfFlagWasObtainedIfRequested(ContextFlags.ReplayDetect);
                this.CheckIfFlagWasObtainedIfRequested(ContextFlags.SequenceDetect);
                this.CheckIfFlagWasObtainedIfRequested(ContextFlags.Confidentiality);
            }
            return(securityBufferClass.token);
        }