Skip to content

Commit b16d415

Browse files
committed
Moved Jwts.* and Jwks.* Request builder static factory methods to their respective interfaces for more idiomatic lookup with Java 8+ interface static methods.
1 parent 5c7e056 commit b16d415

23 files changed

+268
-234
lines changed

api/src/main/java/io/jsonwebtoken/Jwts.java

Lines changed: 0 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -20,27 +20,16 @@
2020
import io.jsonwebtoken.lang.Classes;
2121
import io.jsonwebtoken.lang.Registry;
2222
import io.jsonwebtoken.security.AeadAlgorithm;
23-
import io.jsonwebtoken.security.AeadRequest;
24-
import io.jsonwebtoken.security.AeadResult;
25-
import io.jsonwebtoken.security.DecryptAeadRequest;
26-
import io.jsonwebtoken.security.DecryptionKeyRequest;
2723
import io.jsonwebtoken.security.KeyAlgorithm;
2824
import io.jsonwebtoken.security.KeyPairBuilderSupplier;
29-
import io.jsonwebtoken.security.KeyRequest;
3025
import io.jsonwebtoken.security.MacAlgorithm;
3126
import io.jsonwebtoken.security.Password;
32-
import io.jsonwebtoken.security.Request;
3327
import io.jsonwebtoken.security.SecretKeyAlgorithm;
3428
import io.jsonwebtoken.security.SecureDigestAlgorithm;
35-
import io.jsonwebtoken.security.SecureRequest;
3629
import io.jsonwebtoken.security.SignatureAlgorithm;
37-
import io.jsonwebtoken.security.VerifyDigestRequest;
38-
import io.jsonwebtoken.security.VerifySecureDigestRequest;
3930
import io.jsonwebtoken.security.X509Builder;
4031

4132
import javax.crypto.SecretKey;
42-
import java.io.InputStream;
43-
import java.io.OutputStream;
4433
import java.security.Key;
4534
import java.security.PrivateKey;
4635
import java.security.PublicKey;
@@ -93,18 +82,6 @@ public static final class ENC {
9382
private static final String IMPL_CLASSNAME = "io.jsonwebtoken.impl.security.StandardEncryptionAlgorithms";
9483
private static final Registry<String, AeadAlgorithm> REGISTRY = Classes.newInstance(IMPL_CLASSNAME);
9584

96-
// @since 0.13.0
97-
private static final Supplier<AeadRequest.Builder> REQUEST_BUILDER_SUPPLIER =
98-
Classes.newInstance("io.jsonwebtoken.impl.security.DefaultAeadRequest$Builder$Supplier");
99-
100-
// @since 0.13.0
101-
private static final Supplier<DecryptAeadRequest.Builder> DECRYPT_REQUEST_BUILDER_SUPPLIER =
102-
Classes.newInstance("io.jsonwebtoken.impl.security.DefaultDecryptAeadRequest$Builder$Supplier");
103-
104-
// @since 0.13.0
105-
private static final Supplier<AeadResult.Builder> RESULT_BUILDER_SUPPLIER =
106-
Classes.newInstance("io.jsonwebtoken.impl.security.DefaultAeadResult$Builder$Supplier");
107-
10885
/**
10986
* Returns all standard JWA <a href="https://www.rfc-editor.org/rfc/rfc7518.html#section-5">Cryptographic
11087
* Algorithms for Content Encryption</a> defined in the
@@ -162,42 +139,6 @@ private ENC() {
162139
* algorithm requires a 256-bit (32 byte) key.
163140
*/
164141
public static final AeadAlgorithm A256GCM = get().forKey("A256GCM");
165-
166-
/**
167-
* Returns a new builder to create {@link AeadRequest}s used for AEAD encryption via
168-
* {@link AeadAlgorithm#encrypt(AeadRequest, AeadResult)}
169-
*
170-
* @return a new builder to create {@link AeadRequest}s used for AEAD encryption via
171-
* {@link AeadAlgorithm#encrypt(AeadRequest, AeadResult)}
172-
* @since 0.13.0
173-
*/
174-
public static AeadRequest.Builder request() {
175-
return REQUEST_BUILDER_SUPPLIER.get();
176-
}
177-
178-
/**
179-
* Returns a new builder to create {@link DecryptAeadRequest}s used for AEAD decryption via
180-
* {@link AeadAlgorithm#decrypt(DecryptAeadRequest, OutputStream)}
181-
*
182-
* @return a new builder to create {@link DecryptAeadRequest}s used for AEAD decryption via
183-
* {@link AeadAlgorithm#decrypt(DecryptAeadRequest, OutputStream)}
184-
* @since 0.13.0
185-
*/
186-
public static DecryptAeadRequest.Builder decryptRequest() {
187-
return DECRYPT_REQUEST_BUILDER_SUPPLIER.get();
188-
}
189-
190-
/**
191-
* Returns a new builder to create {@link AeadResult}s used to store AEAD encryption results when calling
192-
* {@link AeadAlgorithm#encrypt(AeadRequest, AeadResult)}
193-
*
194-
* @return a new builder to create {@link AeadResult}s used to store AEAD encryption results when calling
195-
* {@link AeadAlgorithm#encrypt(AeadRequest, AeadResult)}
196-
* @since 0.13.0
197-
*/
198-
public static AeadResult.Builder result() {
199-
return RESULT_BUILDER_SUPPLIER.get();
200-
}
201142
}
202143

