Skip to content

Commit 7af2dbb

Browse files
committed
refactor,update: update dependencies, add logging and null checks, move SubjectCertificatePolicies to certifcate package
Signed-off-by: Mart Somermaa <[email protected]>
1 parent 99a0765 commit 7af2dbb

13 files changed

+41
-34
lines changed

pom.xml

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<modelVersion>4.0.0</modelVersion>
66
<artifactId>authtoken-validation</artifactId>
77
<groupId>org.webeid.security</groupId>
8-
<version>2.0.1-SNAPSHOT</version>
8+
<version>2.0.1</version>
99
<packaging>jar</packaging>
1010
<name>authtoken-validation</name>
1111
<description>Web eID authentication token validation library for Java</description>
@@ -14,12 +14,15 @@
1414
<maven.version>3.3.9</maven.version>
1515
<maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
1616
<java.version>1.8</java.version>
17-
<jjwt.version>0.11.2</jjwt.version>
18-
<slf4j.version>1.7.32</slf4j.version>
19-
<bouncycastle.version>1.69</bouncycastle.version>
20-
<junit-jupiter.version>5.8.1</junit-jupiter.version>
21-
<assertj.version>3.21.0</assertj.version>
22-
<mockito.version>4.0.0</mockito.version>
17+
<jjwt.version>0.11.5</jjwt.version>
18+
<jackson.version>2.13.3</jackson.version>
19+
<slf4j.version>1.7.36</slf4j.version>
20+
<bouncycastle.version>1.70</bouncycastle.version>
21+
<guava.version>31.1-jre</guava.version>
22+
<okhttp.version>4.10.0</okhttp.version>
23+
<junit-jupiter.version>5.8.2</junit-jupiter.version>
24+
<assertj.version>3.23.1</assertj.version>
25+
<mockito.version>4.6.1</mockito.version>
2326
<jacoco.version>0.8.5</jacoco.version>
2427
<sonar.coverage.jacoco.xmlReportPaths>
2528
${project.basedir}/../jacoco-coverage-report/target/site/jacoco-aggregate/jacoco.xml
@@ -37,22 +40,16 @@
3740
</properties>
3841

3942
<dependencies>
40-
<dependency>
41-
<groupId>io.jsonwebtoken</groupId>
42-
<artifactId>jjwt-api</artifactId>
43-
<version>${jjwt.version}</version>
44-
</dependency>
4543
<dependency>
4644
<groupId>io.jsonwebtoken</groupId>
4745
<artifactId>jjwt-impl</artifactId>
4846
<version>${jjwt.version}</version>
4947
</dependency>
5048
<dependency>
51-
<groupId>io.jsonwebtoken</groupId>
52-
<artifactId>jjwt-jackson</artifactId>
53-
<version>${jjwt.version}</version>
49+
<groupId>com.fasterxml.jackson.core</groupId>
50+
<artifactId>jackson-databind</artifactId>
51+
<version>${jackson.version}</version>
5452
</dependency>
55-
5653
<dependency>
5754
<groupId>org.slf4j</groupId>
5855
<artifactId>slf4j-api</artifactId>
@@ -61,7 +58,7 @@
6158
<dependency>
6259
<groupId>com.google.guava</groupId>
6360
<artifactId>guava</artifactId>
64-
<version>31.0.1-jre</version>
61+
<version>${guava.version}</version>
6562
</dependency>
6663
<dependency>
6764
<groupId>org.bouncycastle</groupId>
@@ -76,7 +73,7 @@
7673
<dependency>
7774
<groupId>com.squareup.okhttp3</groupId>
7875
<artifactId>okhttp</artifactId>
79-
<version>4.9.2</version>
76+
<version>${okhttp.version}</version>
8077
</dependency>
8178

8279
<dependency>

src/main/java/eu/webeid/security/util/SubjectCertificatePolicies.java renamed to src/main/java/eu/webeid/security/certificate/SubjectCertificatePolicies.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
* SOFTWARE.
2121
*/
2222

23-
package eu.webeid.security.util;
23+
package eu.webeid.security.certificate;
2424

2525
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
2626

src/main/java/eu/webeid/security/challenge/ChallengeNonce.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,16 @@
2323
package eu.webeid.security.challenge;
2424

2525
import java.time.ZonedDateTime;
26+
import java.util.Objects;
2627

