internal SafeNCryptKeyHandle GetDuplicatedKeyHandle(int callerKeySizeProperty) { ThrowIfDisposed(); if (ECCng.IsECNamedCurve(_lastAlgorithm)) { // Curve was previously created, so use that return(new DuplicateSafeNCryptKeyHandle(_keyHandle !)); } else { if (_lastKeySize != callerKeySizeProperty) { // Map the current key size to a CNG algorithm name string algorithm; bool isEcdsa = _algorithmGroup == BCryptNative.AlgorithmName.ECDsa; switch (callerKeySizeProperty) { case 256: algorithm = isEcdsa ? BCryptNative.AlgorithmName.ECDsaP256 : BCryptNative.AlgorithmName.ECDHP256; break; case 384: algorithm = isEcdsa ? BCryptNative.AlgorithmName.ECDsaP384 : BCryptNative.AlgorithmName.ECDHP384; break; case 521: algorithm = isEcdsa ? BCryptNative.AlgorithmName.ECDsaP521 : BCryptNative.AlgorithmName.ECDHP521; break; default: Debug.Fail("Should not have invalid key size"); throw new ArgumentException(SR.Cryptography_InvalidKeySize); } if (_keyHandle != null) { DisposeKey(); } _keyHandle = CngKeyLite.GenerateNewExportableKey(algorithm, callerKeySizeProperty); _lastKeySize = callerKeySizeProperty; _lastAlgorithm = algorithm; KeySize = callerKeySizeProperty; } return(new DuplicateSafeNCryptKeyHandle(_keyHandle !)); } }
private SafeNCryptKeyHandle GetKeyHandle() { int keySize = KeySize; if (_lastKeySize != keySize) { if (_keyHandle != null) { _keyHandle.Dispose(); } const string BCRYPT_RSA_ALGORITHM = "RSA"; _keyHandle = CngKeyLite.GenerateNewExportableKey(BCRYPT_RSA_ALGORITHM, keySize); _lastKeySize = keySize; } return(_keyHandle); }
private SafeNCryptKeyHandle GetDuplicatedKeyHandle() { ThrowIfDisposed(); int keySize = KeySize; if (_lastKeySize != keySize) { if (_keyHandle != null) { _keyHandle.Dispose(); } const string BCRYPT_DSA_ALGORITHM = "DSA"; _keyHandle = CngKeyLite.GenerateNewExportableKey(BCRYPT_DSA_ALGORITHM, keySize); _lastKeySize = keySize; } return(new DuplicateSafeNCryptKeyHandle(_keyHandle !)); }
private SafeNCryptKeyHandle GetDuplicatedKeyHandle() { if (IsECNamedCurve(_lastAlgorithm)) { // Curve was previously created, so use that return(new DuplicateSafeNCryptKeyHandle(_keyHandle)); } else { string algorithm = null; int keySize = KeySize; if (_lastKeySize != keySize) { // Map the current key size to a CNG algorithm name switch (keySize) { case 256: algorithm = AlgorithmName.ECDsaP256; break; case 384: algorithm = AlgorithmName.ECDsaP384; break; case 521: algorithm = AlgorithmName.ECDsaP521; break; default: Debug.Fail("Should not have invalid key size"); throw new ArgumentException(SR.Cryptography_InvalidKeySize); } if (_keyHandle != null) { DisposeKey(); } _keyHandle = CngKeyLite.GenerateNewExportableKey(algorithm, keySize); _lastKeySize = keySize; _lastAlgorithm = algorithm; ForceSetKeySize(keySize); } return(new DuplicateSafeNCryptKeyHandle(_keyHandle)); } }
internal void GenerateKey(ECCurve curve) { curve.Validate(); ThrowIfDisposed(); if (_keyHandle != null) { DisposeKey(); } string algorithm; int keySize = 0; if (curve.IsNamed) { if (string.IsNullOrEmpty(curve.Oid.FriendlyName)) { throw new PlatformNotSupportedException( SR.Format(SR.Cryptography_InvalidCurveOid, curve.Oid.Value)); } // Map curve name to algorithm to support pre-Win10 curves if (_algorithmGroup == BCryptNative.AlgorithmName.ECDsa) { algorithm = ECCng.EcdsaCurveNameToAlgorithm(curve.Oid.FriendlyName); } else { Debug.Assert(_algorithmGroup == BCryptNative.AlgorithmName.ECDH); algorithm = ECCng.EcdhCurveNameToAlgorithm(curve.Oid.FriendlyName); } if (ECCng.IsECNamedCurve(algorithm)) { try { _keyHandle = CngKeyLite.GenerateNewExportableKey(algorithm, curve.Oid.FriendlyName); keySize = CngKeyLite.GetKeyLength(_keyHandle); } catch (CryptographicException e) { // Map to PlatformNotSupportedException if appropriate Interop.NCrypt.ErrorCode errorCode = (Interop.NCrypt.ErrorCode)e.HResult; if (curve.IsNamed && errorCode == Interop.NCrypt.ErrorCode.NTE_INVALID_PARAMETER || errorCode == Interop.NCrypt.ErrorCode.NTE_NOT_SUPPORTED) { throw new PlatformNotSupportedException( SR.Format(SR.Cryptography_CurveNotSupported, curve.Oid.FriendlyName), e); } throw; } } else { // Get the proper KeySize from algorithm name switch (algorithm) { case BCryptNative.AlgorithmName.ECDsaP256: case BCryptNative.AlgorithmName.ECDHP256: keySize = 256; break; case BCryptNative.AlgorithmName.ECDsaP384: case BCryptNative.AlgorithmName.ECDHP384: keySize = 384; break; case BCryptNative.AlgorithmName.ECDsaP521: case BCryptNative.AlgorithmName.ECDHP521: keySize = 521; break; default: Debug.Fail($"Unknown algorithm {algorithm}"); throw new ArgumentException(SR.Cryptography_InvalidKeySize); } _keyHandle = CngKeyLite.GenerateNewExportableKey(algorithm, keySize); } } else if (curve.IsExplicit) { algorithm = _algorithmGroup; _keyHandle = CngKeyLite.GenerateNewExportableKey(algorithm, ref curve); keySize = CngKeyLite.GetKeyLength(_keyHandle); } else { throw new PlatformNotSupportedException( SR.Format(SR.Cryptography_CurveNotSupported, curve.CurveType.ToString())); } _lastAlgorithm = algorithm; _lastKeySize = keySize; KeySize = keySize; }
public override void GenerateKey(ECCurve curve) { curve.Validate(); if (_keyHandle != null) { DisposeKey(); } string algorithm = null; int keySize = 0; if (curve.IsNamed) { if (string.IsNullOrEmpty(curve.Oid.FriendlyName)) { throw new PlatformNotSupportedException(string.Format(SR.Cryptography_InvalidCurveOid, curve.Oid.Value)); } // Map curve name to algorithm to support pre-Win10 curves algorithm = ECCng.EcdsaCurveNameToAlgorithm(curve.Oid.FriendlyName); if (IsECNamedCurve(algorithm)) { try { _keyHandle = CngKeyLite.GenerateNewExportableKey(algorithm, curve.Oid.FriendlyName); keySize = CngKeyLite.GetKeyLength(_keyHandle); } catch (CryptographicException e) { // Map to PlatformNotSupportedException if appropriate ErrorCode errorCode = (ErrorCode)e.HResult; if (curve.IsNamed && errorCode == ErrorCode.NTE_INVALID_PARAMETER || errorCode == ErrorCode.NTE_NOT_SUPPORTED) { throw new PlatformNotSupportedException(string.Format(SR.Cryptography_CurveNotSupported, curve.Oid.FriendlyName), e); } throw; } } else { // Get the proper KeySize from algorithm name if (algorithm == AlgorithmName.ECDsaP256) { keySize = 256; } else if (algorithm == AlgorithmName.ECDsaP384) { keySize = 384; } else if (algorithm == AlgorithmName.ECDsaP521) { keySize = 521; } else { Debug.Fail(string.Format("Unknown algorithm {0}", algorithm.ToString())); throw new ArgumentException(SR.Cryptography_InvalidKeySize); } _keyHandle = CngKeyLite.GenerateNewExportableKey(algorithm, keySize); } } else if (curve.IsExplicit) { algorithm = AlgorithmName.ECDsa; _keyHandle = CngKeyLite.GenerateNewExportableKey(algorithm, ref curve); keySize = CngKeyLite.GetKeyLength(_keyHandle); } else { throw new PlatformNotSupportedException(string.Format(SR.Cryptography_CurveNotSupported, curve.CurveType.ToString())); } _lastAlgorithm = algorithm; _lastKeySize = keySize; ForceSetKeySize(keySize); }