private static ICipherParameters GetPrivateParameters(IKey privateKey, AsymmetricRsaKey.Usage rsaUsage) { if (privateKey is KeyWithRandom) { KeyWithRandom k = (KeyWithRandom)privateKey; return(new ParametersWithRandom(GetPrivateKeyParameters((AsymmetricRsaPrivateKey)k.Key, rsaUsage), k.Random)); } else { return(new ParametersWithRandom(GetPrivateKeyParameters((AsymmetricRsaPrivateKey)privateKey, rsaUsage), CryptoServicesRegistrar.GetSecureRandom())); } }
private static void CheckKeyUsage(AsymmetricRsaKey key, AsymmetricRsaKey.Usage usage) { // FSM_STATE:5.12,"RSA KEY USAGE CHECK", "The module verifies recent usage of an RSA key is consistent with requested usage" // FSM_TRANS:5.RSAK.0,"CONDITIONAL TEST", "RSA KEY USAGE CHECK", "Invoke RSA key usage check" if (!key.CanBeUsed(usage)) { // FSM_TRANS:5.RSAK.2,"RSA KEY USAGE CHECK", "USER COMMAND REJECTED", "RSA key usage check failed" if (usage == AsymmetricRsaKey.Usage.SignOrVerify) { throw new IllegalKeyException("attempt to sign/verify with RSA modulus already used for encrypt/decrypt"); } else { throw new IllegalKeyException("attempt to encrypt/decrypt with RSA modulus already used for sign/verify"); } } // FSM_TRANS:5.RSAK.1,"RSA KEY USAGE CHECK", "CONDITIONAL TEST", "RSA key usage check successful" }
internal static RsaKeyParameters GetPrivateKeyParameters(AsymmetricRsaPrivateKey k, AsymmetricRsaKey.Usage usage) { CheckKeyUsage(k, usage); if (k.PublicExponent.Equals(BigInteger.Zero)) { return(new RsaKeyParameters(true, k.Modulus, k.PrivateExponent)); } else { return(new RsaPrivateCrtKeyParameters(k.Modulus, k.PublicExponent, k.PrivateExponent, k.P, k.Q, k.DP, k.DQ, k.QInv)); } }
internal static RsaKeyParameters GetPublicKeyParameters(AsymmetricRsaPublicKey k, AsymmetricRsaKey.Usage usage) { CheckKeyUsage(k, usage); return(new RsaKeyParameters(false, k.Modulus, k.PublicExponent)); }