1package dev.rafex.ether.jwt.internal;
29import dev.rafex.ether.jwt.JwtAlgorithm;
30import dev.rafex.ether.jwt.JwtConfig;
31import dev.rafex.ether.jwt.KeyProvider;
33import javax.crypto.Mac;
34import javax.crypto.spec.SecretKeySpec;
35import java.nio.charset.StandardCharsets;
36import java.security.MessageDigest;
37import java.security.Signature;
38import java.util.Base64;
40public final class JwtSigner {
45 public static String
sign(
final String signingInput,
final JwtConfig config) {
47 final KeyProvider keyProvider = config.keyProvider();
49 final byte[] signature = signHmac(signingInput.getBytes(StandardCharsets.UTF_8), keyProvider.
hmacSecret());
50 return Base64.getUrlEncoder().withoutPadding().encodeToString(signature);
52 final Signature rsa = Signature.getInstance(
"SHA256withRSA");
54 rsa.update(signingInput.getBytes(StandardCharsets.UTF_8));
55 return Base64.getUrlEncoder().withoutPadding().encodeToString(rsa.sign());
56 }
catch (
final Exception e) {
57 throw new IllegalStateException(
"error while signing token", e);
61 public static boolean verify(
final String signingInput,
final String encodedSignature,
final JwtConfig config) {
63 final KeyProvider keyProvider = config.keyProvider();
65 final byte[] expected = signHmac(signingInput.getBytes(StandardCharsets.UTF_8), keyProvider.
hmacSecret());
66 final byte[] provided = Base64.getUrlDecoder().decode(encodedSignature);
67 return MessageDigest.isEqual(expected, provided);
69 final Signature rsa = Signature.getInstance(
"SHA256withRSA");
71 rsa.update(signingInput.getBytes(StandardCharsets.UTF_8));
72 return rsa.verify(Base64.getUrlDecoder().decode(encodedSignature));
73 }
catch (
final Exception e) {
78 private static byte[] signHmac(
final byte[] data,
final byte[] secret)
throws Exception {
79 final Mac mac = Mac.getInstance(
"HmacSHA256");
80 mac.init(
new SecretKeySpec(secret,
"HmacSHA256"));
81 return mac.doFinal(data);
Configures JWT signing and verification behavior.
static boolean verify(final String signingInput, final String encodedSignature, final JwtConfig config)
static String sign(final String signingInput, final JwtConfig config)
Supported JWT signature algorithms.
Provides cryptographic material used to sign and verify JWT tokens.