Skip to content

Commit 970edc2

Browse files
NFC-46 Fix and update same authority certs checks.
1 parent c8e2c85 commit 970edc2

File tree

2 files changed

+13
-16
lines changed

2 files changed

+13
-16
lines changed

src/main/java/eu/webeid/security/validator/AuthTokenV11Validator.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,10 @@
88
import eu.webeid.security.validator.certvalidators.SubjectCertificateValidatorBatch;
99
import eu.webeid.security.validator.ocsp.OcspClient;
1010
import eu.webeid.security.validator.ocsp.OcspServiceProvider;
11-
import org.bouncycastle.asn1.x509.Extension;
1211

1312
import java.security.cert.CertStore;
1413
import java.security.cert.TrustAnchor;
1514
import java.security.cert.X509Certificate;
16-
import java.util.Arrays;
1715
import java.util.List;
1816
import java.util.Set;
1917

@@ -29,6 +27,7 @@ class AuthTokenV11Validator extends AuthTokenV1Validator {
2927
"SHA3-224", "SHA3-256", "SHA3-384", "SHA3-512"
3028
);
3129
private static final int KEY_USAGE_NON_REPUDIATION = 1;
30+
private static final int KEY_USAGE_DIGITAL_SIGNATURE = 0;
3231

3332
public AuthTokenV11Validator(
3433
SubjectCertificateValidatorBatch simpleSubjectCertificateValidators,
@@ -74,15 +73,13 @@ public X509Certificate validate(WebEidAuthToken token, String currentChallengeNo
7473
throw new AuthTokenParseException("Signing certificate subject does not match authentication certificate subject");
7574
}
7675

77-
byte[] subjectSki = subjectCertificate.getExtensionValue(Extension.subjectKeyIdentifier.getId());
78-
byte[] signingAki = signingCertificate.getExtensionValue(Extension.authorityKeyIdentifier.getId());
79-
if (subjectSki != null && signingAki != null && !Arrays.equals(subjectSki, signingAki)) {
80-
throw new AuthTokenParseException("Signing certificate not issued by same authority as authentication certificate");
76+
if (!subjectCertificate.getIssuerX500Principal().equals(signingCertificate.getIssuerX500Principal())) {
77+
throw new AuthTokenParseException("Signing and authentication certificates are not issued by the same authority");
8178
}
8279

8380
boolean[] keyUsage = signingCertificate.getKeyUsage();
84-
if (keyUsage == null || keyUsage.length <= KEY_USAGE_NON_REPUDIATION || !keyUsage[KEY_USAGE_NON_REPUDIATION]) {
85-
throw new AuthTokenParseException("Signing certificate does not have nonRepudiation key usage");
81+
if (keyUsage == null || (keyUsage.length > KEY_USAGE_NON_REPUDIATION && !keyUsage[KEY_USAGE_NON_REPUDIATION] && !keyUsage[KEY_USAGE_DIGITAL_SIGNATURE])) {
82+
throw new AuthTokenParseException("Signing certificate not suitable for signing");
8683
}
8784

8885
return subjectCertificate;

src/test/java/eu/webeid/security/validator/AuthTokenCertificateTest.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
import eu.webeid.security.validator.certvalidators.SubjectCertificateValidatorBatch;
4646
import eu.webeid.security.validator.ocsp.OcspClient;
4747
import eu.webeid.security.validator.ocsp.OcspServiceProvider;
48-
import org.bouncycastle.asn1.x509.Extension;
4948
import org.junit.jupiter.api.AfterEach;
5049
import org.junit.jupiter.api.BeforeEach;
5150
import org.junit.jupiter.api.Disabled;
@@ -409,8 +408,9 @@ void whenV11SigningCertificateNotIssuedBySameAuthority_thenValidationFails() thr
409408

410409
X509Certificate mockSigningCert = mock(X509Certificate.class);
411410
when(mockSigningCert.getSubjectX500Principal()).thenReturn(realSubjectCert.getSubjectX500Principal());
412-
when(mockSigningCert.getExtensionValue(Extension.authorityKeyIdentifier.getId()))
413-
.thenReturn(new byte[]{0x01, 0x02});
411+
when(mockSigningCert.getIssuerX500Principal()).thenReturn(
412+
new javax.security.auth.x500.X500Principal("CN=Other Test CA, O=Other Org, C=EE")
413+
);
414414

415415
try (MockedStatic<CertificateLoader> mocked = mockStatic(CertificateLoader.class)) {
416416
mocked.when(() -> CertificateLoader.decodeCertificateFromBase64(parsedToken.getUnverifiedCertificate()))
@@ -420,21 +420,21 @@ void whenV11SigningCertificateNotIssuedBySameAuthority_thenValidationFails() thr
420420

421421
assertThatThrownBy(() -> spyValidator.validate(parsedToken, VALID_CHALLENGE_NONCE))
422422
.isInstanceOf(AuthTokenParseException.class)
423-
.hasMessage("Signing certificate not issued by same authority as authentication certificate");
423+
.hasMessage("Signing and authentication certificates are not issued by the same authority");
424424
}
425425
}
426426

427-
428427
@Test
429-
void whenV11SigningCertificateHasNoNonRepudiationUsage_thenValidationFails() throws Exception {
428+
void whenV11SigningCertificateNotSuitableForSigning_thenValidationFails() throws Exception {
430429
AuthTokenV11Validator spyValidator = spyAuthTokenV11Validator();
431430
WebEidAuthToken parsedToken = OBJECT_READER.readValue(V11_AUTH_TOKEN, WebEidAuthToken.class);
432431
X509Certificate realSubjectCert = CertificateLoader.decodeCertificateFromBase64(parsedToken.getUnverifiedCertificate());
433432
doReturn(realSubjectCert).when(spyValidator).validateV1(any(), any());
434433

435434
X509Certificate signingCert = mock(X509Certificate.class);
436435
when(signingCert.getSubjectX500Principal()).thenReturn(realSubjectCert.getSubjectX500Principal());
437-
when(signingCert.getKeyUsage()).thenReturn(new boolean[]{true, false});
436+
when(signingCert.getIssuerX500Principal()).thenReturn(realSubjectCert.getIssuerX500Principal());
437+
when(signingCert.getKeyUsage()).thenReturn(new boolean[]{false, false});
438438

439439
try (MockedStatic<CertificateLoader> mocked = mockStatic(CertificateLoader.class)) {
440440
mocked.when(() -> CertificateLoader.decodeCertificateFromBase64(parsedToken.getUnverifiedCertificate()))
@@ -444,7 +444,7 @@ void whenV11SigningCertificateHasNoNonRepudiationUsage_thenValidationFails() thr
444444

445445
assertThatThrownBy(() -> spyValidator.validate(parsedToken, VALID_CHALLENGE_NONCE))
446446
.isInstanceOf(AuthTokenParseException.class)
447-
.hasMessage("Signing certificate does not have nonRepudiation key usage");
447+
.hasMessage("Signing certificate not suitable for signing");
448448
}
449449
}
450450

0 commit comments

Comments
 (0)