Skip to content

Commit 918ec0b

Browse files
committed
add RS verification
1 parent e4876d8 commit 918ec0b

9 files changed

Lines changed: 246 additions & 8 deletions

File tree

lib/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ dependencies {
88
compile fileTree(dir: 'libs', include: ['*.jar'])
99
compile 'com.fasterxml.jackson.core:jackson-databind:2.8.4'
1010
compile 'commons-codec:commons-codec:1.10'
11+
compile 'org.bouncycastle:bcprov-jdk15on:1.55'
1112
testCompile 'junit:junit:4.12'
1213
testCompile 'org.hamcrest:hamcrest-library:1.3'
1314
testCompile 'org.mockito:mockito-core:2.2.8'

lib/src/main/java/com/auth0/jwtdecodejava/Utils.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@
77

88
import javax.crypto.Mac;
99
import javax.crypto.spec.SecretKeySpec;
10-
import java.security.InvalidKeyException;
11-
import java.security.MessageDigest;
12-
import java.security.NoSuchAlgorithmException;
10+
import java.security.*;
1311

1412
public class Utils {
1513

@@ -58,4 +56,19 @@ public static String[] splitToken(String token) {
5856
}
5957
return parts;
6058
}
59+
60+
public static boolean verifyRS(String[] jwtParts, PublicKey publicKey, Algorithm algorithm) throws InvalidKeyException, NoSuchAlgorithmException, SignatureException {
61+
if (publicKey == null) {
62+
throw new IllegalArgumentException("The PublicKey cannot be null");
63+
}
64+
if (algorithm != Algorithm.RS256 && algorithm != Algorithm.RS384 && algorithm != Algorithm.RS512) {
65+
throw new IllegalArgumentException("The Algorithm must be one of RS256, RS384, or RS512.");
66+
}
67+
68+
final String content = String.format("%s.%s", jwtParts[0], jwtParts[1]);
69+
Signature s = Signature.getInstance(algorithm.toString());
70+
s.initVerify(publicKey);
71+
s.update(content.getBytes());
72+
return s.verify(Base64.decodeBase64(jwtParts[2]));
73+
}
6174
}

lib/src/main/java/com/auth0/jwtdecodejava/enums/Algorithm.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ public enum Algorithm {
66
none(null),
77
HS256(HmacAlgorithms.HMAC_SHA_256.toString()),
88
HS384(HmacAlgorithms.HMAC_SHA_384.toString()),
9-
HS512(HmacAlgorithms.HMAC_SHA_512.toString());
9+
HS512(HmacAlgorithms.HMAC_SHA_512.toString()),
10+
RS256("SHA256withRSA"),
11+
RS384("SHA384withRSA"),
12+
RS512("SHA512withRSA");
1013

1114
private final String description;
1215

lib/src/main/java/com/auth0/jwtdecodejava/impl/JWTVerifier.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
import java.security.InvalidKeyException;
1313
import java.security.NoSuchAlgorithmException;
14+
import java.security.PublicKey;
15+
import java.security.SignatureException;
1416
import java.util.Arrays;
1517
import java.util.Date;
1618
import java.util.HashMap;
@@ -19,10 +21,12 @@
1921
public class JWTVerifier {
2022
private final Algorithm algorithm;
2123
private final String secret;
24+
private final PublicKey key;
2225
private final Map<String, Object> claims;
2326

24-
private JWTVerifier(Algorithm algorithm, String secret) {
27+
private JWTVerifier(Algorithm algorithm, String secret, PublicKey key) {
2528
this.algorithm = algorithm;
29+
this.key = key;
2630
this.secret = secret;
2731
this.claims = new HashMap<>();
2832
}
@@ -49,7 +53,7 @@ public static JWTVerifier init(Algorithm algorithm, String secret) throws Illega
4953
}
5054
default:
5155
}
52-
return new JWTVerifier(algorithm, secret);
56+
return new JWTVerifier(algorithm, secret, null);
5357
}
5458