203144
/**
@@ -221,14 +162,6 @@ public static final class SIG {
221162
private static final String IMPL_CLASSNAME = "io.jsonwebtoken.impl.security.StandardSecureDigestAlgorithms";
222163
private static final Registry<String, SecureDigestAlgorithm<?, ?>> REGISTRY = Classes.newInstance(IMPL_CLASSNAME);
223164

224-
// @since 0.13.0
225-
private static final Supplier<SecureRequest.Builder<InputStream, ?>> REQUEST_BUILDER_SUPPLIER =
226-
Classes.newInstance("io.jsonwebtoken.impl.security.DefaultSecureRequest$Builder$Supplier");
227-
228-
// @since 0.13.0
229-
private static final Supplier<VerifySecureDigestRequest.Builder<?>> VERIFY_REQUEST_BUILDER_SUPPLIER =
230-
Classes.newInstance("io.jsonwebtoken.impl.security.DefaultVerifySecureDigestRequest$Builder$Supplier");
231-
232165
//prevent instantiation
233166
private SIG() {
234167
}
@@ -369,34 +302,6 @@ private SIG() {
369302
* classpath.</b></p>
370303
*/
371304
public static final SignatureAlgorithm EdDSA = Jwts.get(REGISTRY, "EdDSA");
372-
373-
/**
374-
* Returns a new builder to create {@link SecureRequest}s used to compute a mac or signature via
375-
* {@link SecureDigestAlgorithm#digest(Request)}.
376-
*
377-
* @param <K> the type of key used by the algorithm to compute the mac or signature.
378-
* @return a new builder to create {@link SecureRequest}s used to compute a mac or signature via
379-
* {@link SecureDigestAlgorithm#digest(Request)}.
380-
* @since 0.13.0
381-
*/
382-
@SuppressWarnings("unchecked")
383-
public static <K extends Key> SecureRequest.Builder<InputStream, K> request() {
384-
return (SecureRequest.Builder<InputStream, K>) REQUEST_BUILDER_SUPPLIER.get();
385-
}
386-
387-
/**
388-
* Returns a new builder to create {@link VerifySecureDigestRequest}s used to verify a mac or signature via
389-
* {@link SecureDigestAlgorithm#verify(VerifyDigestRequest)}.
390-
*
391-
* @param <K> the type of key used by the algorithm to verify the mac or signature.
392-
* @return a new builder to create {@link VerifySecureDigestRequest}s used to verify a mac or signature via
393-
* {@link SecureDigestAlgorithm#verify(VerifyDigestRequest)}.
394-
* @since 0.13.0
395-
*/
396-
@SuppressWarnings("unchecked")
397-
public static <K extends Key> VerifySecureDigestRequest.Builder<K> verifyRequest() {
398-
return (VerifySecureDigestRequest.Builder<K>) VERIFY_REQUEST_BUILDER_SUPPLIER.get();
399-
}
400305
}
401306

