public override byte[] SignHash(byte[] hash, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding) { if (hash == null) { throw new ArgumentNullException("hash"); } if (String.IsNullOrEmpty(hashAlgorithm.Name)) { throw new ArgumentException(SR.GetString(SR.Cryptography_HashAlgorithmNameNullOrEmpty), "hashAlgorithm"); } if (padding == null) { throw new ArgumentNullException("padding"); } // Keep a local copy of the key. CngKey key = Key; SafeNCryptKeyHandle keyHandle = key.Handle; if (padding == RSASignaturePadding.Pkcs1) { return(NCryptNative.SignHashPkcs1(keyHandle, hash, hashAlgorithm.Name)); } else if (padding == RSASignaturePadding.Pss) { return(NCryptNative.SignHashPss(keyHandle, hash, hashAlgorithm.Name, hash.Length)); } else { // no other padding possibilities at present, but we might version independently from more being added. throw new CryptographicException(SR.GetString(SR.Cryptography_UnsupportedPaddingMode)); } }