2728
public class ChallengeNonce {
2829

2930
private final String base64EncodedNonce;
3031
private final ZonedDateTime expirationTime;
3132

3233
public ChallengeNonce(String base64EncodedNonce, ZonedDateTime expirationTime) {
33-
this.base64EncodedNonce = base64EncodedNonce;
34-
this.expirationTime = expirationTime;
34+
this.base64EncodedNonce = Objects.requireNonNull(base64EncodedNonce);
35+
this.expirationTime = Objects.requireNonNull(expirationTime);
3536
}
3637

3738
public ZonedDateTime getExpirationTime() {

src/main/java/eu/webeid/security/challenge/ChallengeNonceGeneratorBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public class ChallengeNonceGeneratorBuilder {
4444
* <p>
4545
* When the time-to-live passes, the nonce is considered to be expired.
4646
*
47-
* @param duration time-to-live duration
47+
* @param duration challenge nonce time-to-live duration
4848
* @return current builder instance
4949
*/
5050
public ChallengeNonceGeneratorBuilder withNonceTtl(Duration duration) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
package eu.webeid.security.validator;
2424

2525
import com.google.common.collect.Sets;
26-
import eu.webeid.security.util.SubjectCertificatePolicies;
26+
import eu.webeid.security.certificate.SubjectCertificatePolicies;
2727
import eu.webeid.security.validator.ocsp.service.DesignatedOcspServiceConfiguration;
2828
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
2929

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,8 @@ private X509Certificate validateToken(WebEidAuthToken token, String currentChall
159159
simpleSubjectCertificateValidators.executeFor(subjectCertificate);
160160
getCertTrustValidators().executeFor(subjectCertificate);
161161

162-
// It is guaranteed that if the signature verification succeeds, then the origin, challenge
163-
// and, if part of the signature, origin certificate have been implicitly and correctly verified
164-
// without the need to implement any additional checks.
162+
// It is guaranteed that if the signature verification succeeds, then the origin and challenge
163+
// have been implicitly and correctly verified without the need to implement any additional checks.
165164
authTokenSignatureValidator.validate(token.getAlgorithm(),
166165
token.getSignature(),
167166
subjectCertificate.getPublicKey(),

src/main/java/eu/webeid/security/validator/certvalidators/SubjectCertificatePolicyValidator.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import org.bouncycastle.cert.jcajce.JcaX509ExtensionUtils;
3131
import eu.webeid.security.exceptions.UserCertificateDisallowedPolicyException;
3232
import eu.webeid.security.exceptions.UserCertificateParseException;
33+
import org.slf4j.Logger;
34+
import org.slf4j.LoggerFactory;
3335

3436
import java.io.IOException;
3537
import java.security.cert.X509Certificate;
@@ -39,6 +41,8 @@
3941

4042
public final class SubjectCertificatePolicyValidator {
4143

44+
private static final Logger LOG = LoggerFactory.getLogger(SubjectCertificatePolicyValidator.class);
45+
4246
private final Collection<ASN1ObjectIdentifier> disallowedSubjectCertificatePolicies;
4347

4448
public SubjectCertificatePolicyValidator(Collection<ASN1ObjectIdentifier> disallowedSubjectCertificatePolicies) {
@@ -68,5 +72,6 @@ public void validateCertificatePolicies(X509Certificate subjectCertificate) thro
6872
} catch (IOException e) {
6973
throw new UserCertificateParseException(e);
7074
}
75+
LOG.debug("User certificate does not contain disallowed policies.");
7176
}
7277
}

src/main/java/eu/webeid/security/validator/certvalidators/SubjectCertificatePurposeValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ public static void validateCertificatePurpose(X509Certificate subjectCertificate
5353
if (!usages.contains(EXTENDED_KEY_USAGE_CLIENT_AUTHENTICATION)) {
5454
throw new UserCertificateWrongPurposeException();
5555
}
56-
LOG.debug("User certificate can be used for client authentication.");
5756
} catch (CertificateParsingException e) {
5857
throw new UserCertificateParseException(e);
5958
}
59+
LOG.debug("User certificate can be used for client authentication.");
6060
}
6161

6262
private SubjectCertificatePurposeValidator() {

src/test/java/eu/webeid/security/challenge/ChallengeNonceGeneratorTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
package eu.webeid.security.challenge;
2424

25+
import eu.webeid.security.exceptions.AuthTokenException;
2526
import org.junit.jupiter.api.Test;
2627
import eu.webeid.security.exceptions.ChallengeNonceExpiredException;
2728
import eu.webeid.security.exceptions.ChallengeNonceNotFoundException;
@@ -35,14 +36,17 @@ class ChallengeNonceGeneratorTest {
3536
final ChallengeNonceStore challengeNonceStore = new InMemoryChallengeNonceStore();
3637

3738
@Test
38-
void validateNonceGeneration() {
39+
void validateNonceGeneration() throws AuthTokenException {
3940
final ChallengeNonceGenerator challengeNonceGenerator = new ChallengeNonceGeneratorBuilder()
4041
.withChallengeNonceStore(challengeNonceStore)
4142
.withNonceTtl(Duration.ofSeconds(1))
4243
.build();
4344

4445
final ChallengeNonce nonce1 = challengeNonceGenerator.generateAndStoreNonce();
4546
final ChallengeNonce nonce2 = challengeNonceGenerator.generateAndStoreNonce();
47+
final ChallengeNonce nonce2fromStore = challengeNonceStore.getAndRemove();
48+
49+
assertThat(nonce2).isEqualTo(nonce2fromStore);
4650

4751
assertThat(nonce1.getBase64EncodedNonce())
4852
.hasSize(44) // Base64-encoded 32 bytes

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ void whenCertificateFieldIsArray_thenParsingFails() throws AuthTokenException {
9797
.hasMessage("Error parsing Web eID authentication token")
9898
.getCause()
9999
.isInstanceOf(MismatchedInputException.class)
100-
.hasMessageStartingWith("Cannot deserialize instance of `java.lang.String` out of START_ARRAY token");
100+
.hasMessageStartingWith("Cannot deserialize value of type `java.lang.String` from Array value");
101101
}
102102

103103
@Test
@@ -211,15 +211,17 @@ void whenUserCertificateIsNotYetValid_thenValidationFails() {
211211
mockDate("2018-10-17");
212212
assertThatThrownBy(() -> validator
213213
.validate(validAuthToken, VALID_CHALLENGE_NONCE))
214-
.isInstanceOf(CertificateNotYetValidException.class);
214+
.isInstanceOf(CertificateNotYetValidException.class)
215+
.hasMessage("User certificate is not yet valid");
215216
}
216217

217218
@Test
218219
void whenTrustedCACertificateIsNotYetValid_thenValidationFails() {
219220
mockDate("2018-08-17");
220221
assertThatThrownBy(() -> validator
221222
.validate(validAuthToken, VALID_CHALLENGE_NONCE))
222-
.isInstanceOf(CertificateNotYetValidException.class);
223+
.isInstanceOf(CertificateNotYetValidException.class)
224+
.hasMessage("Trusted CA certificate is not yet valid");
223225
}
224226

225227
@Test

0 commit comments

Comments
 (0)