|
24 | 24 | import java.util.Map; |
25 | 25 |
|
26 | 26 | import static org.junit.Assert.assertNotNull; |
| 27 | +import static org.mockito.Matchers.any; |
| 28 | +import static org.mockito.Mockito.doThrow; |
27 | 29 | import static org.mockito.Mockito.mock; |
28 | 30 | import static org.mockito.Mockito.when; |
29 | 31 | import static org.springframework.security.jwt.codec.Codecs.b64UrlEncode; |
@@ -139,6 +141,26 @@ public void decodeWhenKidHeaderMissingButX5tHeaderPresentThenDecodeStillSucceeds |
139 | 141 | assertNotNull(decodedJwt); |
140 | 142 | } |
141 | 143 |
|
| 144 | +// gh-1522, gh-1852 |
| 145 | +@Test |
| 146 | +public void decodeWhenVerifySignatureFailsThenThrowInvalidTokenException() throws Exception { |
| 147 | +this.thrown.expect(InvalidTokenException.class); |
| 148 | +this.thrown.expectMessage("Failed to decode/verify JWT/JWS"); |
| 149 | +JwkDefinition jwkDefinition = this.createRSAJwkDefinition("key-id-1", null, null); |
| 150 | +JwkDefinitionSource jwkDefinitionSource = mock(JwkDefinitionSource.class); |
| 151 | +JwkDefinitionSource.JwkDefinitionHolder jwkDefinitionHolder = mock(JwkDefinitionSource.JwkDefinitionHolder.class); |
| 152 | +SignatureVerifier signatureVerifier = mock(SignatureVerifier.class); |
| 153 | +when(jwkDefinitionHolder.getJwkDefinition()).thenReturn(jwkDefinition); |
| 154 | +when(jwkDefinitionSource.getDefinitionLoadIfNecessary("key-id-1", null)).thenReturn(jwkDefinitionHolder); |
| 155 | +when(jwkDefinitionHolder.getSignatureVerifier()).thenReturn(signatureVerifier); |
| 156 | +doThrow(RuntimeException.class).when(signatureVerifier).verify(any(byte[].class), any(byte[].class)); |
| 157 | +JwkVerifyingJwtAccessTokenConverter accessTokenConverter = |
| 158 | +new JwkVerifyingJwtAccessTokenConverter(jwkDefinitionSource); |
| 159 | +String jwt = createJwt(createJwtHeader("key-id-1", null, JwkDefinition.CryptoAlgorithm.RS256)); |
| 160 | +String jws = jwt + "." + utf8Decode(b64UrlEncode("junkSignature".getBytes())); |
| 161 | +accessTokenConverter.decode(jws); |
| 162 | +} |
| 163 | + |
142 | 164 | private JwkDefinition createRSAJwkDefinition(String keyId, String x5t, JwkDefinition.CryptoAlgorithm algorithm) { |
143 | 165 | return createRSAJwkDefinition(JwkDefinition.KeyType.RSA, keyId, x5t, |
144 | 166 | JwkDefinition.PublicKeyUse.SIG, algorithm, "AMh-pGAj9vX2gwFDyrXot1f2YfHgh8h0Qx6w9IqLL", "AQAB"); |
|
0 commit comments