32
32
import tech .beshu .ror .requestcontext .RequestContext ;
33
33
import tech .beshu .ror .settings .rules .JwtAuthRuleSettings ;
34
34
35
+ import java .security .KeyException ;
36
+ import java .security .KeyFactory ;
37
+ import java .security .PrivateKey ;
38
+ import java .security .spec .PKCS8EncodedKeySpec ;
39
+ import java .util .Base64 ;
35
40
import java .util .Map .Entry ;
36
41
import java .util .Optional ;
37
42
46
51
public class JwtAuthRuleTests {
47
52
48
53
private static final String SETTINGS_SIGNATURE_KEY = JwtAuthRuleSettings .SIGNATURE_KEY ;
54
+ private static final String SETTINGS_SIGNATURE_ALGO = JwtAuthRuleSettings .SIGNATURE_ALGO ;
49
55
private static final String SETTINGS_USER_CLAIM = JwtAuthRuleSettings .USER_CLAIM ;
50
56
private static final String ALGO = "HS256" ;
51
57
private static final String SECRET = "123456" ;
@@ -73,6 +79,26 @@ public void shouldAcceptTokenWithValidSignature() {
73
79
assertTrue (res .get ().isMatch ());
74
80
}
75
81
82
+ @ Test
83
+ public void shouldAcceptTokenWithValidRSASignature () throws KeyException {
84
+ String token = Jwts .builder ()
85
+ .setSubject (SUBJECT )
86
+ .signWith (SignatureAlgorithm .valueOf ("RS256" ), getRsaPrivateKey ())
87
+ .compact ();
88
+
89
+ RawSettings settings = makeSettings (SETTINGS_SIGNATURE_KEY , getRsaPublicKey (), SETTINGS_SIGNATURE_ALGO , "RSA" );
90
+
91
+ RequestContext rc = getMock (token );
92
+
93
+ Optional <SyncRule > rule = makeRule (settings );
94
+ Optional <RuleExitResult > res = rule .map (r -> r .match (rc ));
95
+ rc .commit ();
96
+
97
+ assertTrue (rule .isPresent ());
98
+ assertTrue (res .isPresent ());
99
+ assertTrue (res .get ().isMatch ());
100
+ }
101
+
76
102
@ Test
77
103
public void shouldRejectTokenWithInvalidSignature () {
78
104
String token = Jwts .builder ()
@@ -91,6 +117,26 @@ public void shouldRejectTokenWithInvalidSignature() {
91
117
assertFalse (res .get ().isMatch ());
92
118
}
93
119
120
+ @ Test
121
+ public void shouldRejectRSATokenWithInvalidSignature () throws KeyException {
122
+ String token = Jwts .builder ()
123
+ .setSubject (SUBJECT )
124
+ .signWith (SignatureAlgorithm .valueOf ("RS256" ), getRsaPrivateKey ())
125
+ .compact ();
126
+
127
+ RawSettings settings = makeSettings (SETTINGS_SIGNATURE_KEY , getInvalidPublicKey (), SETTINGS_SIGNATURE_ALGO , "RSA" );
128
+
129
+ RequestContext rc = getMock (token );
130
+
131
+ Optional <SyncRule > rule = makeRule (settings );
132
+ Optional <RuleExitResult > res = rule .map (r -> r .match (rc ));
133
+ rc .commit ();
134
+
135
+ assertTrue (rule .isPresent ());
136
+ assertTrue (res .isPresent ());
137
+ assertFalse (res .get ().isMatch ());
138
+ }
139
+
94
140
@ Test
95
141
public void shouldAcceptAUserClaimSetting () {
96
142
RawSettings settings = makeSettings (SETTINGS_SIGNATURE_KEY , SECRET ,
@@ -239,4 +285,49 @@ private Optional<SyncRule> makeRule(RawSettings settings) {
239
285
return Optional .empty ();
240
286
}
241
287
}
288
+
289
+ private PrivateKey getRsaPrivateKey () throws KeyException {
290
+ try {
291
+ byte [] decoded = Base64 .getMimeDecoder ().decode ("MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCzBElX1jA8I8K7\n " +
292
+ "TXvdKV+nkvu+/qJOab50asTpDT/WlRVsL+wZLgi1+R6t5Qu4thWI3SmqEY3E0A9l\n " +
293
+ "puM4vlICUiqrmPTm+UY41oQFMz4XwoP4cQh/E/g5nBykL3YPqkzYUoJhRknH+lna\n " +
294
+ "wzEUafupH0N0Kc8eruG+9pM0BkLDweUFrHzXzY3C423LQSm5mYeglMYJlFcmJ9vo\n " +
295
+ "MnCUmDPY4qTNlFy8U4ksBFBA1+q/ppFqeeOasAlHh7lnLAtR78I/rGLhVDBqAgO0\n " +
296
+ "W2sOMDMLP584ll0zryYrulA7OEsQGYqQepSmUS9pm0243dl0gwsuGYbc0m5LP24B\n " +
297
+ "F/RLQ2pJAgMBAAECggEAAPS+54cvTsLqIVHynWXBKwXv7j8x4rVR3RFM5+m4M48s\n " +
298
+ "RB2lZyUFyuL/tPIKM/xU9RwpQs1BMpHh4ysW/5CUo4qIy83PUQR3yYnrvpNde4cA\n " +
299
+ "aW1BHFyg8L3SsVXHjaHdMzKNm7NiZX0CydZNBsziGS8fjxlCD+njLr/mXVrDNIRs\n " +
300
+ "SVQ+rZjnNIjflX7KnIYmLtN6a64mC/UPDobtmmadvyAf8Hc/o7JX1Iqy4wtIuEFb\n " +
301
+ "qf82+xXPcEJqST0fFfWcMp3WEU0cyWNfFZWlmmqzMrJPqCJaRJMMFwawxHI4GQMW\n " +
302
+ "W/3OyYT4ySdD/Lt/+rQRkR4BbI8J5h9CfNSrhYryeQKBgQDWlsXVQdgsVsC4pXay\n " +
303
+ "LxjMf5zbcFxg+Jdp3koHpJS5my8cWTRFcRxyTFf8KDesKb/fEhYVV40CurZv4vKU\n " +
304
+ "jHJYf+72QjAVWN6Wyjmxa9Ctc6n1OdZ4gHwBdYNnJJHXhihAbzT4kzF8uccFg6Oj\n " +
305
+ "Es8csXdPnJ4huNN38FWhnfdpQwKBgQDVkCh6WkmjqYSh3F+Zr/sYCc+B42hvhIbt\n " +
306
+ "OLr3U1PTqgv9DRtCfPcR1oJS0kilUo2Fd+4P3xV6EJTpOJbZdIYTRkxIrl6ORDkF\n " +
307
+ "0Lp01Vnzv3DVjhpL4oMdWAVTC7BLJCN8inmz+Pf6RndJrBgLz2HQXMN3NCm5b+21\n " +
308
+ "ojK0iGHvgwKBgFrdl0H5UrdbuNm3Pu6uoLqfYuVMy+FIAp2SwhhAabW6b5V6dHbf\n " +
309
+ "MaN4jl05DnH5b8TenLlGzHAWbgAswnmCizzMV3yxhDjV29NQKGPneoKoEpTDe/yk\n " +
310
+ "s13Oy+iWBKeVqF+4d162vWLKK+s61cTMxySoRRRSBmfTIsCL5Ua9ZDGPAoGAcn8X\n " +
311
+ "NIGzeUspEJ5Vos/2jqyz069YDnG+5O/FTVQfXRuN0d10//B/hdC7jiuvRvM7bJMf\n " +
312
+ "zuKLYSYCsAbm2S7fsvW9cDoL97ob2EJPtNOtpkC8/cFx171ZDiJiuGNL4P0/CUY0\n " +
313
+ "eYjBaizdR2I8ghhtGIijQwV0WTbo+rg69w8ncoECgYBmf4xoW03WYtzGkinhN6FQ\n " +
314
+ "SZt3/ATmJR0iLFzcvMncP+4xGq1J1oL7v0ArUX1mWGfJRS27zgH7k/qJprABnJnI\n " +
315
+ "0TXjhBObmkicvOm11rYK2he2g+eW5RbZpr7FfrNuiZjMOmJn8dWHuwtboNcuEF3A\n " +
316
+ "6Mzj9h2krlUiyKMi0IKLHw==" );
317
+ PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec (decoded );
318
+ KeyFactory kf = KeyFactory .getInstance ("RSA" );
319
+ return kf .generatePrivate (spec );
320
+ } catch (Exception e ) {
321
+ throw new KeyException (e );
322
+ }
323
+ }
324
+
325
+ private String getRsaPublicKey () {
326
+ return "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAswRJV9YwPCPCu0173Slfp5L7vv6iTmm+dGrE6Q0/1pUVbC/sGS4ItfkereULuLYViN0pqhGNxNAPZabjOL5SAlIqq5j05vlGONaEBTM+F8KD+HEIfxP4OZwcpC92D6pM2FKCYUZJx/pZ2sMxFGn7qR9DdCnPHq7hvvaTNAZCw8HlBax8182NwuNty0EpuZmHoJTGCZRXJifb6DJwlJgz2OKkzZRcvFOJLARQQNfqv6aRannjmrAJR4e5ZywLUe/CP6xi4VQwagIDtFtrDjAzCz+fOJZdM68mK7pQOzhLEBmKkHqUplEvaZtNuN3ZdIMLLhmG3NJuSz9uARf0S0NqSQIDAQAB" ;
327
+ }
328
+
329
+ private String getInvalidPublicKey () {
330
+ return getRsaPublicKey ().replace ("QAB" , "QAC" );
331
+ }
332
+
242
333
}
0 commit comments