File: system\security\cryptography\safecryptohandles.cs
Project: ndp\clr\src\bcl\mscorlib.csproj (mscorlib)
// ==++==
// 
//   Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// ==--==
// <OWNER>Microsoft</OWNER>
// 
 
//
// SafeCryptoHandles.cs
//
 
namespace System.Security.Cryptography {
    using System.Runtime.InteropServices;
    using System.Runtime.CompilerServices;
    using System.Runtime.ConstrainedExecution;
    using System.Runtime.Versioning;
    using Microsoft.Win32.SafeHandles;
 
    /// <summary>
    ///     Safe handle representing a mscorwks!CRYPT_PROV_CTX
    /// </summary>
    /// <remarks>
    ///     Since we need sometimes to delete the key container created in the context of the CSP, the handle
    ///     used in this class is actually a pointer to a CRYPT_PROV_CTX unmanaged structure defined in
    ///     COMCryptography.h
    /// </remarks>
    [System.Security.SecurityCritical]  // auto-generated
    internal sealed class SafeProvHandle : SafeHandleZeroOrMinusOneIsInvalid {
 
        private SafeProvHandle() : base(true) {
            SetHandle(IntPtr.Zero);
        }
 
        private SafeProvHandle(IntPtr handle) : base (true) {
            SetHandle(handle);
        }
 
        internal static SafeProvHandle InvalidHandle {
            get { return new SafeProvHandle(); }
        }
 
        [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
        [ResourceExposure(ResourceScope.None)]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        [SuppressUnmanagedCodeSecurity]
        private static extern void FreeCsp(IntPtr pProviderContext);
 
        [System.Security.SecurityCritical]
        protected override bool ReleaseHandle()
        {
            FreeCsp(handle);
            return true;
        }
    }
 
#if FEATURE_CRYPTO || FEATURE_LEGACYNETCFCRYPTO
    /// <summary>
    ///     Safe handle representing a mscorkws!CRYPT_KEY_CTX
    /// </summary>
    /// <summary>
    ///     Since we need to delete the key handle before the provider is released we need to actually hold a
    ///     pointer to a CRYPT_KEY_CTX unmanaged structure whose destructor decrements a refCount. Only when
    ///     the provider refCount is 0 it is deleted. This way, we loose a ---- in the critical finalization
    ///     of the key handle and provider handle. This also applies to hash handles, which point to a 
    ///     CRYPT_HASH_CTX. Those strucutres are defined in COMCryptography.h
    /// </summary>
    [System.Security.SecurityCritical]  // auto-generated
    internal sealed class SafeKeyHandle : SafeHandleZeroOrMinusOneIsInvalid {
 
        private SafeKeyHandle() : base(true) {
            SetHandle(IntPtr.Zero);
        }
 
        private SafeKeyHandle(IntPtr handle) : base (true) {
            SetHandle(handle);
        }
 
        internal static SafeKeyHandle InvalidHandle {
            get { return new SafeKeyHandle(); }
        }
 
        [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        [ResourceExposure(ResourceScope.None)]
        [SuppressUnmanagedCodeSecurity]
        private static extern void FreeKey(IntPtr pKeyCotext);
 
        [System.Security.SecurityCritical]
        protected override bool ReleaseHandle()
        {
            FreeKey(handle);
            return true;
        }
    }
 
    /// <summary>
    ///     SafeHandle representing a mscorwks!CRYPT_HASH_CTX
    /// </summary>
    /// <remarks>
    ///     See code:System.Security.Cryptography.SafeKeyHandle for information about the release process
    ///     for a CRYPT_HASH_CTX.
    /// </remarks>
    [System.Security.SecurityCritical]  // auto-generated
    internal sealed class SafeHashHandle : SafeHandleZeroOrMinusOneIsInvalid {
 
        private SafeHashHandle() : base(true) {
            SetHandle(IntPtr.Zero);
        }
 
        private SafeHashHandle(IntPtr handle) : base (true) {
            SetHandle(handle);
        }
 
        internal static SafeHashHandle InvalidHandle {
            get { return new SafeHashHandle(); }
        }
 
        [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        [ResourceExposure(ResourceScope.None)]
        [SuppressUnmanagedCodeSecurity]
        private static extern void FreeHash(IntPtr pHashContext);
 
        [System.Security.SecurityCritical]
        protected override bool ReleaseHandle()
        {
            FreeHash(handle);
            return true;
        }
    }
#endif // #if FEATURE_CRYPTO || FEATURE_LEGACYNETCFCRYPTO
}