55from json import JSONDecodeError
66
77
8+ from .exception import HeaderError
89from .exception import VerificationError
910from .utils import as_unicode
1011from .jwe .utils import alg2keytype as jwe_alg2keytype
@@ -69,7 +70,7 @@ def __init__(self, key_jar=None, iss='', lifetime=0,
6970 self .iss = iss # My identifier
7071 self .lifetime = lifetime # default life time of the signature
7172 self .sign = sign # default signing or not
72- self .sign_alg = sign_alg # default signing algorithm
73+ self .alg = sign_alg # default signing algorithm
7374 self .encrypt = encrypt # default encrypting or not
7475 self .enc_alg = enc_alg # CEK encryption algorithm
7576 self .enc_enc = enc_enc # content encryption algorithm
@@ -118,11 +119,11 @@ def put_together_aud(recv, aud=None):
118119 :return: A possibly extended audience set
119120 """
120121 if aud :
121- if recv in aud :
122- _aud = aud
123- elif recv :
122+ if recv and recv not in aud :
124123 _aud = [recv ]
125124 _aud .extend (aud )
125+ else :
126+ _aud = aud
126127 elif recv :
127128 _aud = [recv ]
128129 else :
@@ -154,7 +155,7 @@ def pack_key(self, owner_id='', kid=''):
154155 :param kid: Key ID
155156 :return: One key
156157 """
157- keys = pick_key (self .my_keys (owner_id , 'sig' ), 'sig' , alg = self .sign_alg ,
158+ keys = pick_key (self .my_keys (owner_id , 'sig' ), 'sig' , alg = self .alg ,
158159 kid = kid )
159160
160161 if not keys :
@@ -198,13 +199,13 @@ def pack(self, payload=None, kid='', owner='', recv='', aud=None, **kwargs):
198199 owner = self .iss
199200
200201 if self .sign :
201- if self .sign_alg != 'none' :
202+ if self .alg != 'none' :
202203 _key = self .pack_key (owner , kid )
203204 _args ['kid' ] = _key .kid
204205 else :
205206 _key = None
206207
207- _jws = JWS (json .dumps (_args ), alg = self .sign_alg )
208+ _jws = JWS (json .dumps (_args ), alg = self .alg )
208209 _sjwt = _jws .sign_compact ([_key ])
209210 else :
210211 _sjwt = json .dumps (_args )
@@ -242,7 +243,8 @@ def _decrypt(self, rj, token):
242243 keys = self .key_jar .get_jwt_decrypt_keys (rj .jwt )
243244 return rj .decrypt (token , keys = keys )
244245
245- def verify_profile (self , msg_cls , info , ** kwargs ):
246+ @staticmethod
247+ def verify_profile (msg_cls , info , ** kwargs ):
246248 """
247249 If a message type is known for this JSON document. Verify that the
248250 document complies with the message specifications.
@@ -273,14 +275,24 @@ def unpack(self, token):
273275 _jwe_header = _jws_header = None
274276
275277 # Check if it's an encrypted JWT
276- _rj = jwe_factory (token )
277- if _rj :
278+ _decryptor = jwe_factory (token )
279+ if _decryptor :
280+ # check headers
281+ darg = {}
282+ if self .enc_enc :
283+ darg ['enc' ] = self .enc_enc
284+ if self .enc_alg :
285+ darg ['alg' ] = self .enc_alg
286+
287+ if _decryptor .jwt .verify_headers (** darg ) is False :
288+ raise HeaderError ('Wrong alg or enc' )
289+
278290 # Yes, try to decode
279- _info = self ._decrypt (_rj , token )
280- _jwe_header = _rj .jwt .headers
291+ _info = self ._decrypt (_decryptor , token )
292+ _jwe_header = _decryptor .jwt .headers
281293 # Try to find out if the information encrypted was a signed JWT
282294 try :
283- _content_type = _rj .jwt .headers ['cty' ]
295+ _content_type = _decryptor .jwt .headers ['cty' ]
284296 except KeyError :
285297 pass
286298 else :
@@ -289,12 +301,16 @@ def unpack(self, token):
289301 # If I have reason to believe the information I have is a signed JWT
290302 if _content_type .lower () == 'jwt' :
291303 # Check that is a signed JWT
292- _rj = jws_factory (_info )
293- if _rj :
294- _info = self ._verify (_rj , _info )
304+ _verifier = jws_factory (_info )
305+ if _verifier :
306+ if self .alg and not _verifier .jwt .verify_headers (alg = self .alg ):
307+ raise HeaderError (
308+ 'Wrong signing algorithm: "{}" expected "{}"' .format (
309+ _verifier .jwt .headers ['alg' ], self .alg ))
310+ _info = self ._verify (_verifier , _info )
295311 else :
296312 raise Exception ()
297- _jws_header = _rj .jwt .headers
313+ _jws_header = _verifier .jwt .headers
298314 else :
299315 # So, not a signed JWT
300316 try :
0 commit comments