402307
/**
@@ -418,14 +323,6 @@ public static final class KEY {
418323
private static final String IMPL_CLASSNAME = "io.jsonwebtoken.impl.security.StandardKeyAlgorithms";
419324
private static final Registry<String, KeyAlgorithm<?, ?>> REGISTRY = Classes.newInstance(IMPL_CLASSNAME);
420325

421-
// @since 0.13.0
422-
private static final Supplier<KeyRequest.Builder<?>> REQUEST_BUILDER_SUPPLIER =
423-
Classes.newInstance("io.jsonwebtoken.impl.security.DefaultKeyRequest$Builder$Supplier");
424-
425-
// @since 0.13.0
426-
private static final Supplier<DecryptionKeyRequest.Builder<?>> VERIFY_REQUEST_BUILDER_SUPPLIER =
427-
Classes.newInstance("io.jsonwebtoken.impl.security.DefaultDecryptionKeyRequest$Builder$Supplier");
428-
429326
/**
430327
* Returns all standard JWA standard <a href="https://www.rfc-editor.org/rfc/rfc7518.html#section-4">Cryptographic
431328
* Algorithms for Key Management</a>..
@@ -1029,34 +926,6 @@ public static final class KEY {
1029926
*/
1030927
public static final KeyAlgorithm<PublicKey, PrivateKey> ECDH_ES_A256KW = Jwts.get(REGISTRY, "ECDH-ES+A256KW");
1031928

1032-
/**
1033-
* Returns a new builder to create {@link KeyRequest}s used to get a JWE encryption key via
1034-
* {@link KeyAlgorithm#getEncryptionKey(KeyRequest)}.
1035-
*
1036-
* @param <K> the type of key used by the {@link KeyAlgorithm} to get a JWE encryption key.
1037-
* @return a new builder to create {@link KeyRequest}s used to get a JWE encryption key via
1038-
* {@link KeyAlgorithm#getEncryptionKey(KeyRequest)}.
1039-
* @since 0.13.0
1040-
*/
1041-
@SuppressWarnings("unchecked")
1042-
public static <K extends Key> KeyRequest.Builder<K> request() {
1043-
return (KeyRequest.Builder<K>) REQUEST_BUILDER_SUPPLIER.get();
1044-
}
1045-
1046-
/**
1047-
* Returns a new builder to create {@link DecryptionKeyRequest}s used to get a JWE decryption key via
1048-
* {@link KeyAlgorithm#getDecryptionKey(DecryptionKeyRequest)}.
1049-
*
1050-
* @param <K> the type of key used by the {@link KeyAlgorithm} to get a JWE decryption key.
1051-
* @return a new builder to create {@link DecryptionKeyRequest}s used to get a JWE decryption key via
1052-
* {@link KeyAlgorithm#getDecryptionKey(DecryptionKeyRequest)}.
1053-
* @since 0.13.0
1054-
*/
1055-
@SuppressWarnings("unchecked")
1056-
public static <K extends Key> DecryptionKeyRequest.Builder<K> decRequest() {
1057-
return (DecryptionKeyRequest.Builder<K>) VERIFY_REQUEST_BUILDER_SUPPLIER.get();
1058-
}
1059-
1060929
//prevent instantiation
1061930
private KEY() {
1062931
}

api/src/main/java/io/jsonwebtoken/security/AeadRequest.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public interface AeadRequest extends SecureRequest<InputStream, SecretKey>, Asso
3333
* Named parameters (setters) used to configure an {@link AeadRequest AeadRequest} instance.
3434
*
3535
* @param <M> the instance type returned for method chaining.
36-
* @since 0.13.0
36+
* @since JJWT_RELEASE_VERSION
3737
*/
3838
interface Params<M extends Params<M>> extends SecureRequest.Params<InputStream, SecretKey, M> {
3939

@@ -51,10 +51,23 @@ interface Params<M extends Params<M>> extends SecureRequest.Params<InputStream,
5151
}
5252

