Skip to content

Commit c2194e2

Browse files
author
Roland Hedberg
committed
Merge branch 'master' of github.com:rohe/pyjwkest
2 parents cd36011 + f7028cf commit c2194e2

File tree

4 files changed

+41
-9
lines changed

4 files changed

+41
-9
lines changed

src/jwkest/jws.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,22 @@ def _pick_keys(self, keys, use="", alg=""):
406406

407407
return pkey
408408

409+
def _pick_alg(self, keys):
410+
alg = None
411+
try:
412+
alg = self["alg"]
413+
except KeyError:
414+
# try to get alg from key if there is only one
415+
if keys is not None and len(keys) == 1:
416+
key = next(iter(keys)) # first element from either list or dict
417+
if key.alg:
418+
self["alg"] = alg = key.alg
419+
420+
if not alg:
421+
self["alg"] = alg = "none"
422+
423+
return alg
424+
409425
def _decode(self, payload):
410426
_msg = b64d(bytes(payload))
411427
if "cty" in self:
@@ -420,13 +436,7 @@ def dump_header(self):
420436
class JWS(JWx):
421437

422438
def alg_keys(self, keys, use, protected=None):
423-
try:
424-
_alg = self["alg"]
425-
except KeyError:
426-
self["alg"] = _alg = "none"
427-
else:
428-
if not _alg:
429-
self["alg"] = _alg = "none"
439+
_alg = self._pick_alg(keys)
430440

431441
if keys:
432442
keys = self._pick_keys(keys, use=use, alg=_alg)

src/jwkest/jwt.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@ def split_token(token):
1717
def b2s_conv(item):
1818
if isinstance(item, bytes):
1919
return item.decode("utf-8")
20-
elif isinstance(item, (six.string_types, int, bool)):
20+
elif item is None or isinstance(item, (six.string_types, int, bool)):
2121
return item
2222
elif isinstance(item, list):
2323
return [b2s_conv(i) for i in item]
2424
elif isinstance(item, dict):
2525
return dict([(k, b2s_conv(v)) for k, v in item.items()])
2626

27+
raise ValueError("Can't convert {}.".format(repr(item)))
28+
2729

2830
def b64encode_item(item):
2931
if isinstance(item, bytes):

tests/test_1_jwt.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import json
2-
from jwkest.jwt import JWT
2+
3+
import pytest
4+
5+
from jwkest.jwt import JWT, b2s_conv
36

47
__author__ = 'roland'
58

@@ -44,6 +47,10 @@ def test_unpack_str():
4447
assert _jwt2
4548
out_payload = _jwt2.payload()
4649

50+
def test_b2s_conv_raise_exception_on_bad_value():
51+
with pytest.raises(ValueError):
52+
b2s_conv(object())
53+
4754

4855
if __name__ == "__main__":
4956
test_unpack_str()

tests/test_3_jws.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,19 @@ def test_rs256_rm_signature():
505505
else:
506506
assert False
507507

508+
def test_pick_alg_assume_alg_from_single_key():
509+
expected_alg = "HS256"
510+
keys = [SYMKey(k="foobar", alg=expected_alg)]
511+
512+
alg = JWS()._pick_alg(keys)
513+
assert alg == expected_alg
514+
515+
def test_pick_alg_dont_get_alg_from_single_key_if_already_specified():
516+
expected_alg = "RS512"
517+
keys = [RSAKey(key=import_rsa_key_from_file(KEY), alg="RS256")]
518+
519+
alg = JWS(alg=expected_alg)._pick_alg(keys)
520+
assert alg == expected_alg
508521

509522
if __name__ == "__main__":
510523
test_rs256_rm_signature()

0 commit comments

Comments
 (0)