5559
public JWTVerifier withIssuer(String issuer) {
@@ -106,8 +110,17 @@ private void verifySignature(String[] parts) {
106110
throw new SignatureVerificationException(algorithm, e);
107111
}
108112
break;
113+
case RS256:
114+
case RS384:
115+
case RS512:
116+
try {
117+
Utils.verifyRS(parts, key, algorithm);
118+
} catch (InvalidKeyException | NoSuchAlgorithmException | SignatureException e) {
119+
throw new SignatureVerificationException(algorithm, e);
120+
}
121+
break;
109122
case none:
110-
if (!parts[2].isEmpty()){
123+
if (!parts[2].isEmpty()) {
111124
throw new SignatureVerificationException(algorithm);
112125
}
113126
default:
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.auth0.jwtdecodejava.impl.pem;
2+
3+
import org.bouncycastle.util.io.pem.PemObject;
4+
import org.bouncycastle.util.io.pem.PemReader;
5+
6+
import java.io.File;
7+
import java.io.FileNotFoundException;
8+
import java.io.FileReader;
9+
import java.io.IOException;
10+
import java.security.KeyFactory;
11+
import java.security.NoSuchAlgorithmException;
12+
import java.security.PublicKey;
13+
import java.security.spec.EncodedKeySpec;
14+
import java.security.spec.InvalidKeySpecException;
15+
import java.security.spec.X509EncodedKeySpec;
16+
17+
public class PemUtils {
18+
19+
public static byte[] parsePEMFile(File pemFile) throws IOException {
20+
if (!pemFile.isFile() || !pemFile.exists()) {
21+
throw new FileNotFoundException(String.format("The file '%s' doesn't exist.", pemFile.getAbsolutePath()));
22+
}
23+
PemReader reader = new PemReader(new FileReader(pemFile));
24+
PemObject pemObject = reader.readPemObject();
25+
return pemObject.getContent();
26+
}
27+
28+
29+
public static PublicKey getPublicKey(byte[] keyBytes, String algorithm) {
30+
PublicKey publicKey = null;
31+
try {
32+
KeyFactory kf = KeyFactory.getInstance(algorithm);
33+
EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
34+
publicKey = kf.generatePublic(keySpec);
35+
} catch (NoSuchAlgorithmException e) {
36+
System.out.println("Could not reconstruct the public key, the given algorithm oculd not be found.");
37+
} catch (InvalidKeySpecException e) {
38+
System.out.println("Could not reconstruct the public key");
39+
}
40+
41+
return publicKey;
42+
}
43+
}

lib/src/test/java/com/auth0/jwtdecodejava/UtilsTest.java

Lines changed: 109 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,23 @@
22

33
import com.auth0.jwtdecodejava.enums.Algorithm;
44
import com.auth0.jwtdecodejava.exceptions.JWTException;
5+
import com.auth0.jwtdecodejava.impl.pem.PemUtils;
56
import org.junit.Rule;
67
import org.junit.Test;
78
import org.junit.rules.ExpectedException;
89

10+
import java.io.File;
11+
import java.io.IOException;
12+
import java.security.PublicKey;
13+
914
import static org.hamcrest.Matchers.*;
1015
import static org.junit.Assert.*;
1116

1217
public class UtilsTest {
1318

19+
private static final String PUBLIC_KEY_FILE = "src/test/resources/rsa_public.pem";
20+
private static final String INVALID_PUBLIC_KEY_FILE = "src/test/resources/rsa_public_invalid.pem";
21+
1422
@Rule
1523
public ExpectedException exception = ExpectedException.none();
1624

@@ -72,6 +80,8 @@ public void shouldEncodeBase64() throws Exception {
7280
assertThat(result, is("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"));
7381
}
7482

83+
// HS
84+
7585
@Test
7686
public void shouldPassHS256Verification() throws Exception {
7787
String jwt = "eyJhbGciOiJIUzI1NiIsImN0eSI6IkpXVCJ9.eyJpc3MiOiJhdXRoMCJ9.mZ0m_N1J4PgeqWmi903JuUoDRZDBPB7HwkS4nVyWH1M";
@@ -141,11 +151,109 @@ public void shouldThrowWhenAlgorithmIsNotHS() throws Exception {
141151
}
142152

143153
@Test
144-
public void shouldThrowWhenAlgorithmIsNull() throws Exception {
154+
public void shouldThrowWhenHSAlgorithmIsNull() throws Exception {
145155
exception.expect(IllegalArgumentException.class);
146156
exception.expectMessage("The Algorithm must be one of HS256, HS384, or HS512.");
147157
String jwt = "eyJhbGciOiJIUzUxMiIsImN0eSI6IkpXVCJ9.eyJpc3MiOiJhdXRoMCJ9.VUo2Z9SWDV-XcOc_Hr6Lff3vl7L9e5Vb8ThXpmGDFjHxe3Dr1ZBmUChYF-xVA7cAdX1P_D4ZCUcsv3IefpVaJw";
148158
Utils.verifyHS(jwt.split("\\."), "secret", null);
149159
}
150160

161+
// RS
162+
163+
@Test
164+
public void shouldPassRS256Verification() throws Exception {
165+
PublicKey key = readPublicKey();
166+
String jwt = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhdXRoMCJ9.dxXF3MdsyW-AuvwJpaQtrZ33fAde9xWxpLIg9cO2tMLH2GSRNuLAe61KsJusZhqZB9Iy7DvflcmRz-9OZndm6cj_ThGeJH2LLc90K83UEvvRPo8l85RrQb8PcanxCgIs2RcZOLygERizB3pr5icGkzR7R2y6zgNCjKJ5_NJ6EiZsGN6_nc2PRK_DbyY-Wn0QDxIxKoA5YgQJ9qafe7IN980pXvQv2Z62c3XR8dYuaXBqhthBj-AbaFHEpZapN-V-TmuLNzR2MCB6Xr7BYMuCaqWf_XU8og4XNe8f_8w9Wv5vvgqMM1KhqVpG5VdMJv4o_L4NoCROHhtUQSLRh2M9cA";
167+
assertTrue(Utils.verifyRS(jwt.split("\\."), key, Algorithm.RS256));
168+
}
169+
170+
@Test
171+
public void shouldFailRS256VerificationWithInvalidPublicKey() throws Exception {
172+
PublicKey key = readInvalidPublicKey();
173+
String jwt = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhdXRoMCJ9.dxXF3MdsyW-AuvwJpaQtrZ33fAde9xWxpLIg9cO2tMLH2GSRNuLAe61KsJusZhqZB9Iy7DvflcmRz-9OZndm6cj_ThGeJH2LLc90K83UEvvRPo8l85RrQb8PcanxCgIs2RcZOLygERizB3pr5icGkzR7R2y6zgNCjKJ5_NJ6EiZsGN6_nc2PRK_DbyY-Wn0QDxIxKoA5YgQJ9qafe7IN980pXvQv2Z62c3XR8dYuaXBqhthBj-AbaFHEpZapN-V-TmuLNzR2MCB6Xr7BYMuCaqWf_XU8og4XNe8f_8w9Wv5vvgqMM1KhqVpG5VdMJv4o_L4NoCROHhtUQSLRh2M9cA";
174+
assertFalse(Utils.verifyRS(jwt.split("\\."), key, Algorithm.RS256));
175+
}
176+
177+
@Test
178+
public void shouldThrowRS256VerificationWithNullPublicKey() throws Exception {
179+
exception.expect(IllegalArgumentException.class);
180+
exception.expectMessage("The PublicKey cannot be null");
181+
String jwt = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhdXRoMCJ9.dxXF3MdsyW-AuvwJpaQtrZ33fAde9xWxpLIg9cO2tMLH2GSRNuLAe61KsJusZhqZB9Iy7DvflcmRz-9OZndm6cj_ThGeJH2LLc90K83UEvvRPo8l85RrQb8PcanxCgIs2RcZOLygERizB3pr5icGkzR7R2y6zgNCjKJ5_NJ6EiZsGN6_nc2PRK_DbyY-Wn0QDxIxKoA5YgQJ9qafe7IN980pXvQv2Z62c3XR8dYuaXBqhthBj-AbaFHEpZapN-V-TmuLNzR2MCB6Xr7BYMuCaqWf_XU8og4XNe8f_8w9Wv5vvgqMM1KhqVpG5VdMJv4o_L4NoCROHhtUQSLRh2M9cA";;
182+
Utils.verifyRS(jwt.split("\\."), null, Algorithm.RS256);
183+
}
184+
185+
@Test
186+
public void shouldPassRS384Verification() throws Exception {
187+
PublicKey key = readPublicKey();
188+
String jwt = "eyJhbGciOiJSUzM4NCIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhdXRoMCJ9.TZlWjXObwGSQOiu2oMq8kiKz0_BR7bbBddNL6G8eZ_GoR82BXOZDqNrQr7lb_M-78XGBguWLWNIdYhzgxOUL9EoCJlrqVm9s9vo6G8T1sj1op-4TbjXZ61TwIvrJee9BvPLdKUJ9_fp1Js5kl6yXkst40Th8Auc5as4n49MLkipjpEhKDKaENKHpSubs1ripSz8SCQZSofeTM_EWVwSw7cpiM8Fy8jOPvWG8Xz4-e3ODFowvHVsDcONX_4FTMNbeRqDuHq2ZhCJnEfzcSJdrve_5VD5fM1LperBVslTrOxIgClOJ3RmM7-WnaizJrWP3D6Z9OLxPxLhM6-jx6tcxEw";
189+
assertTrue(Utils.verifyRS(jwt.split("\\."), key, Algorithm.RS384));
190+
}
191+
192+
@Test
193+
public void shouldFailRS384VerificationWithInvalidPublicKey() throws Exception {
194+
PublicKey key = readInvalidPublicKey();
195+
String jwt = "eyJhbGciOiJSUzM4NCIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhdXRoMCJ9.TZlWjXObwGSQOiu2oMq8kiKz0_BR7bbBddNL6G8eZ_GoR82BXOZDqNrQr7lb_M-78XGBguWLWNIdYhzgxOUL9EoCJlrqVm9s9vo6G8T1sj1op-4TbjXZ61TwIvrJee9BvPLdKUJ9_fp1Js5kl6yXkst40Th8Auc5as4n49MLkipjpEhKDKaENKHpSubs1ripSz8SCQZSofeTM_EWVwSw7cpiM8Fy8jOPvWG8Xz4-e3ODFowvHVsDcONX_4FTMNbeRqDuHq2ZhCJnEfzcSJdrve_5VD5fM1LperBVslTrOxIgClOJ3RmM7-WnaizJrWP3D6Z9OLxPxLhM6-jx6tcxEw";
196+
assertFalse(Utils.verifyRS(jwt.split("\\."), key, Algorithm.RS384));
197+
}
198+
199+
@Test
200+
public void shouldThrowRS384VerificationWithNullPublicKey() throws Exception {
201+
exception.expect(IllegalArgumentException.class);
202+
exception.expectMessage("The PublicKey cannot be null");
203+
String jwt = "eyJhbGciOiJSUzM4NCIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhdXRoMCJ9.TZlWjXObwGSQOiu2oMq8kiKz0_BR7bbBddNL6G8eZ_GoR82BXOZDqNrQr7lb_M-78XGBguWLWNIdYhzgxOUL9EoCJlrqVm9s9vo6G8T1sj1op-4TbjXZ61TwIvrJee9BvPLdKUJ9_fp1Js5kl6yXkst40Th8Auc5as4n49MLkipjpEhKDKaENKHpSubs1ripSz8SCQZSofeTM_EWVwSw7cpiM8Fy8jOPvWG8Xz4-e3ODFowvHVsDcONX_4FTMNbeRqDuHq2ZhCJnEfzcSJdrve_5VD5fM1LperBVslTrOxIgClOJ3RmM7-WnaizJrWP3D6Z9OLxPxLhM6-jx6tcxEw";;
204+
Utils.verifyRS(jwt.split("\\."), null, Algorithm.RS384);
205+
}
206+
207+
@Test
208+
public void shouldPassRS512Verification() throws Exception {
209+
PublicKey key = readPublicKey();
210+
String jwt = "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhdXRoMCJ9.mvL5LoMyIrWYjk5umEXZTmbyIrkbbcVPUkvdGZbu0qFBxGOf0nXP5PZBvPcOu084lvpwVox5n3VaD4iqzW-PsJyvKFgi5TnwmsbKchAp7JexQEsQOnTSGcfRqeUUiBZqRQdYsho71oAB3T4FnalDdFEpM-fztcZY9XqKyayqZLreTeBjqJm4jfOWH7KfGBHgZExQhe96NLq1UA9eUyQwdOA1Z0SgXe4Ja5PxZ6Fm37KnVDtDlNnY4JAAGFo6y74aGNnp_BKgpaVJCGFu1f1S5xCQ1HSvs8ZSdVWs5NgawW3wRd0kRt_GJ_Y3mIwiF4qUyHWGtsSHu_qjVdCTtbFyow";
211+
assertTrue(Utils.verifyRS(jwt.split("\\."), key, Algorithm.RS512));
212+
}
213+
214+
@Test
215+
public void shouldFailRS512VerificationWithInvalidPublicKey() throws Exception {
216+
PublicKey key = readInvalidPublicKey();
217+
String jwt = "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhdXRoMCJ9.mvL5LoMyIrWYjk5umEXZTmbyIrkbbcVPUkvdGZbu0qFBxGOf0nXP5PZBvPcOu084lvpwVox5n3VaD4iqzW-PsJyvKFgi5TnwmsbKchAp7JexQEsQOnTSGcfRqeUUiBZqRQdYsho71oAB3T4FnalDdFEpM-fztcZY9XqKyayqZLreTeBjqJm4jfOWH7KfGBHgZExQhe96NLq1UA9eUyQwdOA1Z0SgXe4Ja5PxZ6Fm37KnVDtDlNnY4JAAGFo6y74aGNnp_BKgpaVJCGFu1f1S5xCQ1HSvs8ZSdVWs5NgawW3wRd0kRt_GJ_Y3mIwiF4qUyHWGtsSHu_qjVdCTtbFyow";
218+
assertFalse(Utils.verifyRS(jwt.split("\\."), key, Algorithm.RS512));
219+
}
220+
221+
@Test
222+
public void shouldThrowRS512VerificationWithNullPublicKey() throws Exception {
223+
exception.expect(IllegalArgumentException.class);
224+
exception.expectMessage("The PublicKey cannot be null");
225+
String jwt = "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhdXRoMCJ9.mvL5LoMyIrWYjk5umEXZTmbyIrkbbcVPUkvdGZbu0qFBxGOf0nXP5PZBvPcOu084lvpwVox5n3VaD4iqzW-PsJyvKFgi5TnwmsbKchAp7JexQEsQOnTSGcfRqeUUiBZqRQdYsho71oAB3T4FnalDdFEpM-fztcZY9XqKyayqZLreTeBjqJm4jfOWH7KfGBHgZExQhe96NLq1UA9eUyQwdOA1Z0SgXe4Ja5PxZ6Fm37KnVDtDlNnY4JAAGFo6y74aGNnp_BKgpaVJCGFu1f1S5xCQ1HSvs8ZSdVWs5NgawW3wRd0kRt_GJ_Y3mIwiF4qUyHWGtsSHu_qjVdCTtbFyow";;
226+
Utils.verifyRS(jwt.split("\\."), null, Algorithm.RS512);
227+
}
228+
229+
@Test
230+
public void shouldThrowWhenAlgorithmIsNotRS() throws Exception {
231+
exception.expect(IllegalArgumentException.class);
232+
exception.expectMessage("The Algorithm must be one of RS256, RS384, or RS512.");
233+
PublicKey key = readPublicKey();
234+
String jwt = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhdXRoMCJ9.dxXF3MdsyW-AuvwJpaQtrZ33fAde9xWxpLIg9cO2tMLH2GSRNuLAe61KsJusZhqZB9Iy7DvflcmRz-9OZndm6cj_ThGeJH2LLc90K83UEvvRPo8l85RrQb8PcanxCgIs2RcZOLygERizB3pr5icGkzR7R2y6zgNCjKJ5_NJ6EiZsGN6_nc2PRK_DbyY-Wn0QDxIxKoA5YgQJ9qafe7IN980pXvQv2Z62c3XR8dYuaXBqhthBj-AbaFHEpZapN-V-TmuLNzR2MCB6Xr7BYMuCaqWf_XU8og4XNe8f_8w9Wv5vvgqMM1KhqVpG5VdMJv4o_L4NoCROHhtUQSLRh2M9cA";
235+
Utils.verifyRS(jwt.split("\\."), key, Algorithm.none);
236+
}
237+
238+
@Test
239+
public void shouldThrowWhenRSAlgorithmIsNull() throws Exception {
240+
exception.expect(IllegalArgumentException.class);
241+
exception.expectMessage("The Algorithm must be one of RS256, RS384, or RS512.");
242+
PublicKey key = readPublicKey();
243+
String jwt = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhdXRoMCJ9.dxXF3MdsyW-AuvwJpaQtrZ33fAde9xWxpLIg9cO2tMLH2GSRNuLAe61KsJusZhqZB9Iy7DvflcmRz-9OZndm6cj_ThGeJH2LLc90K83UEvvRPo8l85RrQb8PcanxCgIs2RcZOLygERizB3pr5icGkzR7R2y6zgNCjKJ5_NJ6EiZsGN6_nc2PRK_DbyY-Wn0QDxIxKoA5YgQJ9qafe7IN980pXvQv2Z62c3XR8dYuaXBqhthBj-AbaFHEpZapN-V-TmuLNzR2MCB6Xr7BYMuCaqWf_XU8og4XNe8f_8w9Wv5vvgqMM1KhqVpG5VdMJv4o_L4NoCROHhtUQSLRh2M9cA";
244+
Utils.verifyRS(jwt.split("\\."), key, null);
245+
}
246+
247+
//Private
248+
249+
private PublicKey readPublicKey() throws IOException {
250+
byte[] bytes = PemUtils.parsePEMFile(new File(PUBLIC_KEY_FILE));
251+
return PemUtils.getPublicKey(bytes, "RSA");
252+
}
253+
254+
private PublicKey readInvalidPublicKey() throws IOException {
255+
byte[] bytes = PemUtils.parsePEMFile(new File(INVALID_PUBLIC_KEY_FILE));
256+
return PemUtils.getPublicKey(bytes, "RSA");
257+
}
258+
151259
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.auth0.jwtdecodejava.impl.pem;
2+
3+
import org.junit.Assert;
4+
import org.junit.Rule;
5+
import org.junit.Test;
6+
import org.junit.rules.ExpectedException;
7+
8+
import java.io.File;
9+
import java.nio.charset.StandardCharsets;
10+
import java.security.PublicKey;
11+
12+
import static org.hamcrest.Matchers.is;
13+
14+
public class PemUtilsTest {
15+
16+
private static final String PUBLIC_KEY_FILE = "src/test/resources/rsa_public.pem";
17+
18+
19+
private static final String PUBLIC_KEY_CONTENT = "-----BEGIN PUBLIC KEY-----\n" +
20+
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGbXWiK3dQTyCbX5xdE4\n" +
21+
"yCuYp0AF2d15Qq1JSXT/lx8CEcXb9RbDddl8jGDv+spi5qPa8qEHiK7FwV2KpRE9\n" +
22+
"83wGPnYsAm9BxLFb4YrLYcDFOIGULuk2FtrPS512Qea1bXASuvYXEpQNpGbnTGVs\n" +
23+
"WXI9C+yjHztqyL2h8P6mlThPY9E9ue2fCqdgixfTFIF9Dm4SLHbphUS2iw7w1JgT\n" +
24+
"69s7of9+I9l5lsJ9cozf1rxrXX4V1u/SotUuNB3Fp8oB4C1fLBEhSlMcUJirz1E8\n" +
25+
"AziMCxS+VrRPDM+zfvpIJg3JljAh3PJHDiLu902v9w+Iplu1WyoB2aPfitxEhRN0\n" +
26+
"YwIDAQAB\n" +
27+
"-----END PUBLIC KEY-----";
28+
@Rule
29+
public ExpectedException exception = ExpectedException.none();
30+
31+
@Test
32+
public void shouldReadPemFile() throws Exception {
33+
File pemFile = new File(PUBLIC_KEY_FILE);
34+
byte[] bytes = PemUtils.parsePEMFile(pemFile);
35+
PublicKey rsaKey = PemUtils.getPublicKey(bytes, "RSA");
36+
String stringValue = new String(rsaKey.getEncoded(), StandardCharsets.UTF_8);
37+
Assert.assertThat(stringValue, is(PUBLIC_KEY_CONTENT));
38+
}
39+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-----BEGIN PUBLIC KEY-----
2+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGbXWiK3dQTyCbX5xdE4
3+
yCuYp0AF2d15Qq1JSXT/lx8CEcXb9RbDddl8jGDv+spi5qPa8qEHiK7FwV2KpRE9
4+
83wGPnYsAm9BxLFb4YrLYcDFOIGULuk2FtrPS512Qea1bXASuvYXEpQNpGbnTGVs
5+
WXI9C+yjHztqyL2h8P6mlThPY9E9ue2fCqdgixfTFIF9Dm4SLHbphUS2iw7w1JgT
6+
69s7of9+I9l5lsJ9cozf1rxrXX4V1u/SotUuNB3Fp8oB4C1fLBEhSlMcUJirz1E8
7+
AziMCxS+VrRPDM+zfvpIJg3JljAh3PJHDiLu902v9w+Iplu1WyoB2aPfitxEhRN0
8+
YwIDAQAB
9+
-----END PUBLIC KEY-----
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-----BEGIN PUBLIC KEY-----
2+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxzYuc22QSst/dS7geYYK
3+
5l5kLxU0tayNdixkEQ17ix+CUcUbKIsnyftZxaCYT46rQtXgCaYRdJcbB3hmyrOa
4+
vkhTpX79xJZnQmfuamMbZBqitvscxW9zRR9tBUL6vdi/0rpoUwPMEh8+Bw7CgYR0
5+
FK0DhWYBNDfe9HKcyZEv3max8Cdq18htxjEsdYO0iwzhtKRXomBWTdhD5ykd/fAC
6+
VTr4+KEY+IeLvubHVmLUhbE5NgWXxrRpGasDqzKhCTmsa2Ysf712rl57SlH0Wz/M
7+
r3F7aM9YpErzeYLrl0GhQr9BVJxOvXcVd4kmY+XkiCcrkyS1cnghnllh+LCwQu1s
8+
YwIDAQAB
9+
-----END PUBLIC KEY-----

0 commit comments

Comments
 (0)