internal static ExportedSecurityContext ExportContext(SecHandle context, SecPkgContextExportFlags export_flags, string package, bool client) { if (context is null) { throw new ArgumentNullException(nameof(context)); } SecBuffer buffer = new SecBuffer() { BufferType = SecurityBufferType.Empty }; try { SecurityNativeMethods.ExportSecurityContext(context, export_flags, buffer, out SafeKernelObjectHandle token).CheckResult(); return(new ExportedSecurityContext(package, buffer.ToArray(), !token.IsInvalid ? NtToken.FromHandle(token) : null, client)); } finally { if (buffer.pvBuffer != IntPtr.Zero) { SecurityNativeMethods.FreeContextBuffer(buffer.pvBuffer); } } }
/// <summary> /// Get an authentication package by name. /// </summary> /// <param name="package">The name of the package.</param> /// <returns>The authentication package.</returns> public static AuthenticationPackage FromName(string package) { SecurityNativeMethods.QuerySecurityPackageInfo(package, out IntPtr package_info).CheckResult(); try { return(new AuthenticationPackage((SecPkgInfo)Marshal.PtrToStructure(package_info, typeof(SecPkgInfo)))); } finally { SecurityNativeMethods.FreeContextBuffer(package_info); } }
internal override void FromBuffer(SecBuffer buffer) { if (buffer.pvBuffer == IntPtr.Zero) { _array = new byte[0]; return; } _array = new byte[buffer.cbBuffer]; Marshal.Copy(buffer.pvBuffer, _array, 0, _array.Length); SecurityNativeMethods.FreeContextBuffer(buffer.pvBuffer); buffer.pvBuffer = IntPtr.Zero; _type = buffer.BufferType; }
internal static byte[] GetSessionKey(SecHandle context) { using (var buffer = new SafeStructureInOutBuffer <SecPkgContext_SessionKey>()) { var result = SecurityNativeMethods.QueryContextAttributesEx(context, SECPKG_ATTR.SESSION_KEY, buffer, buffer.Length); if (result == SecStatusCode.SUCCESS) { byte[] ret = new byte[buffer.Result.SessionKeyLength]; Marshal.Copy(buffer.Result.SessionKey, ret, 0, ret.Length); SecurityNativeMethods.FreeContextBuffer(buffer.Result.SessionKey); return(ret); } } return(new byte[0]); }
private string GetTargetName() { var target = SecurityContextUtils.QueryContextAttributeNoThrow <SecPkgContext_ClientSpecifiedTarget>(_context, SECPKG_ATTR.CLIENT_SPECIFIED_TARGET); if (target.Item2 == SecStatusCode.SUCCESS) { try { return(Marshal.PtrToStringUni(target.Item1.sTargetName)); } finally { SecurityNativeMethods.FreeContextBuffer(target.Item1.sTargetName); } } return(string.Empty); }
/// <summary> /// Get authentication packages. /// </summary> /// <returns>The list of authentication packages.</returns> public static IEnumerable <AuthenticationPackage> Get() { List <AuthenticationPackage> packages = new List <AuthenticationPackage>(); if (SecurityNativeMethods.EnumerateSecurityPackages(out int count, out IntPtr ppPackageInfo) == SecStatusCode.SUCCESS) { try { packages.AddRange(ppPackageInfo.ReadArray <SecPkgInfo>(count).Select(p => new AuthenticationPackage(p))); } finally { SecurityNativeMethods.FreeContextBuffer(ppPackageInfo); } } return(packages.AsReadOnly()); }
/// <summary> /// Get authentication packages. /// </summary> /// <returns>The list of authentication packages.</returns> public static IEnumerable <AuthenticationPackage> Get() { List <AuthenticationPackage> packages = new List <AuthenticationPackage>(); if (SecurityNativeMethods.EnumerateSecurityPackages(out int count, out IntPtr ppPackageInfo) == SecStatusCode.Success) { try { int size = Marshal.SizeOf(typeof(SecPkgInfo)); for (int i = 0; i < count; ++i) { SecPkgInfo pkg = (SecPkgInfo)Marshal.PtrToStructure(ppPackageInfo + i * size, typeof(SecPkgInfo)); packages.Add(new AuthenticationPackage(pkg)); } } finally { SecurityNativeMethods.FreeContextBuffer(ppPackageInfo); } } return(packages.AsReadOnly()); }
internal static byte[] GetSessionKey(SecHandle context) { var result = QueryContextAttributeNoThrow <SecPkgContext_SessionKey>(context, SECPKG_ATTR.SESSION_KEY); if (result.Item2 != SecStatusCode.SUCCESS) { return(new byte[0]); } var key = result.Item1; try { byte[] ret = new byte[key.SessionKeyLength]; Marshal.Copy(key.SessionKey, ret, 0, ret.Length); return(ret); } finally { SecurityNativeMethods.FreeContextBuffer(key.SessionKey); } }
/// <summary> /// This will free pointer using the SSPI APIs. Used to release automatically allocated /// buffers. If you control the value of the Pointer you don't need to release it. /// </summary> public void Release() { SecurityNativeMethods.FreeContextBuffer(Pointer); Pointer = IntPtr.Zero; }