File: System\Security\Cryptography\CngAlgorithmGroup.cs
Project: ndp\fx\src\Core\System.Core.csproj (System.Core)
// ==++==
// 
//   Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// ==--==
 
using System;
using System.Diagnostics.Contracts;
 
namespace System.Security.Cryptography {
    /// <summary>
    ///     Utility class to strongly type algorithm groups used with CNG. Since all CNG APIs which require or
    ///     return an algorithm group name take the name as a string, we use this string wrapper class to
    ///     specifically mark which parameters and return values are expected to be algorithm groups.  We also
    ///     provide a list of well known algorithm group names, which helps Intellisense users find a set of
    ///     good algorithm group names to use.
    /// </summary>
    [Serializable]
    [System.Security.Permissions.HostProtection(MayLeakOnAbort = true)]
    public sealed class CngAlgorithmGroup : IEquatable<CngAlgorithmGroup> {
        private static volatile CngAlgorithmGroup s_dh;
        private static volatile CngAlgorithmGroup s_dsa;
        private static volatile CngAlgorithmGroup s_ecdh;
        private static volatile CngAlgorithmGroup s_ecdsa;
        private static volatile CngAlgorithmGroup s_rsa;
 
        private string m_algorithmGroup;
 
        public CngAlgorithmGroup(string algorithmGroup) {
            Contract.Ensures(!String.IsNullOrEmpty(m_algorithmGroup));
 
            if (algorithmGroup == null) {
                throw new ArgumentNullException("algorithmGroup");
            }
            if (algorithmGroup.Length == 0) {
                throw new ArgumentException(SR.GetString(SR.Cryptography_InvalidAlgorithmGroup, algorithmGroup), "algorithmGroup");
            }
 
            m_algorithmGroup = algorithmGroup;
        }
 
        /// <summary>
        ///     Name of the algorithm group
        /// </summary>
        public string AlgorithmGroup {
            get {
                Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()));
                return m_algorithmGroup;
            }
        }
 
        [Pure]
        public static bool operator ==(CngAlgorithmGroup left, CngAlgorithmGroup right) {
            if (Object.ReferenceEquals(left, null)) {
                return Object.ReferenceEquals(right, null);
            }
 
 
            return left.Equals(right);
        }
 
        [Pure]
        public static bool operator !=(CngAlgorithmGroup left, CngAlgorithmGroup right) {
            if (Object.ReferenceEquals(left, null)) {
                return !Object.ReferenceEquals(right, null);
            }
 
            return !left.Equals(right);
        }
 
        public override bool Equals(object obj) {
            Contract.Assert(m_algorithmGroup != null);
 
            return Equals(obj as CngAlgorithmGroup);
        }
 
        public bool Equals(CngAlgorithmGroup other) {
            if (Object.ReferenceEquals(other, null)) {
                return false;
            }
 
            return m_algorithmGroup.Equals(other.AlgorithmGroup);
        }
 
        public override int GetHashCode() {
            Contract.Assert(m_algorithmGroup != null);
            return m_algorithmGroup.GetHashCode();
        }
 
        public override string ToString() {
            Contract.Assert(m_algorithmGroup != null);
            return m_algorithmGroup;
        }
 
        //
        // Well known algorithm groups
        //
 
        public static CngAlgorithmGroup DiffieHellman {
            get {
                Contract.Ensures(Contract.Result<CngAlgorithmGroup>() != null);
 
                if (s_dh == null) {
                    s_dh = new CngAlgorithmGroup("DH");                 // NCRYPT_DH_ALGORITHM_GROUP
                }
 
                return s_dh;
            }
        }
 
        public static CngAlgorithmGroup Dsa {
            get {
                Contract.Ensures(Contract.Result<CngAlgorithmGroup>() != null);
 
                if (s_dsa == null) {
                    s_dsa = new CngAlgorithmGroup("DSA");               // NCRYPT_DSA_ALGORITHM_GROUP
                }
 
                return s_dsa;
            }
        }
 
        public static CngAlgorithmGroup ECDiffieHellman {
            [Pure]
            get {
                Contract.Ensures(Contract.Result<CngAlgorithmGroup>() != null);
 
                if (s_ecdh == null) {
                    s_ecdh = new CngAlgorithmGroup("ECDH");             // NCRYPT_ECDH_ALGORITHM_GROUP
                }
 
                return s_ecdh;
            }
        }
 
        public static CngAlgorithmGroup ECDsa {
            [Pure]
            get {
                Contract.Ensures(Contract.Result<CngAlgorithmGroup>() != null);
 
                if (s_ecdsa == null) {
                    s_ecdsa = new CngAlgorithmGroup("ECDSA");           // NCRYPT_ECDSA_ALGORITHM_GROUP
                }
 
                return s_ecdsa;
            }
        }
 
        public static CngAlgorithmGroup Rsa {
            get {
                Contract.Ensures(Contract.Result<CngAlgorithmGroup>() != null);
 
                if (s_rsa == null) {
                    s_rsa = new CngAlgorithmGroup("RSA");               // NCRYPT_RSA_ALGORITHM_GROUP
                }
 
                return s_rsa;
            }
        }
    }
}