From 3c7ccc99e17f4ffdc5a31e90bedeb674b318d767 Mon Sep 17 00:00:00 2001 From: David Hook Date: Fri, 30 May 2014 15:18:17 +1000 Subject: fixed RSA key factory to recognise encoded RSA keys without CRT factors. --- .../jcajce/provider/asymmetric/rsa/BCRSAPrivateKey.java | 6 ++++++ .../jcajce/provider/asymmetric/rsa/KeyFactorySpi.java | 11 ++++++++++- .../java/org/bouncycastle/jce/provider/test/RSATest.java | 15 +++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) (limited to 'prov') diff --git a/prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/rsa/BCRSAPrivateKey.java b/prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/rsa/BCRSAPrivateKey.java index 0aa81b48..b82c5f80 100644 --- a/prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/rsa/BCRSAPrivateKey.java +++ b/prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/rsa/BCRSAPrivateKey.java @@ -55,6 +55,12 @@ public class BCRSAPrivateKey this.privateExponent = key.getPrivateExponent(); } + BCRSAPrivateKey(org.bouncycastle.asn1.pkcs.RSAPrivateKey key) + { + this.modulus = key.getModulus(); + this.privateExponent = key.getPrivateExponent(); + } + public BigInteger getModulus() { return modulus; diff --git a/prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/rsa/KeyFactorySpi.java b/prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/rsa/KeyFactorySpi.java index d8eb5394..80690f7c 100644 --- a/prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/rsa/KeyFactorySpi.java +++ b/prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/rsa/KeyFactorySpi.java @@ -137,7 +137,16 @@ public class KeyFactorySpi if (RSAUtil.isRsaOid(algOid)) { - return new BCRSAPrivateCrtKey(keyInfo); + RSAPrivateKey rsaPrivKey = RSAPrivateKey.getInstance(keyInfo.parsePrivateKey()); + + if (rsaPrivKey.getCoefficient().intValue() == 0) + { + return new BCRSAPrivateKey(rsaPrivKey); + } + else + { + return new BCRSAPrivateCrtKey(keyInfo); + } } else { diff --git a/prov/src/test/java/org/bouncycastle/jce/provider/test/RSATest.java b/prov/src/test/java/org/bouncycastle/jce/provider/test/RSATest.java index c1f4582a..2fce07c5 100644 --- a/prov/src/test/java/org/bouncycastle/jce/provider/test/RSATest.java +++ b/prov/src/test/java/org/bouncycastle/jce/provider/test/RSATest.java @@ -39,6 +39,7 @@ import org.bouncycastle.asn1.DEROctetString; import org.bouncycastle.asn1.nist.NISTObjectIdentifiers; import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers; import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; +import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; import org.bouncycastle.asn1.pkcs.RSAESOAEPparams; import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers; import org.bouncycastle.asn1.x509.AlgorithmIdentifier; @@ -148,6 +149,20 @@ public class RSATest PrivateKey priv2048Key = fact.generatePrivate(priv2048KeySpec); PublicKey pub2048Key = fact.generatePublic(pub2048KeySpec); + // + // key without CRT coefficients + // + PrivateKeyInfo keyInfo = PrivateKeyInfo.getInstance(privKey.getEncoded()); + BigInteger zero = BigInteger.valueOf(0); + PKCS8EncodedKeySpec noCrtSpec = new PKCS8EncodedKeySpec(new PrivateKeyInfo(keyInfo.getPrivateKeyAlgorithm(), + new org.bouncycastle.asn1.pkcs.RSAPrivateKey(privKeySpec.getModulus(), privKeySpec.getPublicExponent(), privKeySpec.getPrivateExponent(), zero, zero, zero, zero, zero)).getEncoded()); + + PrivateKey noCrtKey = fact.generatePrivate(noCrtSpec); + if (noCrtKey instanceof RSAPrivateCrtKey) + { + fail("private key without CRT coefficients returned as CRT key"); + } + // // No Padding // -- cgit v1.2.3