Skip to content

Commit dc17996

Browse files
authored
Fix/x5c Field corrected (#35)
* X5C Array inserted * Certificate Chain from Keystore refactored.
1 parent 8d0193f commit dc17996

File tree

9 files changed

+37
-19
lines changed

9 files changed

+37
-19
lines changed

src/main/java/eu/europa/ec/dgc/validation/decorator/dto/IdentityResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public static final class VerificationIdentityResponse {
5353
@Data
5454
public static final class PublicKeyJwkIdentityResponse {
5555

56-
private String x5c;
56+
private String[] x5c;
5757

5858
private String kid;
5959

src/main/java/eu/europa/ec/dgc/validation/decorator/entity/ValidationServiceIdentityResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public static final class VerificationMethod {
4848
@Data
4949
public static final class PublicKeyJwk {
5050

51-
private String x5c;
51+
private String[] x5c;
5252

5353
private String kid;
5454

src/main/java/eu/europa/ec/dgc/validation/decorator/service/AccessTokenService.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,8 @@ public String buildAccessToken(final AccessTokenPayload payload) {
119119
*/
120120
public Map<String, Object> parseAccessToken(final String token) {
121121
final String activeSignKey = this.keyProvider.getActiveSignKey();
122-
final PublicKey publicKey = this.keyProvider.receiveCertificate(activeSignKey).getPublicKey();
122+
final PublicKey publicKey = this.keyProvider.receiveCertificate(activeSignKey)[0].getPublicKey();
123123
final String issuer = this.properties.getToken().getIssuer();
124-
125124
final Map<String, Object> body = this.parseAccessToken(token, publicKey, issuer);
126125
if (!body.containsKey("sub")) {
127126
throw new DccException("Token invalid: subjet not found");

src/main/java/eu/europa/ec/dgc/validation/decorator/service/BackendService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ private PublicKey getSignPublicKey(final ServiceProperties service, final String
111111
}
112112

113113
private PublicKey toPublicKey(final PublicKeyJwk publicKeyJwk) {
114-
final byte[] encoded = Base64.getDecoder().decode(publicKeyJwk.getX5c());
114+
final byte[] encoded = Base64.getDecoder().decode(publicKeyJwk.getX5c()[0]);
115115
try (ByteArrayInputStream encStream = new ByteArrayInputStream(encoded)) {
116116
return CertificateFactory.getInstance("X.509").generateCertificate(encStream).getPublicKey();
117117
} catch (CertificateException e) {

src/main/java/eu/europa/ec/dgc/validation/decorator/service/IdentityService.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import io.vavr.collection.Stream;
3333
import java.security.cert.Certificate;
3434
import java.security.cert.CertificateEncodingException;
35+
import java.util.ArrayList;
3536
import java.util.Base64;
3637
import java.util.List;
3738
import java.util.stream.Collectors;
@@ -123,10 +124,18 @@ private List<ServiceIdentityResponse> getServices(final String element, final St
123124
}
124125

125126
private PublicKeyJwkIdentityResponse buildPublicKey(String keyName) {
126-
final Certificate certificate = keyProvider.receiveCertificate(keyName);
127+
final Certificate[] certificate = keyProvider.receiveCertificate(keyName);
128+
if (certificate == null) {
129+
return null;
130+
}
127131
try {
128132
final PublicKeyJwkIdentityResponse publicKeyJwk = new PublicKeyJwkIdentityResponse();
129-
publicKeyJwk.setX5c(Base64.getEncoder().encodeToString(certificate.getEncoded()));
133+
List<String> x5c = new ArrayList<String>();
134+
for (Certificate cert : certificate) {
135+
x5c.add(Base64.getEncoder().encodeToString(cert.getEncoded()));
136+
}
137+
138+
publicKeyJwk.setX5c(x5c.toArray(new String[0]));
130139
publicKeyJwk.setKid(keyProvider.getKid(keyName));
131140
publicKeyJwk.setAlg(keyProvider.getAlg(keyName));
132141
publicKeyJwk.setUse(keyProvider.getKeyUse(keyName).name().toLowerCase());

src/main/java/eu/europa/ec/dgc/validation/decorator/service/KeyProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
public interface KeyProvider {
3030

31-
Certificate receiveCertificate(String keyName);
31+
Certificate[] receiveCertificate(String keyName);
3232

3333
PrivateKey receivePrivateKey(String keyName);
3434

src/main/java/eu/europa/ec/dgc/validation/decorator/service/KeyStoreKeyProvider.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
import java.security.cert.CertificateException;
4343
import java.security.cert.X509Certificate;
4444
import java.util.ArrayList;
45+
import java.util.Arrays;
46+
import java.util.Collection;
4547
import java.util.HashMap;
4648
import java.util.List;
4749
import java.util.Map;
@@ -58,7 +60,7 @@ public class KeyStoreKeyProvider implements KeyProvider {
5860

5961
private final DgcProperties dgcConfigProperties;
6062

61-
private final Map<String, Certificate> certificates = new HashMap<>();
63+
private final Map<String, Certificate[]> certificates = new HashMap<>();
6264

6365
private final Map<String, PrivateKey> privateKeys = new HashMap<>();
6466

@@ -98,23 +100,31 @@ public void createKeys() throws NoSuchAlgorithmException, IOException, Certifica
98100
final char[] privateKeyPassword = this.dgcConfigProperties.getPrivateKeyPassword().toCharArray();
99101
keyStore.load(is, privateKeyPassword);
100102
final KeyStore.PasswordProtection keyPassword = new KeyStore.PasswordProtection(keyStorePassword);
101-
102-
for (final String alias : this.getKeyNames(KeyType.ALL)) {
103+
String[] keyNames = this.getKeyNames(KeyType.ALL).toArray(new String[0]);
104+
Arrays.sort(keyNames);
105+
for (final String alias :keyNames) {
103106
if (keyStore.isKeyEntry(alias)) {
104107
final PrivateKeyEntry privateKeyEntry = (PrivateKeyEntry) keyStore.getEntry(alias, keyPassword);
105108
if (privateKeyEntry != null) {
106109
final PrivateKey privateKey = privateKeyEntry.getPrivateKey();
107110
this.privateKeys.put(alias, privateKey);
108111
}
109112
}
110-
final X509Certificate cert = (X509Certificate) keyStore.getCertificate(alias);
111-
this.handleCertificate(alias, cert);
113+
final Certificate cert = keyStore.getCertificate(alias);
114+
List<Certificate> certificates = new ArrayList<Certificate>();
115+
if (keyStore.getCertificateChain(alias) != null) {
116+
certificates.addAll(Arrays.asList(keyStore.getCertificateChain(alias)));
117+
} else {
118+
certificates.add(cert);
119+
}
120+
this.handleCertificate(alias, certificates.toArray(new X509Certificate[0]));
112121
}
113122
}
114123
}
115124

116-
private void handleCertificate(final String alias, final X509Certificate cert) {
117-
this.certificates.put(alias, cert);
125+
private void handleCertificate(final String alias, final Certificate[] certs) {
126+
X509Certificate cert = (X509Certificate)certs[0];
127+
this.certificates.put(alias,certs);
118128

119129
final String kid = new CertificateUtils().getCertKid((X509Certificate) cert);
120130
this.kids.put(alias, kid);
@@ -132,7 +142,7 @@ private void handleCertificate(final String alias, final X509Certificate cert) {
132142
}
133143

134144
@Override
135-
public Certificate receiveCertificate(final String keyName) {
145+
public Certificate[] receiveCertificate(final String keyName) {
136146
return this.certificates.get(keyName);
137147
}
138148

src/main/java/eu/europa/ec/dgc/validation/decorator/service/ValidationStatusService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ private PublicKey getSignPublicKey(final ServiceProperties service, final String
187187
}
188188

189189
private PublicKey toPublicKey(final PublicKeyJwk publicKeyJwk) {
190-
final byte[] encoded = Base64.getDecoder().decode(publicKeyJwk.getX5c());
190+
final byte[] encoded = Base64.getDecoder().decode(publicKeyJwk.getX5c()[0]);
191191
try (ByteArrayInputStream encStream = new ByteArrayInputStream(encoded)) {
192192
return CertificateFactory.getInstance("X.509").generateCertificate(encStream).getPublicKey();
193193
} catch (CertificateException e) {

src/test/java/eu/europa/ec/dgc/validation/decorator/util/TestHelper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public static ValidationServiceIdentityResponse buildValidationServiceIdentity()
8989
publicKeyJwk.setUse("sig");
9090
publicKeyJwk.setAlg("ES256");
9191
publicKeyJwk.setKid("MFkwEwYHKu+=");
92-
publicKeyJwk.setX5c("MIIB4DCCAYegAwIBAgIUVuls/1X3r1LY9+KcbRnX1ixbl8YwCgYIKoZIzj0EAwIw"
92+
publicKeyJwk.setX5c(new String[]{"MIIB4DCCAYegAwIBAgIUVuls/1X3r1LY9+KcbRnX1ixbl8YwCgYIKoZIzj0EAwIw"
9393
+ "RTELMAkGA1UEBhMCREUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu"
9494
+ "dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAgFw0yMTA5MjMwODMxMDRaGA8yMTIwMDQx"
9595
+ "NzA4MzEwNFowRTELMAkGA1UEBhMCREUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAf"
@@ -99,7 +99,7 @@ public static ValidationServiceIdentityResponse buildValidationServiceIdentity()
9999
+ "G+x2DPISjaXTWsTOdDAfBgNVHSMEGDAWgBSaqFjzps1qG+x2DPISjaXTWsTOdDAP"
100100
+ "BgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIC/VAxhYH0HGDgcHIJwJ"
101101
+ "QXgThit8ZVqAxwzcK2/CUZPRAiASv2PY68vYaHSUZSICg80zO3puKPfum9126fmU"
102-
+ "4LlytA==");
102+
+ "4LlytA=="});
103103

104104
final VerificationMethod sig = new VerificationMethod();
105105
sig.setType("JsonWebKey2020");

0 commit comments

Comments
 (0)