@@ -65,7 +65,9 @@ class JWT(object):
6565 def __init__ (self , key_jar = None , iss = '' , lifetime = 0 ,
6666 sign = True , sign_alg = 'RS256' , encrypt = False ,
6767 enc_enc = "A128CBC-HS256" , enc_alg = "RSA1_5" , msg_cls = None ,
68- iss2msg_cls = None , skew = 15 ):
68+ iss2msg_cls = None , skew = 15 ,
69+ allowed_sign_algs = None , allowed_enc_algs = None ,
70+ allowed_enc_encs = None ):
6971 self .key_jar = key_jar # KeyJar instance
7072 self .iss = iss # My identifier
7173 self .lifetime = lifetime # default life time of the signature
@@ -80,6 +82,10 @@ def __init__(self, key_jar=None, iss='', lifetime=0,
8082 self .iss2msg_cls = iss2msg_cls or {}
8183 # Allowed time skew
8284 self .skew = skew
85+ # When verifying/decrypting
86+ self .allowed_sign_algs = allowed_sign_algs
87+ self .allowed_enc_algs = allowed_enc_algs
88+ self .allowed_enc_encs = allowed_enc_encs
8389
8490 def receiver_keys (self , recv , use ):
8591 return self .key_jar .get (use , owner = recv )
@@ -271,18 +277,17 @@ def unpack(self, token):
271277 if not token :
272278 raise KeyError
273279
274- _content_type = 'jwt'
275280 _jwe_header = _jws_header = None
276281
277282 # Check if it's an encrypted JWT
278283 _decryptor = jwe_factory (token )
279284 if _decryptor :
280285 # check headers
281286 darg = {}
282- if self .enc_enc :
283- darg ['enc' ] = self .enc_enc
284- if self .enc_alg :
285- darg ['alg' ] = self .enc_alg
287+ if self .allowed_enc_encs :
288+ darg ['enc' ] = self .allowed_enc_encs
289+ if self .allowed_enc_algs :
290+ darg ['alg' ] = self .allowed_enc_algs
286291
287292 if _decryptor .jwt .verify_headers (** darg ) is False :
288293 raise HeaderError ('Wrong alg or enc' )
@@ -294,19 +299,22 @@ def unpack(self, token):
294299 try :
295300 _content_type = _decryptor .jwt .headers ['cty' ]
296301 except KeyError :
297- pass
302+ _content_type = ''
298303 else :
304+ _content_type = 'jwt'
299305 _info = token
300306
301307 # If I have reason to believe the information I have is a signed JWT
302308 if _content_type .lower () == 'jwt' :
303309 # Check that is a signed JWT
304310 _verifier = jws_factory (_info )
305311 if _verifier :
306- if self .alg and not _verifier .jwt .verify_headers (alg = self .alg ):
312+ if self .allowed_sign_algs and not _verifier .jwt .verify_headers (
313+ alg = self .allowed_sign_algs ):
307314 raise HeaderError (
308315 'Wrong signing algorithm: "{}" expected "{}"' .format (
309- _verifier .jwt .headers ['alg' ], self .alg ))
316+ _verifier .jwt .headers ['alg' ],
317+ self .allowed_sign_algs ))
310318 _info = self ._verify (_verifier , _info )
311319 else :
312320 raise Exception ()
0 commit comments