@@ -36,13 +36,15 @@ impl<'a, H: JoseHeader, C> VerifyWithKey<Token<H, C, Verified>> for Token<H, C,
36
36
signature_str,
37
37
} = self . signature ;
38
38
39
- key. verify ( header_str, claims_str, signature_str) ?;
40
-
41
- Ok ( Token {
42
- header : self . header ,
43
- claims : self . claims ,
44
- signature : Verified ,
45
- } )
39
+ if key. verify ( header_str, claims_str, signature_str) ? {
40
+ Ok ( Token {
41
+ header : self . header ,
42
+ claims : self . claims ,
43
+ signature : Verified ,
44
+ } )
45
+ } else {
46
+ Err ( Error :: InvalidSignature )
47
+ }
46
48
}
47
49
}
48
50
@@ -159,6 +161,43 @@ mod tests {
159
161
name : String ,
160
162
}
161
163
164
+ #[ test]
165
+ #[ cfg( feature = "openssl" ) ]
166
+ pub fn token_can_not_be_verified_with_a_wrong_key ( ) -> Result < ( ) , Error > {
167
+ use crate :: { token:: signed:: SignWithKey , AlgorithmType , Header , PKeyWithDigest , Token } ;
168
+ use openssl:: { hash:: MessageDigest , pkey:: PKey } ;
169
+
170
+ let private_pem = include_bytes ! ( "../../test/rs256-private.pem" ) ;
171
+ let public_pem = include_bytes ! ( "../../test/rs256-public-2.pem" ) ;
172
+
173
+ let rs256_private_key = PKeyWithDigest {
174
+ digest : MessageDigest :: sha256 ( ) ,
175
+ key : PKey :: private_key_from_pem ( private_pem) . unwrap ( ) ,
176
+ } ;
177
+ let rs256_public_key = PKeyWithDigest {
178
+ digest : MessageDigest :: sha256 ( ) ,
179
+ key : PKey :: public_key_from_pem ( public_pem) . unwrap ( ) ,
180
+ } ;
181
+
182
+ let header = Header {
183
+ algorithm : AlgorithmType :: Rs256 ,
184
+ ..Default :: default ( )
185
+ } ;
186
+ let mut claims = BTreeMap :: new ( ) ;
187
+ claims. insert ( "sub" , "someone" ) ;
188
+
189
+ let signed_token = Token :: new ( header, claims) . sign_with_key ( & rs256_private_key) ?;
190
+ let token_str = signed_token. as_str ( ) ;
191
+ let unverified_token: Token < Header , BTreeMap < String , String > , _ > =
192
+ Token :: parse_unverified ( token_str) ?;
193
+ let verified_token_result = unverified_token. verify_with_key ( & rs256_public_key) ;
194
+ assert ! ( verified_token_result. is_err( ) ) ;
195
+ match verified_token_result. err ( ) . unwrap ( ) {
196
+ Error :: InvalidSignature => Ok ( ( ) ) ,
197
+ other => panic ! ( "Wrong error type: {:?}" , other) ,
198
+ }
199
+ }
200
+
162
201
#[ test]
163
202
pub fn component_errors ( ) {
164
203
let key: Hmac < Sha256 > = Hmac :: new_varkey ( b"first" ) . unwrap ( ) ;
0 commit comments