Exemple #1
0
        public void ConstructorCustom()
        {
            CngAlgorithmGroup group = new CngAlgorithmGroup("custom");

            Check(group);
            Assert.IsFalse(group.Equals((CngAlgorithmGroup)null), "Equals((CngAlgorithmGroup)null)");
            Assert.IsFalse(group.Equals((object)null), "Equals((object)null)");
        }
Exemple #2
0
 private static bool IsEccAlgorithmGroup(CngAlgorithmGroup algorithmGroup)
 {
     // Sometimes, when reading from certificates, ECDSA keys get identified as ECDH.
     // Windows allows the ECDH keys to perform both key exchange (ECDH) and signing (ECDSA),
     // so either value is acceptable for the ECDSA wrapper object.
     //
     // It is worth noting, however, that ECDSA-identified keys cannot be used for key exchange (ECDH) in CNG.
     return algorithmGroup == CngAlgorithmGroup.ECDsa || algorithmGroup == CngAlgorithmGroup.ECDiffieHellman;
 }
Exemple #3
0
        public void DiffieHellman()
        {
            CngAlgorithmGroup group = CngAlgorithmGroup.DiffieHellman;

            Assert.AreEqual("DH", group.AlgorithmGroup, "AlgorithmGroup");
            Assert.IsTrue(group.Equals(CngAlgorithmGroup.DiffieHellman), "Equals(static)");
            Assert.IsTrue(Object.ReferenceEquals(group, CngAlgorithmGroup.DiffieHellman), "ReferenceEquals");
            Check(group);
        }
Exemple #4
0
        public void Rsa()
        {
            CngAlgorithmGroup group = CngAlgorithmGroup.Rsa;

            Assert.AreEqual("RSA", group.AlgorithmGroup, "AlgorithmGroup");
            Assert.IsTrue(group.Equals(CngAlgorithmGroup.Rsa), "Equals(static)");
            Assert.IsTrue(Object.ReferenceEquals(group, CngAlgorithmGroup.Rsa), "ReferenceEquals");
            Check(group);
        }
        private static int GuessKeySpec(
            CngProvider provider,
            string keyName,
            bool machineKey,
            CngAlgorithmGroup algorithmGroup)
        {
            if (provider == CngProvider.MicrosoftSoftwareKeyStorageProvider ||
                provider == CngProvider.MicrosoftSmartCardKeyStorageProvider)
            {
                // Well-known CNG providers, keySpec is 0.
                return(0);
            }

            const int NTE_BAD_KEYSET = unchecked ((int)0x80090016);

            try
            {
                CngKeyOpenOptions options = machineKey ? CngKeyOpenOptions.MachineKey : CngKeyOpenOptions.None;

                using (CngKey.Open(keyName, provider, options))
                {
                    // It opened with keySpec 0, so use keySpec 0.
                    return(0);
                }
            }
            catch (CryptographicException e)
            {
                Debug.Assert(
                    e.HResult == NTE_BAD_KEYSET,
                    $"CngKey.Open had unexpected error: 0x{e.HResult:X8}: {e.Message}");

                CspParameters cspParameters = new CspParameters
                {
                    ProviderName     = provider.Provider,
                    KeyContainerName = keyName,
                    Flags            = CspProviderFlags.UseExistingKey,
                    KeyNumber        = (int)KeyNumber.Signature,
                };

                if (machineKey)
                {
                    cspParameters.Flags |= CspProviderFlags.UseMachineKeyStore;
                }

                int keySpec;

                if (TryGuessKeySpec(cspParameters, algorithmGroup, out keySpec))
                {
                    return(keySpec);
                }

                throw;
            }
        }
