Skip to content

Commit f486fd3

Browse files
committed
More about making sure the crypto algorithms use expect are the ones used.
1 parent 1a0d176 commit f486fd3

File tree

2 files changed

+26
-12
lines changed

2 files changed

+26
-12
lines changed

src/cryptojwt/jwt.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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()

src/cryptojwt/simple_jwt.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,16 @@ def verify_header(self, key, val):
113113
value
114114
"""
115115

116-
if self.headers[key] == val:
117-
return True
116+
if isinstance(val, list):
117+
if self.headers[key] in val:
118+
return True
119+
else:
120+
return False
118121
else:
119-
return False
122+
if self.headers[key] == val:
123+
return True
124+
else:
125+
return False
120126

121127
def verify_headers(self, check_presence=True, **kwargs):
122128
"""

0 commit comments

Comments
 (0)