Skip to content

Commit a40fcff

Browse files
authored
Merge pull request docker-java#880 from gesellix/master
Replace the certificate algorithm guess with a delegation to the JcaPEMKeyConverter
2 parents 41becb6 + 62c701a commit a40fcff

1 file changed

Lines changed: 21 additions & 33 deletions

File tree

src/main/java/com/github/dockerjava/core/util/CertificateUtils.java

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@
55
import java.io.IOException;
66
import java.io.Reader;
77
import java.io.StringReader;
8-
import java.security.KeyFactory;
98
import java.security.KeyStore;
109
import java.security.KeyStoreException;
1110
import java.security.NoSuchAlgorithmException;
1211
import java.security.PrivateKey;
1312
import java.security.cert.Certificate;
1413
import java.security.cert.CertificateException;
1514
import java.security.spec.InvalidKeySpecException;
16-
import java.security.spec.PKCS8EncodedKeySpec;
1715
import java.util.ArrayList;
1816
import java.util.List;
1917

@@ -25,6 +23,7 @@
2523
import org.bouncycastle.jce.provider.BouncyCastleProvider;
2624
import org.bouncycastle.openssl.PEMKeyPair;
2725
import org.bouncycastle.openssl.PEMParser;
26+
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
2827
import org.slf4j.Logger;
2928
import org.slf4j.LoggerFactory;
3029

@@ -111,47 +110,36 @@ public static PrivateKey loadPrivateKey(final Reader reader) throws IOException,
111110
try (PEMParser pemParser = new PEMParser(reader)) {
112111
Object readObject = pemParser.readObject();
113112
while (readObject != null) {
114-
if (readObject instanceof PEMKeyPair) {
115-
PEMKeyPair pemKeyPair = (PEMKeyPair) readObject;
116-
PrivateKey privateKey = guessKey(pemKeyPair.getPrivateKeyInfo().getEncoded());
117-
if (privateKey != null) {
118-
return privateKey;
119-
}
120-
} else if (readObject instanceof PrivateKeyInfo) {
121-
PrivateKeyInfo privateKeyInfo = (PrivateKeyInfo) readObject;
122-
PrivateKey privateKey = guessKey(privateKeyInfo.getEncoded());
123-
if (privateKey != null) {
124-
return privateKey;
125-
}
126-
} else if (readObject instanceof ASN1ObjectIdentifier) {
127-
// no idea how it can be used
128-
final ASN1ObjectIdentifier asn1ObjectIdentifier = (ASN1ObjectIdentifier) readObject;
129-
LOG.trace("Ignoring asn1ObjectIdentifier {}", asn1ObjectIdentifier);
130-
} else {
131-
LOG.warn("Unknown object '{}' from PEMParser", readObject);
113+
PrivateKeyInfo privateKeyInfo = getPrivateKeyInfoOrNull(readObject);
114+
if (privateKeyInfo != null) {
115+
return new JcaPEMKeyConverter().getPrivateKey(privateKeyInfo);
132116
}
133-
134117
readObject = pemParser.readObject();
135118
}
136119
}
137120

138121
return null;
139122
}
140123

124+
/**
125+
* Find a PrivateKeyInfo in the PEM object details. Returns null if the PEM object type is unknown.
126+
*/
141127
@CheckForNull
142-
public static PrivateKey guessKey(byte[] encodedKey) throws NoSuchAlgorithmException {
143-
//no way to know, so iterate
144-
for (String guessFactory : new String[]{"RSA", "ECDSA"}) {
145-
try {
146-
KeyFactory factory = KeyFactory.getInstance(guessFactory);
147-
148-
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedKey);
149-
return factory.generatePrivate(privateKeySpec);
150-
} catch (InvalidKeySpecException ignore) {
151-
}
128+
private static PrivateKeyInfo getPrivateKeyInfoOrNull(Object pemObject) throws NoSuchAlgorithmException {
129+
PrivateKeyInfo privateKeyInfo = null;
130+
if (pemObject instanceof PEMKeyPair) {
131+
PEMKeyPair pemKeyPair = (PEMKeyPair) pemObject;
132+
privateKeyInfo = pemKeyPair.getPrivateKeyInfo();
133+
} else if (pemObject instanceof PrivateKeyInfo) {
134+
privateKeyInfo = (PrivateKeyInfo) pemObject;
135+
} else if (pemObject instanceof ASN1ObjectIdentifier) {
136+
// no idea how it can be used
137+
final ASN1ObjectIdentifier asn1ObjectIdentifier = (ASN1ObjectIdentifier) pemObject;
138+
LOG.trace("Ignoring asn1ObjectIdentifier {}", asn1ObjectIdentifier);
139+
} else {
140+
LOG.warn("Unknown object '{}' from PEMParser", pemObject);
152141
}
153-
154-
return null;
142+
return privateKeyInfo;
155143
}
156144

157145
/**

0 commit comments

Comments
 (0)