diff --git a/.travis.yml b/.travis.yml
index d6e5d6368..c8580f0f1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -8,6 +8,7 @@ jdk:
- oraclejdk8
- oraclejdk9
- openjdk10
+ - openjdk11
cache:
directories:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2b6574df3..d1dc49633 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,15 @@
## Release Notes
+### 0.10.8
+
+This patch release:
+
+* Ensures that SignatureAlgorithms `PS256`, `PS384`, and `PS512` work properly on JDK 11 and later without the need
+ for BouncyCastle. Previous releases referenced a BouncyCastle-specific
+ algorithm name instead of the Java Security Standard Algorithm Name of
+ [`RSASSA-PSS`](https://docs.oracle.com/en/java/javase/11/docs/specs/security/standard-names.html#signature-algorithms).
+ This release ensures the standard name is used moving forward.
+
### 0.10.7
This patch release:
diff --git a/api/src/main/java/io/jsonwebtoken/SignatureAlgorithm.java b/api/src/main/java/io/jsonwebtoken/SignatureAlgorithm.java
index fcb3d391b..7712e9193 100644
--- a/api/src/main/java/io/jsonwebtoken/SignatureAlgorithm.java
+++ b/api/src/main/java/io/jsonwebtoken/SignatureAlgorithm.java
@@ -88,25 +88,25 @@ public enum SignatureAlgorithm {
ES512("ES512", "ECDSA using P-521 and SHA-512", "ECDSA", "SHA512withECDSA", true, 512, 521),
/**
- * JWA algorithm name for {@code RSASSA-PSS using SHA-256 and MGF1 with SHA-256}. This is not a JDK standard
- * algorithm and requires that a JCA provider like BouncyCastle be in the runtime classpath. BouncyCastle
- * will be used automatically if found in the runtime classpath.
+ * JWA algorithm name for {@code RSASSA-PSS using SHA-256 and MGF1 with SHA-256}. This algorithm requires
+ * Java 11 or later or a JCA provider like BouncyCastle to be in the runtime classpath. If on Java 10 or
+ * earlier, BouncyCastle will be used automatically if found in the runtime classpath.
*/
- PS256("PS256", "RSASSA-PSS using SHA-256 and MGF1 with SHA-256", "RSA", "SHA256withRSAandMGF1", false, 256, 2048),
+ PS256("PS256", "RSASSA-PSS using SHA-256 and MGF1 with SHA-256", "RSA", "RSASSA-PSS", false, 256, 2048),
/**
- * JWA algorithm name for {@code RSASSA-PSS using SHA-384 and MGF1 with SHA-384}. This is not a JDK standard
- * algorithm and requires that a JCA provider like BouncyCastle be in the runtime classpath. BouncyCastle
- * will be used automatically if found in the runtime classpath.
+ * JWA algorithm name for {@code RSASSA-PSS using SHA-384 and MGF1 with SHA-384}. This algorithm requires
+ * Java 11 or later or a JCA provider like BouncyCastle to be in the runtime classpath. If on Java 10 or
+ * earlier, BouncyCastle will be used automatically if found in the runtime classpath.
*/
- PS384("PS384", "RSASSA-PSS using SHA-384 and MGF1 with SHA-384", "RSA", "SHA384withRSAandMGF1", false, 384, 2048),
+ PS384("PS384", "RSASSA-PSS using SHA-384 and MGF1 with SHA-384", "RSA", "RSASSA-PSS", false, 384, 2048),
/**
- * JWA algorithm name for {@code RSASSA-PSS using SHA-512 and MGF1 with SHA-512}. This is not a JDK standard
- * algorithm and requires that a JCA provider like BouncyCastle be in the classpath. BouncyCastle will be used
- * automatically if found in the runtime classpath.
+ * JWA algorithm name for {@code RSASSA-PSS using SHA-512 and MGF1 with SHA-512}. This algorithm requires
+ * Java 11 or later or a JCA provider like BouncyCastle to be in the runtime classpath. If on Java 10 or
+ * earlier, BouncyCastle will be used automatically if found in the runtime classpath.
*/
- PS512("PS512", "RSASSA-PSS using SHA-512 and MGF1 with SHA-512", "RSA", "SHA512withRSAandMGF1", false, 512, 2048);
+ PS512("PS512", "RSASSA-PSS using SHA-512 and MGF1 with SHA-512", "RSA", "RSASSA-PSS", false, 512, 2048);
//purposefully ordered higher to lower:
private static final List PREFERRED_HMAC_ALGS = Collections.unmodifiableList(Arrays.asList(
diff --git a/impl/pom.xml b/impl/pom.xml
index 951b1f07c..26f578872 100644
--- a/impl/pom.xml
+++ b/impl/pom.xml
@@ -44,6 +44,11 @@
bcprov-jdk15on
test
+
+ org.bouncycastle
+ bcpkix-jdk15on
+ test
+
io.jsonwebtoken
jjwt-jackson
diff --git a/impl/src/test/groovy/io/jsonwebtoken/impl/crypto/Issue542Test.groovy b/impl/src/test/groovy/io/jsonwebtoken/impl/crypto/Issue542Test.groovy
new file mode 100644
index 000000000..8636d053e
--- /dev/null
+++ b/impl/src/test/groovy/io/jsonwebtoken/impl/crypto/Issue542Test.groovy
@@ -0,0 +1,95 @@
+package io.jsonwebtoken.impl.crypto
+
+import io.jsonwebtoken.Jwts
+import io.jsonwebtoken.SignatureAlgorithm
+import org.bouncycastle.asn1.pkcs.PrivateKeyInfo
+import org.bouncycastle.cert.X509CertificateHolder
+import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter
+import org.bouncycastle.openssl.PEMParser
+import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter
+import org.junit.Test
+
+import java.nio.charset.StandardCharsets
+import java.security.PrivateKey
+import java.security.PublicKey
+
+/**
+ * Asserts backwards-compatibility for 0.10.8 and later per https://github.com/jwtk/jjwt/issues/542
+ */
+class Issue542Test {
+
+ /**
+ * The following 3 strings were generated using the 0.10.7 implementation by calling this
+ * class's `main` method below.
+ *
+ * DO NOT UPDATE THESE VALUES. THEIR EXACT VALUES IS WHAT GUARANTEES BACKWARDS-COMPATIBILITY.
+ *
+ * Changing the values could reflect newer implementation behavior which defeats the entire purpose of the test :)
+ */
+ private static String PS256_0_10_7 = 'eyJhbGciOiJQUzI1NiJ9.eyJpc3MiOiJqb2UifQ.kvOr6hW_Bg6AjH8wmJd7C6S6xow1UaL3xIRrsxrZIgNYN912mHU_-QX_vggaQLLYZLZMWSuqqY_byFgiJ6c0814uf4PhzlkUL6P4FAqKvRMuazN0FMxK-oSt37jKzbLLfLQ2aNZ6jOMoUGn1zreITcm4oVYoZs1c4p8d-OMXjvzwO2rPTSyqrzvrmFF-ufh0gAAA9W8aDeFNPIcm66BC_RK9nhSfJaBdFGzN1dgZKRx8S5DwKurlJkfG6uESGG4pvhlQRtn8dmY_1HHsvKIBQD02zy1KyB3EYXJRtVSIUWY0lhhe7-AoE2TwfYQRaS38ReIhGLFzUIjUDYbxlBljeg'
+ private static String PS384_0_10_7 = 'eyJhbGciOiJQUzM4NCJ9.eyJpc3MiOiJqb2UifQ.mlPowjRz0cP5J-MmCoegKHYagOHZ_ArXOR91_u8jMdwmOfdfEQIcC6K5hAgQGSZQC_pQDA51RUoUHatsQgXtHlSDC_VP9ZxcPkOptWScOUMXriLH31bTcrg0YhlYL-A7TTHLMhbUrOCKqjpWjU-GxcnOkM86e0joZgJUL7CpHUtyCFRrxOXtuTvGr2m_LdS7I5OyZ4xEP4JRcsOgOnGq-m7e3WX7LTDKjggtVq3Nmdl4GISgJdM7GHHZOJHckUjgD-T3X6oHQanFdXZnjEl7nqo9KfN0skerI681fJ8mbjIlbf68pM6tJwJXI8fr1tF4pcAZxXR17ITCrocVSRC6NuWOVzh_XyyEVMEWmLqrRvc4zyRUfqlDbUhMn55Z54bJnU2Z_IzUi1o9ndy7ckISHQVhuYFKu789DjW1BV4PFFxC4heghK_Gw4h7El6MIMVdvM8oLRbrjlf6BYCRnCxuTA_y10IyB7s8eEuUC-D6JjVtXSvCRkRo7f8dWQTjFLs7'
+ private static String PS512_0_10_7 = 'eyJhbGciOiJQUzUxMiJ9.eyJpc3MiOiJqb2UifQ.r6sisG-FVaMoIJacMSdYZLWFBVoT6bXmf3X3humLZqzoGfsRw3q9-wJ2oIiR4ua2L_mPnJqyPcjFWoXLUzw-URFSyQEAX_S2mWTBn7avCFsmJUh2fMkplG0ynbIHCqReRDl3moQGallbl-SYgArSRI2HbpVt05xsVbk3BmxB8N8buKbBPfUqwZMicRqNpHxoOc-IXaClc7y93gFNfGBMEwXn2nK_ZFXY03pMBL_MHVsJprPmtGfQw0ZZUv29zZbZTkRb6W6bRCi3jIP8sBMnYDqG3_Oyz9sF74IeOoD9sCpgAuRnrSAXhEb3tr1uBwyT__DOI1ZdT8QGFiRRNpUZDm7g4ub7njhXQ6ppkEY6kEKCCoxSq5sAh6EzZQgAfbpKNXy5VIu8s1nR-iJ8GDpeTcpLRhbX8havNzWjc-kSnU95_D5NFoaKfIjofKideVU46lUdCk-m7q8mOoFz8UEK1cXq3t7ay2jLG_sNvv7oZPe2TC4ovQGiQP0Mt446XBuIvyXSvygD3_ACpRSfpAqVoP7Ce98NkV2QCJxYNX1cZ4Zj4HrNoNWMx81TFoyU7RoUhj4tHcgBt_3_jbCO0OCejwswAFhwYRXP3jXeE2QhLaN1QJ7p97ly8WxjkBRac3I2WAeJhOM4CWhtgDmHAER9571MWp-7n4h4bnx9tXXfV7k'
+
+ private static Map JWS_0_10_7_VALUES = [
+ (SignatureAlgorithm.PS256): PS256_0_10_7,
+ (SignatureAlgorithm.PS384): PS384_0_10_7,
+ (SignatureAlgorithm.PS512): PS512_0_10_7
+ ]
+
+ private static JcaX509CertificateConverter X509_CERT_CONVERTER = new JcaX509CertificateConverter()
+ private static JcaPEMKeyConverter PEM_KEY_CONVERTER = new JcaPEMKeyConverter()
+
+ private static PEMParser getParser(String filename) {
+ InputStream is = Issue542Test.class.getResourceAsStream(filename)
+ return new PEMParser(new BufferedReader(new InputStreamReader(is, StandardCharsets.ISO_8859_1)))
+ }
+
+ private static PublicKey readTestPublicKey(SignatureAlgorithm alg) {
+ PEMParser parser = getParser(alg.name() + '.crt.pem')
+ X509CertificateHolder holder = parser.readObject() as X509CertificateHolder
+ try {
+ return X509_CERT_CONVERTER.getCertificate(holder).getPublicKey()
+ } finally {
+ parser.close()
+ }
+ }
+
+ private static PrivateKey readTestPrivateKey(SignatureAlgorithm alg) {
+ PEMParser parser = getParser(alg.name() + '.key.pem')
+ PrivateKeyInfo info = parser.readObject() as PrivateKeyInfo
+ try {
+ return PEM_KEY_CONVERTER.getPrivateKey(info)
+ } finally {
+ parser.close()
+ }
+ }
+
+ /**
+ * Asserts backwards-compatibility for https://github.com/jwtk/jjwt/issues/542
+ */
+ @Test
+ void testRsaSsaPssBackwardsCompatibility() {
+
+ def algs = [SignatureAlgorithm.PS256, SignatureAlgorithm.PS384, SignatureAlgorithm.PS512]
+
+ for (alg in algs) {
+ PublicKey key = readTestPublicKey(alg)
+ String jws = JWS_0_10_7_VALUES[alg]
+ def token = Jwts.parser().setSigningKey(key).parseClaimsJws(jws)
+ assert 'joe' == token.body.getIssuer()
+ }
+ }
+
+ /**
+ * Used to generate 0.10.7 strings. DO NOT call this method and replace the values at the top of this
+ * class. This method implementation was retained only to demonstrate how they were created for future reference.
+ */
+ static void main(String[] args) {
+ def algs = [SignatureAlgorithm.PS256, SignatureAlgorithm.PS384, SignatureAlgorithm.PS512]
+ for (alg in algs) {
+ PrivateKey privateKey = readTestPrivateKey(alg)
+ String jws = Jwts.builder().setIssuer('joe').signWith(privateKey, alg).compact()
+ println "private static String ${alg.name()}_0_10_7 = '$jws'"
+ }
+ }
+}
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS256.crt.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS256.crt.pem
new file mode 120000
index 000000000..9f0f221ce
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS256.crt.pem
@@ -0,0 +1 @@
+rsa2048.crt.pem
\ No newline at end of file
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS256.key.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS256.key.pem
new file mode 120000
index 000000000..dbed23bf3
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS256.key.pem
@@ -0,0 +1 @@
+rsa2048.key.pem
\ No newline at end of file
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS384.crt.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS384.crt.pem
new file mode 120000
index 000000000..2b21f33d2
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS384.crt.pem
@@ -0,0 +1 @@
+rsa3072.crt.pem
\ No newline at end of file
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS384.key.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS384.key.pem
new file mode 120000
index 000000000..8e6d44890
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS384.key.pem
@@ -0,0 +1 @@
+rsa3072.key.pem
\ No newline at end of file
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS512.crt.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS512.crt.pem
new file mode 120000
index 000000000..aad9991b2
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS512.crt.pem
@@ -0,0 +1 @@
+rsa4096.crt.pem
\ No newline at end of file
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS512.key.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS512.key.pem
new file mode 120000
index 000000000..3ec40cc76
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/PS512.key.pem
@@ -0,0 +1 @@
+rsa4096.key.pem
\ No newline at end of file
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/README.md b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/README.md
new file mode 100644
index 000000000..a89ac9d4f
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/README.md
@@ -0,0 +1,14 @@
+The `*.key.pem` and `*.crt.pem` files in this directory were created for testing as follows:
+
+ openssl req -x509 -newkey rsa:2048 -keyout rsa2048.key.pem -out rsa2048.crt.pem -days 365250 -nodes -subj '/C=US/ST=California/L=San Francisco/O=jsonwebtoken.io/OU=jjwt'
+ openssl req -x509 -newkey rsa:3072 -keyout rsa3072.key.pem -out rsa3072.crt.pem -days 365250 -nodes -subj '/C=US/ST=California/L=San Francisco/O=jsonwebtoken.io/OU=jjwt'
+ openssl req -x509 -newkey rsa:4096 -keyout rsa4096.key.pem -out rsa4096.crt.pem -days 365250 -nodes -subj '/C=US/ST=California/L=San Francisco/O=jsonwebtoken.io/OU=jjwt'
+
+The only difference is the key size and file names using sizes of `2048`, `3072`, and `4096`.
+
+Each command creates a (non-password-protected) private key and a self-signed certificate for the associated key size,
+valid for 1000 years. These files are intended for testing purposes only and shouldn't be used in a production system.
+
+Finally, the `RS*` and `PS*` files in this directory are just are symlinks back to these files based on the JWT alg
+names and their respective key sizes. This enables easy file lookup based on the `SignatureAlgorithm` `name()` value
+when authoring tests.
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS256.crt.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS256.crt.pem
new file mode 120000
index 000000000..9f0f221ce
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS256.crt.pem
@@ -0,0 +1 @@
+rsa2048.crt.pem
\ No newline at end of file
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS256.key.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS256.key.pem
new file mode 120000
index 000000000..dbed23bf3
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS256.key.pem
@@ -0,0 +1 @@
+rsa2048.key.pem
\ No newline at end of file
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS384.crt.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS384.crt.pem
new file mode 120000
index 000000000..2b21f33d2
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS384.crt.pem
@@ -0,0 +1 @@
+rsa3072.crt.pem
\ No newline at end of file
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS384.key.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS384.key.pem
new file mode 120000
index 000000000..8e6d44890
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS384.key.pem
@@ -0,0 +1 @@
+rsa3072.key.pem
\ No newline at end of file
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS512.crt.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS512.crt.pem
new file mode 120000
index 000000000..aad9991b2
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS512.crt.pem
@@ -0,0 +1 @@
+rsa4096.crt.pem
\ No newline at end of file
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS512.key.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS512.key.pem
new file mode 120000
index 000000000..3ec40cc76
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/RS512.key.pem
@@ -0,0 +1 @@
+rsa4096.key.pem
\ No newline at end of file
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa2048.crt.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa2048.crt.pem
new file mode 100644
index 000000000..11cbfe76b
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa2048.crt.pem
@@ -0,0 +1,20 @@
+-----BEGIN CERTIFICATE-----
+MIIDRDCCAiwCCQCgd9OzR40NCDANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJV
+UzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEY
+MBYGA1UECgwPanNvbndlYnRva2VuLmlvMQ0wCwYDVQQLDARqand0MCAXDTIwMDIw
+MzIzMDQzM1oYDzMwMjAwMjExMjMwNDMzWjBjMQswCQYDVQQGEwJVUzETMBEGA1UE
+CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEYMBYGA1UECgwP
+anNvbndlYnRva2VuLmlvMQ0wCwYDVQQLDARqand0MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAzkH0MwxQ2cUFWsvOPVFqI/dk2EFTjQolCy97mI5/wYCb
+aOoZ9Rm7c675mAeemRtNzgNVEz7m298ENqNGqPk2Nv3pBJ/XCaybBlp61CLez7dQ
+2h5jUFEJ6FJcjeKHS+MwXr56t2ISdfLNMYtVIxjvXQcYx5VmS4mIqTxj5gVGtQVi
+0GXdH6SvpdKV0fjE9KOhjsdBfKQzZfcQlusHg8pThwvjpMwCZnkxCS0RKa9y4+5+
+7MkC33+8+neZUzS7b6NdFxh6T/pMXpkf8d81fzVo4ZBMloweW0/l8MOdVxeX7M/7
+XSC1ank5i3IEZcotLmJYMwEo7rMpZVLevEQ118Eo8QIDAQABMA0GCSqGSIb3DQEB
+CwUAA4IBAQBGbfmJumXEHMLko1ioY/eY5EYgrBRJAuuAMGqBZmK+1Iy2CqB90aEh
+ve+jXjIBsrvXRuLxMdlzoP58Ia9C5M+78Vq0bEjuGJu3zxGev11Gt4E3V6bWfT7G
+fhg66dbmjnqkhgSzpDzfYR7HHOQiDAGe5IH5FbvWehRzENoAODHHP1z3NdoGhsl9
+4DIjOTGYdhW0yUTSjGTWygo6OPU2L4M2k0gTA06FkvdLIS450GWRpgoVO/vfcPnO
+h8KwZcWVwJVmG0Hv0fNhQk/tRuhYhCWGxc7gxkbLb7/xPpPKMD6EvgG0BSm27NxO
+H5l3KYwtbdj5nYHU73cLqC1D6ki6F8+h
+-----END CERTIFICATE-----
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa2048.key.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa2048.key.pem
new file mode 100644
index 000000000..418581f2d
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa2048.key.pem
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDOQfQzDFDZxQVa
+y849UWoj92TYQVONCiULL3uYjn/BgJto6hn1GbtzrvmYB56ZG03OA1UTPubb3wQ2
+o0ao+TY2/ekEn9cJrJsGWnrUIt7Pt1DaHmNQUQnoUlyN4odL4zBevnq3YhJ18s0x
+i1UjGO9dBxjHlWZLiYipPGPmBUa1BWLQZd0fpK+l0pXR+MT0o6GOx0F8pDNl9xCW
+6weDylOHC+OkzAJmeTEJLREpr3Lj7n7syQLff7z6d5lTNLtvo10XGHpP+kxemR/x
+3zV/NWjhkEyWjB5bT+Xww51XF5fsz/tdILVqeTmLcgRlyi0uYlgzASjusyllUt68
+RDXXwSjxAgMBAAECggEAZ90ahaJMDH2ERsaeoo4e7uGjrKqo0jsrkEhm6tnHR7/l
+gp1wWNaOaKDSG1aq7NqtAXL4Imroggv56TGrYWetf1+5OZTsCnkaz8Y8WBr/LIZZ
+dp0a0dUdMhpXdTN/gh1zvCIbVcFTHoYYAjzxsGzcDHKIbeizzJIDeYVpoOlDQ9/9
+Bv6ft4mhaG5SHVnec9QdmbJnKDq5rI4aPXCCXOCzDjdTVfgntdH5TvoCH91ESSKw
+kddciAbVsXoOWnBx3jKMj+hIA4F1p6nzZUbiVzmxhqfShQhDnCEvq8tF7KqRbUsS
+Gx8MVtwSkEGaiJCDVjwSRGkghXlguNwZcfnWMtGMYQKBgQDmFWAApeXv4xXF2a/1
+HKumO5Z+w+XkKiM76YyTHTKO/KtDYRJiIlJMgx+hoRTBwlpYDrlbS9+Jnm7bZ9Ib
+pxRyMAFRoV7eIhnoAn9KrxhS8xCYF2Km7U1lg/+m3pFKghjV4+K1GHbggmvoiIY1
+2t250zkZSslwTxu/2+jRKYOptQKBgQDlfYrzvuGqClJ9QClxlOV2UrWiGxq6eTgL
+4V3l0HwPU9OW/hX0Hued8S70Dpb3o+AAyptbcAqFjSdyIPMbCfKLQQkKpfBUtOvb
+Nm12z/VNKNZbu7kvaOJHunQNHzyMEHcjsB9daAVI0gJZKN+m6Qh4VF4jao7G9GNR
+d7ge0KcXzQKBgQCqf8p9kHJ9OsVmsTMgK1fTvrJ+S8LvOn6TpjVCy08tAHYVXzjV
+OePMyRpGluyfzNtQB9E5o1cKTzqNIjljvoN7PrGrgS6g45pZAIi9mlUnGvIAEsxL
+MOy6vn9Tc/kswo2O6umUE4X8RwmZ7pmuDPtj+e+FG5N8w1Kn8VlsrhvgRQKBgAgz
+clG/koTnFYeQUWrTrVeLIR6H5W6gglY6WYaq6qQJlNgigFpW+GP2iH0EQHTdEFY2
+51JfMKERKEW107o1ostDKbWNtIbyaDNPQJ4sVFHLkc15aea90shJa3hEk39V30wR
+MS2/V+EAUEErasKmNT1Hlo2hczS86wewRY4kWrRJAoGAeYUG04cu55GwCgp50P3J
+0NCNyiOkhnaj0wGPztMbDqNkaUAoaycoEsas5lhRAWT4YIVglz5pwR4uiI57w1cL
+Mvjk5yDiQs7h3bV/qtm95YPBBC+y3mmZYlEA1lH0qktRNBlMVtfYkPztBh50UBOH
+8qhIwqrpm3+JJ1p2p0XPl1c=
+-----END PRIVATE KEY-----
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa3072.crt.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa3072.crt.pem
new file mode 100644
index 000000000..a93fa8338
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa3072.crt.pem
@@ -0,0 +1,25 @@
+-----BEGIN CERTIFICATE-----
+MIIERDCCAqwCCQDqxucO41yAmTANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJV
+UzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEY
+MBYGA1UECgwPanNvbndlYnRva2VuLmlvMQ0wCwYDVQQLDARqand0MCAXDTIwMDIw
+MzIzMDQ1OFoYDzMwMjAwMjExMjMwNDU4WjBjMQswCQYDVQQGEwJVUzETMBEGA1UE
+CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEYMBYGA1UECgwP
+anNvbndlYnRva2VuLmlvMQ0wCwYDVQQLDARqand0MIIBojANBgkqhkiG9w0BAQEF
+AAOCAY8AMIIBigKCAYEA0DmQS4Xtgu5xtnQdxkuzB1j+W4OvNEOVOsg3Zcn9W1d5
+NowtngUh9K9vwBpl59M2j5PHj9dseEIuRqr++ZnZhBMlh/lLiIQ0oQ3cEa7wrwJO
+i9ycZZbeNDHVNzAdQZEQR1DIMUhSTEMR96pVD4a9DzBKLQJaKxZRUOrMhf3QhAZ5
+9m0d/Kqu1Dm6YeWMLQQEewAaSQ9g22gty1EcLAvp/vnhR/DJSYIHCayd5mZwvk9q
+WkXySfUmJGP70GFGG4GOnVLLkmCQgfT+OrzTtiIzNT26mtAsoUMnoD42TTBkR0aL
+hULcj1MYUcB9uVCmJTvYuiCTODoNlL8T40r9L99HoHlTWVi9vf6I1vyNdHp3dXKB
+MVL13+i5BeNIjADr0KKs0jtEEicWyuVhJz3rPLzBbPhz/DGQ/hTj/DRSdo9L9YA4
+WkqgD8uFUvIEKAJ/hXYx3QPEiIMU7hT4jk2Z2SIBiKKiNW4E/20EZOFmaeNWQaqq
+mwX0cHtMygJtTYnEJ1IDAgMBAAEwDQYJKoZIhvcNAQELBQADggGBAGKkmv6d372z
+Ujt1qjsjH7LHfIsPXdvnp7OhvujDEtY7dzwDCtR40zgB2qp+iXUO61FXErx8yDp9
+l7sDzk0AjY7RupANuo/3FyDuo0WoTUV3CJNnXf3Mrvu/DMjbaS6D4Jryz/HLE+2r
+GYtdm165FZK/hQXuFfurkc4yqjrX90Wr+YHeen2y5Wk3jeUknmdp97F6+zkq6N5D
+dKjy/ZOvy+1huNd5bzvJoiZLKqdSh/RQUoU6AP1p+83lo+7cPvS/zm/HvwxwMamA
+1Cip1FypNxUxt5HR4bC5LwEvMTZ/+UTEelbyfjMdYU97aa58nPoMxf7DRBbr0tfj
+GItI+mMoAw60eIaDbTncXvO1LVrFF5BfzVOTQ8ioPRwI7A5LMSC5JvxW8KsW2VX0
+vGwRbw8I6HXGRbBZ3zwmAK73q7go31+Dl/5VPFo+fVTL0P7/k/g0ZAtCu4/Wly9e
+DLnYMoZbIF5lgp9cAzPOaWXiInsA6HSdgFUfXsBemRpholuw+Sacxg==
+-----END CERTIFICATE-----
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa3072.key.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa3072.key.pem
new file mode 100644
index 000000000..1b9b8708b
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa3072.key.pem
@@ -0,0 +1,40 @@
+-----BEGIN PRIVATE KEY-----
+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
+5I2wbxUhb3FO7gj9pxJbwX4=
+-----END PRIVATE KEY-----
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa4096.crt.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa4096.crt.pem
new file mode 100644
index 000000000..c63b1941d
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa4096.crt.pem
@@ -0,0 +1,31 @@
+-----BEGIN CERTIFICATE-----
+MIIFRDCCAywCCQC4g2isVGolKjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJV
+UzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEY
+MBYGA1UECgwPanNvbndlYnRva2VuLmlvMQ0wCwYDVQQLDARqand0MCAXDTIwMDIw
+MzIzMDY1MloYDzMwMjAwMjExMjMwNjUyWjBjMQswCQYDVQQGEwJVUzETMBEGA1UE
+CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEYMBYGA1UECgwP
+anNvbndlYnRva2VuLmlvMQ0wCwYDVQQLDARqand0MIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEAw7jTXeRwCRrDdYnrIwcLvSNfhpmJZ0ap1jzKVgUyCOYL
+TaB9+naJRjHqx7B5wgx/ArRF2nluQ5tawZPMFw2I/iqXYrQEPTbq1XVugYC/C491
+bcXOTKx+DgEvnhNysm/KmzFsEcw78prB5sIAZSR+S5zZPuny4zww2UzE9TZ433RB
+kyA+wVkd64bgXdkMrVc+gsRsOtvwPFbQ89zg8d/pNV0mDtjDsfiYw0pSAah11fJG
+a+aRc46CqFu/6rHuN4uq6542LdtshPbHz29VKHxk8agtcx06+8F05Bg4LFm1rRhY
+0g3KsT7s8XHMVdo9h2bIQuWOaFg3mehpH6ZYBV4ENo98V/jDaUPpBHsaUXw4fG/w
+rnI+YwRjGlmp2QEr5VRfh0x8Addf6N64lmbQUpCPhJweJd54D3JvIpJr8HiG3GYW
+eFsrmDzmhrozZHxE4P7UesW6lWwQzGfwYGXs7j6TEa2hZ8EB/t1jsYNjZ5UYY/Jb
+KgFGSkMGje4Bi5Bv6kh4+pp3DT5QsG/AfLVlr5ineLDWkJ15uZjOxl12EOPXOCWV
+iVqS6rayJfb95YJQ52rT4H83BsApHbzFj7q/CIaeJkUdv9GJ2SOADcXdgG7Xk7tH
+qb1VIH4zRBo5mc0qN1cAwjopxHv2h3tGaTHKbptvfiLulH+AvvuWmLMEQo6ZDlsC
+AwEAATANBgkqhkiG9w0BAQsFAAOCAgEApnHjMQwt5hm6UlEDvdWCYbh7ctkLbgwR
+iBP1lvunm2oF0jGpipt8oDR/TT43usb6ieuU+ABksjxOROeoVZbK8bEpnzeo3nNE
+41ERI3Byjp7tsja8QGG0uBk9QZ0+7MhJqhEDVAIbS0Lf4exkWiLZrW7ogAEFYKTN
+DE6CxOcfR/kXj6ejuCnvN4xYqnw8G/OF/3tnHMfKnnnqtMmWdAKd3Y5S1EJZ5vtp
+lZ3I9HA5Hx0sTH1ruCOIRzaC5En1c6zW1HjxmeAqLeG814gezlEhHzb4SCkabgQh
+Bq15O8eQaW92f8xZoUQN25w7SNYszk9AdhroJz3+BOzG3+Y1EInLk5hDHT8oUNFz
+e8EosJEwJDK3wq9YOhn8PUT/DacyNKONJVNly3fTBXoSR3oReW61p6T19z4AYsY9
+qMwSjIL2UcgAF8Kpsx2NdQrDfdveNMhul7AjIgz+e2DtRqCkZ6ypdhht2pmlpiXO
+TiUG/1OBq2yTeJF9LjAUzsSNnsZ/F8pJbwSpr7VqDmTNGTfrh6x1ojHNFjJeTqK8
+MCTmQtJJTAbV4nuB+thFFWDx0IWvbG7ViYds9sdJNO4L3baXeAioJhHs5buBy3eb
+ZWjLAwHpSCqNY3d6+ouGLwE1YVFsk8sV9UM+gl15VynKkunbYoKhiD82HGASNYtE
+33eif1l5Nk0=
+-----END CERTIFICATE-----
diff --git a/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa4096.key.pem b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa4096.key.pem
new file mode 100644
index 000000000..6c3887052
--- /dev/null
+++ b/impl/src/test/resources/io/jsonwebtoken/impl/crypto/rsa4096.key.pem
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+lczRTJNTE/KNUE0pkC5P4c/e0A1OFu0=
+-----END PRIVATE KEY-----
diff --git a/pom.xml b/pom.xml
index ee44257b7..2a5805e1d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -82,7 +82,9 @@
${basedir}
3.0.2
- 3.6.1
+ 3.8.0
+ 3.1.1
+ 1.6.1
1.7
UTF-8
@@ -95,7 +97,7 @@
1.60
- 2.5.1
+ 2.5.9
1.2.3
3.6
4.12
@@ -149,6 +151,12 @@
${bouncycastle.version}
test
+
+ org.bouncycastle
+ bcpkix-jdk15on
+ ${bouncycastle.version}
+ test
+
@@ -279,7 +287,7 @@
org.codehaus.gmavenplus
gmavenplus-plugin
- 1.6.1
+ ${gmavenplus.version}
@@ -419,7 +427,7 @@
org.apache.maven.plugins
maven-javadoc-plugin
- 2.10.4
+ ${maven.javadoc.version}
attach-javadocs
@@ -428,6 +436,9 @@
+
+ false
+
@@ -448,6 +459,9 @@
-Xdoclint:none
+ 1.8.1
+ 4.2
+ 2.0.2
@@ -501,7 +515,7 @@
org.apache.maven.plugins
maven-javadoc-plugin
- 2.10.4
+ ${maven.javadoc.version}
attach-javadocs