using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using NSspi.Buffers; using NSspi.Credentials; namespace NSspi.Contexts { public class ServerContext : Context { private ContextAttrib requestedAttribs; private ContextAttrib finalAttribs; public ServerContext(ServerCredential cred, ContextAttrib requestedAttribs) : base ( cred ) { this.requestedAttribs = requestedAttribs; this.finalAttribs = ContextAttrib.Zero; } public SecurityStatus AcceptToken( byte[] clientToken, out byte[] nextToken ) { SecureBuffer clientBuffer = new SecureBuffer( clientToken, BufferType.Token ); SecureBuffer outBuffer = new SecureBuffer( new byte[12288], BufferType.Token ); SecurityStatus status; long expiry = 0; SecureBufferAdapter clientAdapter; SecureBufferAdapter outAdapter; using ( clientAdapter = new SecureBufferAdapter( clientBuffer ) ) { using ( outAdapter = new SecureBufferAdapter( outBuffer ) ) { if( this.ContextHandle.IsInvalid ) { status = ContextNativeMethods.AcceptSecurityContext_1( ref this.Credential.Handle.rawHandle, IntPtr.Zero, clientAdapter.Handle, requestedAttribs, SecureBufferDataRep.Network, ref this.ContextHandle.rawHandle, outAdapter.Handle, ref this.finalAttribs, ref expiry ); } else { status = ContextNativeMethods.AcceptSecurityContext_2( ref this.Credential.Handle.rawHandle, ref this.ContextHandle.rawHandle, clientAdapter.Handle, requestedAttribs, SecureBufferDataRep.Network, ref this.ContextHandle.rawHandle, outAdapter.Handle, ref this.finalAttribs, ref expiry ); } } } if ( status == SecurityStatus.OK ) { nextToken = null; this.Initialized = true; if ( outBuffer.Length != 0 ) { nextToken = new byte[outBuffer.Length]; Array.Copy( outBuffer.Buffer, nextToken, nextToken.Length ); } else { nextToken = null; } } else if ( status == SecurityStatus.ContinueNeeded ) { this.Initialized = false; nextToken = new byte[outBuffer.Length]; Array.Copy( outBuffer.Buffer, nextToken, nextToken.Length ); } else { throw new SSPIException( "Failed to call AcceptSecurityContext", status ); } return status; } } }