Exemple #6
0
        private static int GuessKeySpec(
            CngProvider provider,
            string keyName,
            bool machineKey,
            CngAlgorithmGroup algorithmGroup)
        {
            if (provider == CngProvider.MicrosoftSoftwareKeyStorageProvider ||
                provider == CngProvider.MicrosoftSmartCardKeyStorageProvider)
            {
                // Well-known CNG providers, keySpec is 0.
                return(0);
            }

            try
            {
                CngKeyOpenOptions options = machineKey ? CngKeyOpenOptions.MachineKey : CngKeyOpenOptions.None;

                using (CngKey.Open(keyName, provider, options))
                {
                    // It opened with keySpec 0, so use keySpec 0.
                    return(0);
                }
            }
            catch (CryptographicException)
            {
                // While NTE_BAD_KEYSET is what we generally expect here for RSA, on Windows 7
                // PROV_DSS produces NTE_BAD_PROV_TYPE, and PROV_DSS_DH produces NTE_NO_KEY.
                //
                // So we'll just try the CAPI fallback for any error code, and see what happens.

                CspParameters cspParameters = new CspParameters
                {
                    ProviderName     = provider.Provider,
                    KeyContainerName = keyName,
                    Flags            = CspProviderFlags.UseExistingKey,
                    KeyNumber        = (int)KeyNumber.Signature,
                };

                if (machineKey)
                {
                    cspParameters.Flags |= CspProviderFlags.UseMachineKeyStore;
                }

                int keySpec;

                if (TryGuessKeySpec(cspParameters, algorithmGroup, out keySpec))
                {
                    return(keySpec);
                }

                throw;
            }
        }
        private static bool TryGuessKeySpec(
            CspParameters cspParameters,
            CngAlgorithmGroup algorithmGroup,
            out int keySpec)
        {
            if (algorithmGroup == CngAlgorithmGroup.Rsa)
            {
                return(TryGuessRsaKeySpec(cspParameters, out keySpec));
            }

            if (algorithmGroup == CngAlgorithmGroup.Dsa)
            {
                return(TryGuessDsaKeySpec(cspParameters, out keySpec));
            }

            keySpec = 0;
            return(false);
        }
		private void Check (CngAlgorithmGroup group)
		{
			Assert.AreEqual (group.AlgorithmGroup, group.ToString (), "Algorithm/ToString");
			Assert.AreEqual (group.GetHashCode (), group.AlgorithmGroup.GetHashCode (), "GetHashCode");
			Assert.IsTrue (group.Equals (group), "Equals(self)");
			Assert.IsTrue (group.Equals ((object) group), "Equals((object)self)");

			CngAlgorithmGroup copy = new CngAlgorithmGroup (group.AlgorithmGroup);
			Assert.AreEqual (group.GetHashCode (), copy.GetHashCode (), "Copy");
			Assert.IsTrue (group.Equals (copy), "Equals(copy)");
			Assert.IsTrue (group.Equals ((object) copy), "Equals((object)copy)");
			Assert.IsTrue (group == copy, "algo==copy");
			Assert.IsFalse (group != copy, "algo!=copy");

			Assert.IsFalse (group.Equals (mono), "Equals(mono)");
			Assert.IsFalse (group.Equals ((object) mono), "Equals((object)mono)");
			Assert.IsFalse (group == mono, "algo==mono");
			Assert.IsTrue (group != mono, "algo!=mono");
		}
Exemple #9
0
        private void Check(CngAlgorithmGroup group)
        {
            Assert.AreEqual(group.AlgorithmGroup, group.ToString(), "Algorithm/ToString");
            Assert.AreEqual(group.GetHashCode(), group.AlgorithmGroup.GetHashCode(), "GetHashCode");
            Assert.IsTrue(group.Equals(group), "Equals(self)");
            Assert.IsTrue(group.Equals((object)group), "Equals((object)self)");

            CngAlgorithmGroup copy = new CngAlgorithmGroup(group.AlgorithmGroup);

            Assert.AreEqual(group.GetHashCode(), copy.GetHashCode(), "Copy");
            Assert.IsTrue(group.Equals(copy), "Equals(copy)");
            Assert.IsTrue(group.Equals((object)copy), "Equals((object)copy)");
            Assert.IsTrue(group == copy, "algo==copy");
            Assert.IsFalse(group != copy, "algo!=copy");

            Assert.IsFalse(group.Equals(mono), "Equals(mono)");
            Assert.IsFalse(group.Equals((object)mono), "Equals((object)mono)");
            Assert.IsFalse(group == mono, "algo==mono");
            Assert.IsTrue(group != mono, "algo!=mono");
        }
        private static int GuessKeySpec(CngProvider provider, string keyName, bool machineKey, CngAlgorithmGroup algorithmGroup)
        {
            if (provider == CngProvider.MicrosoftSoftwareKeyStorageProvider || provider == CngProvider.MicrosoftSmartCardKeyStorageProvider)
            {
                return(0);
            }
            CngKeyOpenOptions openOptions = machineKey ? CngKeyOpenOptions.MachineKey : CngKeyOpenOptions.None;

            using (CngKey.Open(keyName, provider, openOptions))
            {
                return(0);
            }
        }
		public void ConstructorCustom ()
		{
			CngAlgorithmGroup group = new CngAlgorithmGroup ("custom");
			Check (group);
			Assert.IsFalse (group.Equals ((CngAlgorithmGroup) null), "Equals((CngAlgorithmGroup)null)");
			Assert.IsFalse (group.Equals ((object) null), "Equals((object)null)");
		}