Beispiel #1
0
        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);
     }
 }
Beispiel #3
0
 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;
 }
Beispiel #4
0
 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]);
 }
Beispiel #5
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;
 }