System.Net.Security.NegotiateStreamPal.GssInitSecurityContext C# (CSharp) Method

GssInitSecurityContext() private static method

private static GssInitSecurityContext ( Microsoft.Win32.SafeHandles.SafeGssContextHandle &context, Microsoft.Win32.SafeHandles.SafeGssCredHandle credential, bool isNtlm, Microsoft.Win32.SafeHandles.SafeGssNameHandle targetName, Interop inFlags, byte buffer, byte &outputBuffer, uint &outFlags, int &isNtlmUsed ) : bool
context Microsoft.Win32.SafeHandles.SafeGssContextHandle
credential Microsoft.Win32.SafeHandles.SafeGssCredHandle
isNtlm bool
targetName Microsoft.Win32.SafeHandles.SafeGssNameHandle
inFlags Interop
buffer byte
outputBuffer byte
outFlags uint
isNtlmUsed int
return bool
        private static bool GssInitSecurityContext(
            ref SafeGssContextHandle context,
            SafeGssCredHandle credential,
            bool isNtlm,
            SafeGssNameHandle targetName,
            Interop.NetSecurityNative.GssFlags inFlags,
            byte[] buffer,
            out byte[] outputBuffer,
            out uint outFlags,
            out int isNtlmUsed)
        {
            outputBuffer = null;
            outFlags = 0;

            // EstablishSecurityContext is called multiple times in a session.
            // In each call, we need to pass the context handle from the previous call.
            // For the first call, the context handle will be null.
            if (context == null)
            {
                context = new SafeGssContextHandle();
            }

            Interop.NetSecurityNative.GssBuffer token = default(Interop.NetSecurityNative.GssBuffer);
            Interop.NetSecurityNative.Status status;

            try
            {
                Interop.NetSecurityNative.Status minorStatus;
                status = Interop.NetSecurityNative.InitSecContext(out minorStatus,
                                                          credential,
                                                          ref context,
                                                          isNtlm,
                                                          targetName,
                                                          (uint)inFlags,
                                                          buffer,
                                                          (buffer == null) ? 0 : buffer.Length,
                                                          ref token,
                                                          out outFlags,
                                                          out isNtlmUsed);

                if ((status != Interop.NetSecurityNative.Status.GSS_S_COMPLETE) && (status != Interop.NetSecurityNative.Status.GSS_S_CONTINUE_NEEDED))
                {
                    throw new Interop.NetSecurityNative.GssApiException(status, minorStatus);
                }

                outputBuffer = token.ToByteArray();
            }
            finally
            {
                token.Dispose();
            }

            return status == Interop.NetSecurityNative.Status.GSS_S_COMPLETE;
        }