Skip to content

Commit 44dd2ab

Browse files
committed
PR feedback
1 parent 23ccdc8 commit 44dd2ab

3 files changed

Lines changed: 35 additions & 8 deletions

File tree

src/main/java/de/rwth/idsg/steve/service/CertificateSigningServiceLocal.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454

5555
import java.io.InputStreamReader;
5656
import java.math.BigInteger;
57-
import java.security.PrivateKey;
5857
import java.security.PublicKey;
5958
import java.security.SecureRandom;
6059
import java.security.cert.X509Certificate;
@@ -66,6 +65,7 @@
6665
import java.util.List;
6766

6867
import static de.rwth.idsg.steve.utils.CertificateUtils.certificatesToPEM;
68+
import static de.rwth.idsg.steve.utils.CertificateUtils.isSameKeyFamily;
6969
import static de.rwth.idsg.steve.utils.CertificateUtils.resolveSignatureAlgorithm;
7070
import static java.nio.charset.StandardCharsets.UTF_8;
7171
import static jooq.steve.db.enums.CertificateSignatureAlgorithm.ECDSA;
@@ -295,6 +295,7 @@ private void loadIssuer(ResourceLoader resourceLoader,
295295
certificateSignatureAlgorithm
296296
);
297297

298+
issuer.validateFamily();
298299
issuer.validateCaCertificate();
299300
issuer.validateCertificateChain();
300301

@@ -335,11 +336,6 @@ private CertificateIssuerMaterial selectIssuer(PKCS10CertificationRequest csr, S
335336
);
336337
}
337338

338-
private static boolean isSameKeyFamily(PublicKey publicKey, PrivateKey privateKey) {
339-
return (publicKey instanceof RSAPublicKey && "RSA".equalsIgnoreCase(privateKey.getAlgorithm()))
340-
|| (publicKey instanceof ECPublicKey && ("EC".equalsIgnoreCase(privateKey.getAlgorithm()) || "ECDSA".equalsIgnoreCase(privateKey.getAlgorithm())));
341-
}
342-
343339
private List<X509Certificate> loadIssuerCertificateChain(ResourceLoader resourceLoader,
344340
X509Certificate caCertificate,
345341
String caChainPem) throws Exception {

src/main/java/de/rwth/idsg/steve/utils/CertificateIssuerMaterial.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@
2727
import java.util.Arrays;
2828
import java.util.List;
2929

30+
import static de.rwth.idsg.steve.utils.CertificateUtils.isECDSAFamily;
31+
import static de.rwth.idsg.steve.utils.CertificateUtils.isRSAFamily;
3032
import static de.rwth.idsg.steve.utils.CertificateUtils.resolveSignatureAlgorithm;
33+
import static org.bouncycastle.jce.provider.BouncyCastleProvider.PROVIDER_NAME;
3134

3235
/**
3336
* @author Sevket Goekay <sevketgokay@gmail.com>
@@ -41,6 +44,21 @@ public record CertificateIssuerMaterial(
4144
String certificateSignatureAlgorithm
4245
) {
4346

47+
public void validateFamily() {
48+
switch (name) {
49+
case RSA -> {
50+
if (!isRSAFamily(caCertificate.getPublicKey(), caPrivateKey)) {
51+
throw new IllegalArgumentException("Configured '" + name + "' entry does not contain '" + name + "' CA certificate and/or private-key");
52+
}
53+
}
54+
case ECDSA -> {
55+
if (!isECDSAFamily(caCertificate.getPublicKey(), caPrivateKey)) {
56+
throw new IllegalArgumentException("Configured '" + name + "' entry does not contain '" + name + "' CA certificate and/or private-key");
57+
}
58+
}
59+
}
60+
}
61+
4462
public void validateCaCertificate() throws Exception {
4563
if (caCertificate.getBasicConstraints() < 0) {
4664
throw new IllegalArgumentException("Configured CA certificate for issuer '" + name + "' is not a CA certificate (basicConstraints CA=true required)");
@@ -54,12 +72,12 @@ public void validateCaCertificate() throws Exception {
5472
String checkAlgorithm = resolveSignatureAlgorithm(caPrivateKey);
5573
byte[] dummyProbeData = "certificate-key-pair-check".getBytes(StandardCharsets.UTF_8);
5674

57-
Signature signer = Signature.getInstance(checkAlgorithm);
75+
Signature signer = Signature.getInstance(checkAlgorithm, PROVIDER_NAME);
5876
signer.initSign(caPrivateKey);
5977
signer.update(dummyProbeData);
6078
byte[] signature = signer.sign();
6179

62-
Signature verifier = Signature.getInstance(checkAlgorithm);
80+
Signature verifier = Signature.getInstance(checkAlgorithm, PROVIDER_NAME);
6381
verifier.initVerify(caCertificate.getPublicKey());
6482
verifier.update(dummyProbeData);
6583

src/main/java/de/rwth/idsg/steve/utils/CertificateUtils.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import java.net.URLDecoder;
4343
import java.nio.charset.StandardCharsets;
4444
import java.security.PrivateKey;
45+
import java.security.PublicKey;
4546
import java.security.Security;
4647
import java.security.cert.CertificateEncodingException;
4748
import java.security.cert.CertificateFactory;
@@ -148,6 +149,18 @@ public static String resolveSignatureAlgorithm(PrivateKey privateKey) {
148149
throw new IllegalArgumentException("Unsupported signing private key algorithm: " + keyAlgorithm);
149150
}
150151

152+
public static boolean isRSAFamily(PublicKey publicKey, PrivateKey privateKey) {
153+
return publicKey instanceof RSAPublicKey && "RSA".equalsIgnoreCase(privateKey.getAlgorithm());
154+
}
155+
156+
public static boolean isECDSAFamily(PublicKey publicKey, PrivateKey privateKey) {
157+
return publicKey instanceof ECPublicKey && ("EC".equalsIgnoreCase(privateKey.getAlgorithm()) || "ECDSA".equalsIgnoreCase(privateKey.getAlgorithm()));
158+
}
159+
160+
public static boolean isSameKeyFamily(PublicKey publicKey, PrivateKey privateKey) {
161+
return isRSAFamily(publicKey, privateKey) || isECDSAFamily(publicKey, privateKey);
162+
}
163+
151164
public static String certificatesToPEM(List<X509Certificate> chain) throws Exception {
152165
var sw = new StringWriter();
153166
try (var pemWriter = new JcaPEMWriter(sw)) {

0 commit comments

Comments
 (0)