Ether Framework
Unified API docs for Ether modules
Loading...
Searching...
No Matches
KeyProvider.java
Go to the documentation of this file.
1package dev.rafex.ether.jwt;
2
3/*-
4 * #%L
5 * ether-jwt
6 * %%
7 * Copyright (C) 2025 - 2026 Raúl Eduardo González Argote
8 * %%
9 * Permission is hereby granted, free of charge, to any person obtaining a copy
10 * of this software and associated documentation files (the "Software"), to deal
11 * in the Software without restriction, including without limitation the rights
12 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 * copies of the Software, and to permit persons to whom the Software is
14 * furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included in
17 * all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 * THE SOFTWARE.
26 * #L%
27 */
28
29import java.nio.charset.StandardCharsets;
30import java.security.PrivateKey;
31import java.security.PublicKey;
32import java.util.Arrays;
33import java.util.Objects;
34
35/** Provides cryptographic material used to sign and verify JWT tokens. */
36public interface KeyProvider {
37
39
40 byte[] hmacSecret();
41
42 PrivateKey privateKey();
43
44 PublicKey publicKey();
45
46 static KeyProvider hmac(final String secret) {
47 if (secret == null || secret.isBlank()) {
48 throw new IllegalArgumentException("secret is required for HS256");
49 }
50 return hmac(secret.getBytes(StandardCharsets.UTF_8));
51 }
52
53 static KeyProvider hmac(final byte[] secret) {
54 if (secret == null || secret.length == 0) {
55 throw new IllegalArgumentException("secret is required for HS256");
56 }
57 final byte[] copy = Arrays.copyOf(secret, secret.length);
58 return new BasicKeyProvider(JwtAlgorithm.HS256, copy, null, null);
59 }
60
61 static KeyProvider rsa(final PrivateKey privateKey, final PublicKey publicKey) {
62 if (privateKey == null || publicKey == null) {
63 throw new IllegalArgumentException("privateKey and publicKey are required for RS256");
64 }
66 }
67
68 static KeyProvider rsaVerifier(final PublicKey publicKey) {
69 if (publicKey == null) {
70 throw new IllegalArgumentException("publicKey is required for RS256 verification");
71 }
72 return new BasicKeyProvider(JwtAlgorithm.RS256, null, null, publicKey);
73 }
74
75 final class BasicKeyProvider implements KeyProvider {
76 private final JwtAlgorithm algorithm;
77 private final byte[] hmacSecret;
78 private final PrivateKey privateKey;
79 private final PublicKey publicKey;
80
81 private BasicKeyProvider(
82 final JwtAlgorithm algorithm,
83 final byte[] hmacSecret,
84 final PrivateKey privateKey,
85 final PublicKey publicKey) {
86 this.algorithm = Objects.requireNonNull(algorithm, "algorithm");
87 this.hmacSecret = hmacSecret == null ? null : Arrays.copyOf(hmacSecret, hmacSecret.length);
88 this.privateKey = privateKey;
89 this.publicKey = publicKey;
90 }
91
92 @Override
94 return algorithm;
95 }
96
97 @Override
98 public byte[] hmacSecret() {
99 return hmacSecret == null ? null : Arrays.copyOf(hmacSecret, hmacSecret.length);
100 }
101
102 @Override
103 public PrivateKey privateKey() {
104 return privateKey;
105 }
106
107 @Override
108 public PublicKey publicKey() {
109 return publicKey;
110 }
111 }
112}
Supported JWT signature algorithms.
Provides cryptographic material used to sign and verify JWT tokens.
static KeyProvider hmac(final byte[] secret)
static KeyProvider hmac(final String secret)
static KeyProvider rsaVerifier(final PublicKey publicKey)
static KeyProvider rsa(final PrivateKey privateKey, final PublicKey publicKey)