5353
/**
54-
* A builder for creating new immutable {@link AeadRequest} instances.
54+
* A builder for creating new immutable {@link AeadRequest} instances used for AEAD encryption via
55+
* {@link AeadAlgorithm#encrypt(AeadRequest, AeadResult)}.
5556
*
56-
* @since 0.13.0
57+
* @since JJWT_RELEASE_VERSION
5758
*/
5859
interface Builder extends Params<Builder>, io.jsonwebtoken.lang.Builder<AeadRequest> {
5960
}
61+
62+
/**
63+
* Returns a new {@link AeadRequest.Builder} for creating immutable {@link AeadRequest}s used for AEAD encryption
64+
* via {@link AeadAlgorithm#encrypt(AeadRequest, AeadResult)}.
65+
*
66+
* @return a new {@link AeadRequest.Builder} for creating immutable {@link AeadRequest}s used for AEAD encryption
67+
* via {@link AeadAlgorithm#encrypt(AeadRequest, AeadResult)}.
68+
* @since JJWT_RELEASE_VERSION
69+
*/
70+
static AeadRequest.Builder builder() {
71+
return Suppliers.AEAD_REQUEST_BUILDER.get();
72+
}
6073
}

api/src/main/java/io/jsonwebtoken/security/AeadResult.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public interface AeadResult extends DigestSupplier, IvSupplier {
5454
/**
5555
* A builder for creating new {@link AeadResult} instances.
5656
*
57-
* @since 0.13.0
57+
* @since JJWT_RELEASE_VERSION
5858
*/
5959
interface Builder extends io.jsonwebtoken.lang.Builder<AeadResult> {
6060

@@ -69,4 +69,16 @@ interface Builder extends io.jsonwebtoken.lang.Builder<AeadResult> {
6969
Builder out(OutputStream out);
7070
}
7171

72+
/**
73+
* Returns a new {@link AeadResult} with the specified {@link OutputStream} that will be used to write the
74+
* resulting ciphertext during encryption or plaintext during decryption.
75+
*
76+
* @return a new {@link AeadResult} with the specified {@link OutputStream} that will be used to write the
77+
* resulting ciphertext during encryption or plaintext during decryption.
78+
* @since JJWT_RELEASE_VERSION
79+
*/
80+
static AeadResult of(OutputStream out) {
81+
return Suppliers.AEAD_RESULT_BUILDER.get().out(out).build();
82+
}
83+
7284
}

api/src/main/java/io/jsonwebtoken/security/DecryptAeadRequest.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package io.jsonwebtoken.security;
1717

1818
import javax.crypto.SecretKey;
19+
import java.io.OutputStream;
1920

2021
/**
2122
* A request to an {@link AeadAlgorithm} to decrypt ciphertext with integrity verification with a supplied
@@ -29,7 +30,7 @@ public interface DecryptAeadRequest extends AeadRequest, IvSupplier, DigestSuppl
2930
/**
3031
* Named parameters (setters) used to configure an {@link AeadRequest AeadRequest} instance.
3132
*
32-
* @since 0.13.0
33+
* @since JJWT_RELEASE_VERSION
3334
*/
3435
interface Params<M extends Params<M>> extends AeadRequest.Params<M> {
3536

@@ -50,11 +51,24 @@ interface Params<M extends Params<M>> extends AeadRequest.Params<M> {
5051
}
5152

5253
/**
53-
* A builder for creating new immutable {@link DecryptAeadRequest} instances.
54+
* A builder for creating new immutable {@link DecryptAeadRequest}s used for AEAD decryption via
55+
* {@link AeadAlgorithm#decrypt(DecryptAeadRequest, OutputStream)}.
5456
*
55-
* @since 0.13.0
57+
* @since JJWT_RELEASE_VERSION
5658
*/
5759
interface Builder extends io.jsonwebtoken.lang.Builder<DecryptAeadRequest>, Params<Builder> {
5860
}
5961

62+
/**
63+
* Returns a new {@link DecryptAeadRequest.Builder} for creating immutable {@link DecryptAeadRequest}s used for
64+
* AEAD decryption via {@link AeadAlgorithm#decrypt(DecryptAeadRequest, OutputStream)}.
65+
*
66+
* @return a new {@link DecryptAeadRequest.Builder} for creating immutable {@link DecryptAeadRequest}s used for
67+
* AEAD decryption via {@link AeadAlgorithm#decrypt(DecryptAeadRequest, OutputStream)}.
68+
* @since JJWT_RELEASE_VERSION
69+
*/
70+
static DecryptAeadRequest.Builder builder() {
71+
return Suppliers.DECRYPT_AEAD_REQUEST_BUILDER.get();
72+
}
73+
6074
}

api/src/main/java/io/jsonwebtoken/security/DecryptionKeyRequest.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,32 @@ public interface DecryptionKeyRequest<K extends Key> extends SecureRequest<byte[
4747
*
4848
* @param <K> the type of key used by the {@link KeyAlgorithm} to obtain the JWE Content Encryption Key (CEK).
4949
* @param <M> the instance type returned for method chaining.
50-
* @since 0.13.0
50+
* @since JJWT_RELEASE_VERSION
5151
*/
5252
interface Params<K extends Key, M extends Params<K, M>> extends KeyRequest.Params<byte[], M>,
5353
SecureRequest.Params<byte[], K, M> {
5454
}
5555

5656
/**
57-
* A builder for creating new immutable {@link DecryptionKeyRequest} instances.
57+
* A builder for creating new immutable {@link DecryptionKeyRequest} instances used to get a JWE
58+
* decryption key via {@link KeyAlgorithm#getDecryptionKey(DecryptionKeyRequest)}.
5859
*
5960
* @param <K> the type of key used by the {@link KeyAlgorithm} to obtain the JWE Content Encryption Key (CEK).
60-
* @since 0.13.0
61+
* @since JJWT_RELEASE_VERSION
6162
*/
6263
interface Builder<K extends Key> extends Params<K, Builder<K>>, io.jsonwebtoken.lang.Builder<DecryptionKeyRequest<K>> {
6364
}
65+
66+
/**
67+
* Returns a new {@link DecryptionKeyRequest.Builder} for creating immutable {@link DecryptionKeyRequest}s used to
68+
* get a JWE decryption key via {@link KeyAlgorithm#getDecryptionKey(DecryptionKeyRequest)}.
69+
*
70+
* @return a new {@link DecryptionKeyRequest.Builder} for creating immutable {@link DecryptionKeyRequest}s used to
71+
* get a JWE decryption key via {@link KeyAlgorithm#getDecryptionKey(DecryptionKeyRequest)}.
72+
* @since JJWT_RELEASE_VERSION
73+
*/
74+
@SuppressWarnings("unchecked")
75+
static <K extends Key> DecryptionKeyRequest.Builder<K> builder() {
76+
return (DecryptionKeyRequest.Builder<K>) Suppliers.DECRYPTION_KEY_REQUEST_BUILDER.get();
77+
}
6478
}

api/src/main/java/io/jsonwebtoken/security/HashAlgorithm.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.jsonwebtoken.Identifiable;
1919

2020
import java.io.InputStream;
21+
import java.util.function.Consumer;
2122

2223
/**
2324
* A {@link DigestAlgorithm} that computes and verifies digests without the use of a cryptographic key, such as for
@@ -42,4 +43,27 @@
4243
* @since 0.12.0
4344
*/
4445
public interface HashAlgorithm extends DigestAlgorithm<Request<InputStream>, VerifyDigestRequest> {
46+
47+
default byte[] digest(Consumer<Request.Params<InputStream, ?>> c) {
48+
Request.Builder<InputStream> b = Request.builder();
49+
c.accept(b);
50+
Request<InputStream> r = b.build();
51+
return digest(r);
52+
}
53+
54+
default byte[] digest(InputStream is) {
55+
return digest(c -> c.payload(is));
56+
}
57+
58+
default boolean verify(Consumer<VerifyDigestRequest.Params<?>> c) {
59+
VerifyDigestRequest.Builder b = VerifyDigestRequest.builder();
60+
c.accept(b);
61+
VerifyDigestRequest r = b.build();
62+
return verify(r);
63+
}
64+
65+
default boolean verify(InputStream is, byte[] digest) {
66+
return verify(c -> c.payload(is).digest(digest));
67+
}
68+
4569
}

0 commit comments

Comments
 (0)