internal static byte[] Encrypt( SafeGssContextHandle context, bool encrypt, byte[] buffer, int offset, int count) { Debug.Assert((buffer != null) && (buffer.Length > 0), "Invalid input buffer passed to Encrypt"); Debug.Assert((offset >= 0) && (offset < buffer.Length), "Invalid input offset passed to Encrypt"); Debug.Assert((count >= 0) && (count <= (buffer.Length - offset)), "Invalid input count passed to Encrypt"); Interop.NetSecurityNative.GssBuffer encryptedBuffer = default(Interop.NetSecurityNative.GssBuffer); try { NetSecurityNative.Status minorStatus; NetSecurityNative.Status status = NetSecurityNative.WrapBuffer(out minorStatus, context, encrypt, buffer, offset, count, ref encryptedBuffer); if (status != NetSecurityNative.Status.GSS_S_COMPLETE) { throw new NetSecurityNative.GssApiException(status, minorStatus); } return encryptedBuffer.ToByteArray(); } finally { encryptedBuffer.Dispose(); } }
private static int GssUnwrap( SafeGssContextHandle context, byte[] buffer, int offset, int count) { Debug.Assert((buffer != null) && (buffer.Length > 0), "Invalid input buffer passed to Decrypt"); Debug.Assert((offset >= 0) && (offset <= buffer.Length), "Invalid input offset passed to Decrypt"); Debug.Assert((count >= 0) && (count <= (buffer.Length - offset)), "Invalid input count passed to Decrypt"); Interop.NetSecurityNative.GssBuffer decryptedBuffer = default(Interop.NetSecurityNative.GssBuffer); try { Interop.NetSecurityNative.Status minorStatus; Interop.NetSecurityNative.Status status = Interop.NetSecurityNative.UnwrapBuffer(out minorStatus, context, buffer, offset, count, ref decryptedBuffer); if (status != Interop.NetSecurityNative.Status.GSS_S_COMPLETE) { throw new Interop.NetSecurityNative.GssApiException(status, minorStatus); } return decryptedBuffer.Copy(buffer, offset); } finally { decryptedBuffer.Dispose(); } }
internal static extern Status InitSecContext( out Status minorStatus, SafeGssCredHandle initiatorCredHandle, ref SafeGssContextHandle contextHandle, bool isNtlm, SafeGssNameHandle targetName, uint reqFlags, byte[] inputBytes, int inputLength, ref GssBuffer token, out uint retFlags);
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; }
protected override void Dispose(bool disposing) { if (disposing) { if (null != _context) { _context.Dispose(); _context = null; } if (_targetName != null) { _targetName.Dispose(); _targetName = null; } } base.Dispose(disposing); }
private static bool EstablishSecurityContext( ref SafeGssContextHandle context, byte[] buffer, out byte[] outputBuffer) { outputBuffer = null; // 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.AcceptSecContext(out minorStatus, ref context, buffer, (buffer == null) ? 0 : buffer.Length, ref token); 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; }
public void SetGssContext(SafeGssContextHandle context) { Debug.Assert(context != null && !context.IsInvalid, "Invalid context passed to SafeDeleteNegoContext"); _context = context; }
private static extern Status Wrap( out Status minorStatus, SafeGssContextHandle contextHandle, bool isEncrypt, byte[] inputBytes, int offset, int count, ref GssBuffer outBuffer);
internal static extern Status AcceptSecContext( out Status minorStatus, ref SafeGssContextHandle acceptContextHandle, byte[] inputBytes, int inputLength, ref GssBuffer token);
internal static Status UnwrapBuffer( out Status minorStatus, SafeGssContextHandle contextHandle, byte[] inputBytes, int offset, int count, ref GssBuffer outBuffer) { Debug.Assert(inputBytes != null, "inputBytes must be valid value"); Debug.Assert(offset >= 0 && offset <= inputBytes.Length, "offset must be valid"); Debug.Assert(count >= 0 && count <= inputBytes.Length, "count must be valid"); return Unwrap(out minorStatus, contextHandle, inputBytes, offset, count, ref outBuffer); }
private static byte[] WrapMessage(SafeGssContextHandle context, byte[] message) { Interop.NetSecurityNative.GssBuffer wrapped = default(Interop.NetSecurityNative.GssBuffer); Interop.NetSecurityNative.Status status; try { Interop.NetSecurityNative.Status minorStatus; status = Interop.NetSecurityNative.WrapBuffer(out minorStatus, context, false, message, 0, message.Length, ref wrapped); if (status != Interop.NetSecurityNative.Status.GSS_S_COMPLETE) { throw new Interop.NetSecurityNative.GssApiException(status, minorStatus); } return wrapped.ToByteArray(); } finally { wrapped.Dispose(); } }