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)"); }
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; }
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); }
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; } }
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"); }
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)"); }