File: System\Security\Cryptography\CngProvider.cs
Project: ndp\fx\src\Core\System.Core.csproj (System.Core)
// ==++==
// 
//   Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// ==--==
 
using System;
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.Contracts;
 
namespace System.Security.Cryptography {
    /// <summary>
    ///     Utility class to strongly type providers used with CNG. Since all CNG APIs which require a
    ///     provider name take the name as a string, we use this string wrapper class to specifically mark
    ///     which parameters are expected to be providers.  We also provide a list of well known provider
    ///     names, which helps Intellisense users find a set of good providernames to use.
    /// </summary>
    [Serializable]
    [System.Security.Permissions.HostProtection(MayLeakOnAbort = true)]
    public sealed class CngProvider : IEquatable<CngProvider> {
        private static volatile CngProvider s_msSmartCardKsp;
        private static volatile CngProvider s_msSoftwareKsp;
 
        private string m_provider;
 
        public CngProvider(string provider) {
            Contract.Ensures(!String.IsNullOrEmpty(m_provider));
 
            if (provider == null) {
                throw new ArgumentNullException("provider");
            }
            if (provider.Length == 0) {
                throw new ArgumentException(SR.GetString(SR.Cryptography_InvalidProviderName, provider), "provider");
            }
 
            m_provider = provider;
        }
 
        /// <summary>
        ///     Name of the CNG provider
        /// </summary>
        public string Provider {
            get {
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()));
                return m_provider;
            }
        }
 
        public static bool operator ==(CngProvider left, CngProvider right) {
            if (Object.ReferenceEquals(left, null)) {
                return Object.ReferenceEquals(right, null);
            }
 
            return left.Equals(right);
        }
 
        [Pure]
        public static bool operator !=(CngProvider left, CngProvider right) {
            if (Object.ReferenceEquals(left, null)) {
                return !Object.ReferenceEquals(right, null);
            }
 
            return !left.Equals(right);
        }
 
        public override bool Equals(object obj) {
            Contract.Assert(m_provider != null);
 
            return Equals(obj as CngProvider);
        }
 
        public bool Equals(CngProvider other) {
            if (Object.ReferenceEquals(other, null)) {
                return false;
            }
 
            return m_provider.Equals(other.Provider);
        }
 
        public override int GetHashCode() {
            Contract.Assert(m_provider != null);
            return m_provider.GetHashCode();
        }
 
        public override string ToString() {
            Contract.Assert(m_provider != null);
            return m_provider.ToString();
        }
 
        //
        // Well known NCrypt KSPs
        //
 
        [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "CardKey", Justification = "This is not 'Smart Cardkey', but 'Smart Card Key'")]
        [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "SmartCard", Justification = "Smart Card is two words in the ncrypt usage")]
        public static CngProvider MicrosoftSmartCardKeyStorageProvider {
            get {
                Contract.Ensures(Contract.Result<CngProvider>() != null);
 
                if (s_msSmartCardKsp == null) {
                    s_msSmartCardKsp = new CngProvider("Microsoft Smart Card Key Storage Provider");        // MS_SMART_CARD_KEY_STORAGE_PROVIDER
                }
 
                return s_msSmartCardKsp;
            }
        }
 
        public static CngProvider MicrosoftSoftwareKeyStorageProvider {
            get {
                Contract.Ensures(Contract.Result<CngProvider>() != null);
 
                if (s_msSoftwareKsp == null) {
                    s_msSoftwareKsp = new CngProvider("Microsoft Software Key Storage Provider");           // MS_KEY_STORAGE_PROVIDER
                }
 
                return s_msSoftwareKsp;
            }
        }
    }
}