diff options
Diffstat (limited to 'bcprov/src/main/java/org/bouncycastle/crypto/util/PrivateKeyFactory.java')
-rw-r--r-- | bcprov/src/main/java/org/bouncycastle/crypto/util/PrivateKeyFactory.java | 69 |
1 files changed, 24 insertions, 45 deletions
diff --git a/bcprov/src/main/java/org/bouncycastle/crypto/util/PrivateKeyFactory.java b/bcprov/src/main/java/org/bouncycastle/crypto/util/PrivateKeyFactory.java index 58c7871c..900c6c37 100644 --- a/bcprov/src/main/java/org/bouncycastle/crypto/util/PrivateKeyFactory.java +++ b/bcprov/src/main/java/org/bouncycastle/crypto/util/PrivateKeyFactory.java @@ -51,6 +51,7 @@ import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters; // Android-removed: Unsupported algorithms // import org.bouncycastle.crypto.params.X25519PrivateKeyParameters; // import org.bouncycastle.crypto.params.X448PrivateKeyParameters; +import org.bouncycastle.util.Arrays; /** * Factory for creating private key objects from PKCS8 PrivateKeyInfo objects. @@ -149,7 +150,7 @@ public class PrivateKeyFactory } else if (algOID.equals(X9ObjectIdentifiers.id_ecPublicKey)) { - X962Parameters params = new X962Parameters((ASN1Primitive)algId.getParameters()); + X962Parameters params = X962Parameters.getInstance(algId.getParameters()); X9ECParameters x9; ECDomainParameters dParams; @@ -163,8 +164,7 @@ public class PrivateKeyFactory { x9 = ECNamedCurveTable.getByOID(oid); } - dParams = new ECNamedDomainParameters( - oid, x9.getCurve(), x9.getG(), x9.getN(), x9.getH(), x9.getSeed()); + dParams = new ECNamedDomainParameters(oid, x9); } else { @@ -208,7 +208,7 @@ public class PrivateKeyFactory if (p instanceof ASN1Sequence && (ASN1Sequence.getInstance(p).size() == 2 || ASN1Sequence.getInstance(p).size() == 3)) { - ECDomainParameters ecP = ECGOST3410NamedCurves.getByOID(gostParams.getPublicKeyParamSet()); + X9ECParameters ecP = ECGOST3410NamedCurves.getByOIDX9(gostParams.getPublicKeyParamSet()); ecSpec = new ECGOST3410Parameters( new ECNamedDomainParameters( @@ -216,25 +216,25 @@ public class PrivateKeyFactory gostParams.getPublicKeyParamSet(), gostParams.getDigestParamSet(), gostParams.getEncryptionParamSet()); - ASN1Encodable privKey = keyInfo.parsePrivateKey(); - if (privKey instanceof ASN1Integer) + ASN1OctetString privEnc = keyInfo.getPrivateKey(); + + if (privEnc.getOctets().length == 32 || privEnc.getOctets().length == 64) { - d = ASN1Integer.getInstance(privKey).getPositiveValue(); + d = new BigInteger(1, Arrays.reverse(privEnc.getOctets())); } else { - byte[] encVal = ASN1OctetString.getInstance(privKey).getOctets(); - byte[] dVal = new byte[encVal.length]; - - for (int i = 0; i != encVal.length; i++) + ASN1Encodable privKey = keyInfo.parsePrivateKey(); + if (privKey instanceof ASN1Integer) { - dVal[i] = encVal[encVal.length - 1 - i]; + d = ASN1Integer.getInstance(privKey).getPositiveValue(); + } + else + { + byte[] dVal = Arrays.reverse(ASN1OctetString.getInstance(privKey).getOctets()); + d = new BigInteger(1, dVal); } - - d = new BigInteger(1, dVal); } - - } else { @@ -244,27 +244,10 @@ public class PrivateKeyFactory { ASN1ObjectIdentifier oid = ASN1ObjectIdentifier.getInstance(params.getParameters()); X9ECParameters ecP = ECNamedCurveTable.getByOID(oid); - if (ecP == null) - { - ECDomainParameters gParam = ECGOST3410NamedCurves.getByOID(oid); - ecSpec = new ECGOST3410Parameters(new ECNamedDomainParameters( - oid, - gParam.getCurve(), - gParam.getG(), - gParam.getN(), - gParam.getH(), - gParam.getSeed()), gostParams.getPublicKeyParamSet(), gostParams.getDigestParamSet(), gostParams.getEncryptionParamSet()); - } - else - { - ecSpec = new ECGOST3410Parameters(new ECNamedDomainParameters( - oid, - ecP.getCurve(), - ecP.getG(), - ecP.getN(), - ecP.getH(), - ecP.getSeed()), gostParams.getPublicKeyParamSet(), gostParams.getDigestParamSet(), gostParams.getEncryptionParamSet()); - } + + ecSpec = new ECGOST3410Parameters(new ECNamedDomainParameters(oid, ecP), + gostParams.getPublicKeyParamSet(), gostParams.getDigestParamSet(), + gostParams.getEncryptionParamSet()); } else if (params.isImplicitlyCA()) { @@ -273,13 +256,9 @@ public class PrivateKeyFactory else { X9ECParameters ecP = X9ECParameters.getInstance(params.getParameters()); - ecSpec = new ECGOST3410Parameters(new ECNamedDomainParameters( - algOID, - ecP.getCurve(), - ecP.getG(), - ecP.getN(), - ecP.getH(), - ecP.getSeed()), gostParams.getPublicKeyParamSet(), gostParams.getDigestParamSet(), gostParams.getEncryptionParamSet()); + ecSpec = new ECGOST3410Parameters(new ECNamedDomainParameters(algOID, ecP), + gostParams.getPublicKeyParamSet(), gostParams.getDigestParamSet(), + gostParams.getEncryptionParamSet()); } ASN1Encodable privKey = keyInfo.parsePrivateKey(); @@ -291,7 +270,7 @@ public class PrivateKeyFactory } else { - org.bouncycastle.asn1.sec.ECPrivateKey ec = org.bouncycastle.asn1.sec.ECPrivateKey.getInstance(privKey); + ECPrivateKey ec = ECPrivateKey.getInstance(privKey); d = ec.getKey(); } |