|
7 | 7 | from cryptography.hazmat.backends import default_backend |
8 | 8 | from cryptography.hazmat.primitives.asymmetric import ec |
9 | 9 |
|
| 10 | +from cryptojwt import as_unicode |
10 | 11 | from cryptojwt.exception import BadSignature |
11 | 12 | from cryptojwt.exception import UnknownAlgorithm |
12 | 13 | from cryptojwt.exception import WrongNumberOfParts |
|
25 | 26 | from cryptojwt.jws.utils import left_hash |
26 | 27 | from cryptojwt.jws.utils import parse_rsa_algorithm |
27 | 28 | from cryptojwt.key_bundle import KeyBundle |
| 29 | +from cryptojwt.utils import as_bytes |
28 | 30 | from cryptojwt.utils import b64d |
29 | 31 | from cryptojwt.utils import b64d_enc_dec |
30 | 32 | from cryptojwt.utils import b64e |
31 | 33 | from cryptojwt.utils import intarr2bin |
| 34 | +from cryptojwt.utils import is_compact_jws |
| 35 | +from cryptojwt.utils import is_json_jws |
32 | 36 |
|
33 | 37 | BASEDIR = os.path.abspath(os.path.dirname(__file__)) |
34 | 38 |
|
@@ -297,7 +301,6 @@ def full_path(local_file): |
297 | 301 | ] |
298 | 302 | } |
299 | 303 |
|
300 | | - |
301 | 304 | SIGJWKS = KeyBundle(JWKS_b) |
302 | 305 |
|
303 | 306 |
|
@@ -1020,3 +1023,50 @@ def test_verify_json_missing_key(): |
1020 | 1023 |
|
1021 | 1024 | # With both |
1022 | 1025 | assert JWS().verify_json(_jwt, keys=[vkeys[0], sym_key]) |
| 1026 | + |
| 1027 | + |
| 1028 | +def test_is_compact_jws(): |
| 1029 | + _header = {"foo": "bar", "alg": "HS384"} |
| 1030 | + _payload = "hello world" |
| 1031 | + _sym_key = SYMKey(key=b"My hollow echo chamber", alg="HS384") |
| 1032 | + |
| 1033 | + _jwt = JWS(msg=_payload, alg="HS384").sign_compact(keys=[_sym_key]) |
| 1034 | + |
| 1035 | + assert is_compact_jws(_jwt) |
| 1036 | + |
| 1037 | + # Faulty examples |
| 1038 | + |
| 1039 | + # to few parts |
| 1040 | + assert is_compact_jws("abc.def") is False |
| 1041 | + |
| 1042 | + # right number of parts but not base64 |
| 1043 | + |
| 1044 | + assert is_compact_jws("abc.def.ghi") is False |
| 1045 | + |
| 1046 | + # not base64 illegal characters |
| 1047 | + assert is_compact_jws("abc.::::.ghi") is False |
| 1048 | + |
| 1049 | + # Faulty header |
| 1050 | + _faulty_header = {"foo": "bar"} # alg is a MUST |
| 1051 | + _jwt = ".".join([as_unicode(b64e(as_bytes(json.dumps(_faulty_header)))), "def", "ghi"]) |
| 1052 | + assert is_compact_jws(_jwt) is False |
| 1053 | + |
| 1054 | + |
| 1055 | +def test_is_json_jws(): |
| 1056 | + ec_key = ECKey().load_key(P256()) |
| 1057 | + sym_key = SYMKey(key=b"My hollow echo chamber", alg="HS384") |
| 1058 | + |
| 1059 | + protected_headers_1 = {"foo": "bar", "alg": "ES256"} |
| 1060 | + unprotected_headers_1 = {"abc": "xyz"} |
| 1061 | + protected_headers_2 = {"foo": "bar", "alg": "HS384"} |
| 1062 | + unprotected_headers_2 = {"abc": "zeb"} |
| 1063 | + payload = "hello world" |
| 1064 | + _jwt = JWS(msg=payload).sign_json( |
| 1065 | + headers=[ |
| 1066 | + (protected_headers_1, unprotected_headers_1), |
| 1067 | + (protected_headers_2, unprotected_headers_2), |
| 1068 | + ], |
| 1069 | + keys=[ec_key, sym_key], |
| 1070 | + ) |
| 1071 | + |
| 1072 | + assert is_json_jws(_jwt) |
0 commit comments