Skip to content

Commit 63aeb2f

Browse files
authored
Merge pull request #567 from sigstore/fix-cert-fuzzer
Use stricter PEMParser instead of PemReader
2 parents eaae62c + f9469a0 commit 63aeb2f

File tree

1 file changed

+22
-21
lines changed

1 file changed

+22
-21
lines changed

sigstore-java/src/main/java/dev/sigstore/encryption/certificates/Certificates.java

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package dev.sigstore.encryption.certificates;
1717

18-
import com.google.api.client.util.PemReader;
1918
import com.google.common.collect.ImmutableList;
2019
import java.io.ByteArrayInputStream;
2120
import java.io.IOException;
@@ -27,7 +26,11 @@
2726
import java.util.Collections;
2827
import java.util.List;
2928
import java.util.Optional;
29+
import org.bouncycastle.cert.X509CertificateHolder;
30+
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
31+
import org.bouncycastle.openssl.PEMParser;
3032
import org.bouncycastle.openssl.jcajce.JcaPEMWriter;
33+
import org.bouncycastle.util.encoders.DecoderException;
3134

3235
public class Certificates {
3336

@@ -96,36 +99,34 @@ public static byte[] toPemBytes(CertPath certs) throws IOException {
9699

97100
/** Convert a PEM encoded certificate chain to a {@link CertPath}. */
98101
public static CertPath fromPemChain(String certs) throws CertificateException {
99-
PemReader pemReader = null;
100-
try {
101-
pemReader = new PemReader(new StringReader(certs));
102-
CertificateFactory cf = CertificateFactory.getInstance("X.509");
102+
try (PEMParser pemParser = new PEMParser(new StringReader(certs))) {
103103
ArrayList<X509Certificate> certList = new ArrayList<>();
104104
while (true) {
105105
try {
106-
PemReader.Section section = pemReader.readNextSection();
106+
var section = pemParser.readObject(); // throws DecoderException
107107
if (section == null) {
108108
break;
109109
}
110-
byte[] certBytes = section.getBase64DecodedBytes();
111-
certList.add(
112-
(X509Certificate) cf.generateCertificate(new ByteArrayInputStream(certBytes)));
113-
} catch (IOException | IllegalArgumentException ioe) {
114-
throw new CertificateParsingException("Error reading PEM section in cert chain", ioe);
110+
if (section instanceof X509CertificateHolder) {
111+
var certificate =
112+
new JcaX509CertificateConverter().getCertificate((X509CertificateHolder) section);
113+
certList.add(certificate);
114+
} else {
115+
throw new CertificateException(
116+
"Unsupported pem section: "
117+
+ section.getClass().toString()
118+
+ " is not an X509Certificate");
119+
}
120+
} catch (IOException | DecoderException e) {
121+
throw new CertificateException("failed to parse PEM object to certificate", e);
115122
}
116123
}
117124
if (certList.isEmpty()) {
118-
throw new CertificateParsingException("no valid PEM certificates were found");
119-
}
120-
return cf.generateCertPath(certList);
121-
} finally {
122-
if (pemReader != null) {
123-
try {
124-
pemReader.close();
125-
} catch (IOException e) {
126-
// ignored
127-
}
125+
throw new CertificateException("no valid PEM certificates were found");
128126
}
127+
return CertificateFactory.getInstance("X.509").generateCertPath(certList);
128+
} catch (IOException e) {
129+
throw new CertificateException("failed to close PEM parser", e);
129130
}
130131
}
131132

0 commit comments

Comments
 (0)