Skip to content

Commit adf41c9

Browse files
committed
Made it possible to see which headers where protected when using JSON signing.
1 parent 4fb616e commit adf41c9

File tree

5 files changed

+75
-60
lines changed

5 files changed

+75
-60
lines changed

src/cryptojwt/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
except ImportError:
2222
pass
2323

24-
__version__ = '0.7.16'
24+
__version__ = '0.7.17'
2525

2626
logger = logging.getLogger(__name__)
2727

src/cryptojwt/jws/jws.py

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,14 @@
33
import logging
44

55
from cryptojwt.jws.exception import JWSException
6-
6+
from .dsa import ECDSASigner
7+
from .exception import FormatError
8+
from .exception import NoSuitableSigningKeys
9+
from .exception import SignerAlgError
10+
from .hmac import HMACSigner
11+
from .pss import PSSSigner
12+
from .rsa import RSASigner
13+
from .utils import alg2keytype
714
from ..exception import BadSignature
815
from ..exception import UnknownAlgorithm
916
from ..exception import WrongNumberOfParts
@@ -13,23 +20,13 @@
1320
from ..utils import b64d_enc_dec
1421
from ..utils import b64e_enc_dec
1522
from ..utils import b64encode_item
16-
from .dsa import ECDSASigner
17-
from .exception import FormatError
18-
from .exception import NoSuitableSigningKeys
19-
from .exception import SignerAlgError
20-
from .hmac import HMACSigner
21-
from .pss import PSSSigner
22-
from .rsa import RSASigner
23-
from .utils import alg2keytype
2423

2524
try:
2625
from builtins import str
2726
from builtins import object
2827
except ImportError:
2928
pass
3029

31-
32-
3330
logger = logging.getLogger(__name__)
3431

3532
KDESC = ['use', 'kid', 'kty']
@@ -52,7 +49,7 @@
5249
'PS512': PSSSigner('SHA512'),
5350

5451
'none': None
55-
}
52+
}
5653

5754

5855
class JWSig(SimpleJWT):
@@ -77,6 +74,7 @@ def __init__(self, msg=None, with_digest=False, httpc=None, **kwargs):
7774
JWx.__init__(self, msg, with_digest, httpc, **kwargs)
7875
if 'alg' not in self:
7976
self['alg'] = "RS256"
77+
self._protected_headers = {}
8078

8179
def alg_keys(self, keys, use, protected=None):
8280
_alg = self._pick_alg(keys)
@@ -197,7 +195,7 @@ def verify_compact_verbose(self, jws=None, keys=None, allow_none=False,
197195

198196
if "alg" in self and self['alg'] and _alg:
199197
if isinstance(self['alg'], list):
200-
if _alg not in self["alg"] :
198+
if _alg not in self["alg"]:
201199
raise SignerAlgError(
202200
"Wrong signing algorithm, expected {} got {}".format(
203201
self['alg'], _alg))
@@ -327,25 +325,27 @@ def verify_json(self, jws, keys=None, allow_none=False, at_least_one=False):
327325
signature[key] = _jwss[key]
328326
_signs = [signature]
329327

330-
_claim = last_exception = None
328+
_claim = None
329+
_all_protected = {}
331330
for _sign in _signs:
332331
protected_headers = _sign.get("protected", "")
333332
token = b".".join([protected_headers.encode(), _payload.encode(),
334333
_sign["signature"].encode()])
335334

336335
unprotected_headers = _sign.get("header", {})
337336
all_headers = unprotected_headers.copy()
338-
all_headers.update(
339-
json.loads(b64d_enc_dec(protected_headers) or {}))
337+
if protected_headers:
338+
_protected = json.loads(b64d_enc_dec(protected_headers))
339+
_all_protected.update(_protected)
340+
all_headers.update(_protected)
340341
self.__init__(**all_headers)
341342

342343
try:
343344
_tmp = self.verify_compact(token, keys, allow_none)
344345
except NoSuitableSigningKeys:
345346
if at_least_one is True:
346347
logger.warning(
347-
'Could not verify signature with headers: {}'.format(
348-
all_headers))
348+
'Could not verify signature with headers: {}'.format(all_headers))
349349
continue
350350
else:
351351
raise
@@ -361,6 +361,7 @@ def verify_json(self, jws, keys=None, allow_none=False, at_least_one=False):
361361
if not _claim:
362362
raise NoSuitableSigningKeys('None')
363363

364+
self._protected_headers = _all_protected
364365
return _claim
365366

366367
def is_jws(self, jws):
@@ -393,7 +394,7 @@ def _is_json_serialized_jws(self, json_jws):
393394
flattened_json_ser_keys = {"payload", "signature"}
394395
if not json_ser_keys.issubset(
395396
json_jws.keys()) and not flattened_json_ser_keys.issubset(
396-
json_jws.keys()):
397+
json_jws.keys()):
397398
return False
398399
return True
399400

@@ -455,6 +456,9 @@ def verify_alg(self, alg):
455456
except KeyError:
456457
return False
457458

459+
def protected_headers(self):
460+
return self._protected_headers.copy()
461+
458462

459463
def factory(token, alg=''):
460464
"""

src/cryptojwt/jwt.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ def pack(self, payload=None, kid='', owner='', recv='', aud=None, **kwargs):
199199
:param aud: Intended audience for this JWS/JWE, not expected to
200200
contain the recipient.
201201
:param kwargs: Extra keyword arguments
202-
:return: A signed or signed and encrypted JsonWebtoken
202+
:return: A signed or signed and encrypted Json Web Token
203203
"""
204204
_args = {}
205205
if payload is not None:

src/cryptojwt/jwx.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import logging
44

55
import requests
6+
67
from cryptojwt.jwk import JWK
78
from cryptojwt.key_bundle import KeyBundle
8-
99
from .exception import HeaderError
1010
from .jwk.jwk import key_from_jwk_dict
1111
from .jwk.rsa import RSAKey

tests/test_06_jws.py

Lines changed: 49 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import pytest
77
from cryptography.hazmat.backends import default_backend
88
from cryptography.hazmat.primitives.asymmetric import ec
9+
910
from cryptojwt.exception import BadSignature
1011
from cryptojwt.exception import UnknownAlgorithm
1112
from cryptojwt.exception import WrongNumberOfParts
@@ -17,8 +18,8 @@
1718
from cryptojwt.jws.exception import NoSuitableSigningKeys
1819
from cryptojwt.jws.exception import SignerAlgError
1920
from cryptojwt.jws.jws import JWS
20-
from cryptojwt.jws.jws import SIGNER_ALGS
2121
from cryptojwt.jws.jws import JWSig
22+
from cryptojwt.jws.jws import SIGNER_ALGS
2223
from cryptojwt.jws.jws import factory
2324
from cryptojwt.jws.rsa import RSASigner
2425
from cryptojwt.jws.utils import left_hash
@@ -40,16 +41,16 @@ def full_path(local_file):
4041

4142
JWK_a = {
4243
"keys": [{
43-
'alg': 'RSA',
44-
'use': 'foo',
45-
'e': 'AQAB',
46-
'n': (
47-
'wf-wiusGhA-gleZYQAOPQlNUIucPiqXdPVyieDqQbXXOPBe3nuggtV'
48-
'zeq7pVFH1dZz4dY2Q2LA5DaegvP8kRvoSB_87ds3dy3Rfym_GUSc5B'
49-
'0l1TgEobcyaep8jguRoHto6GWHfCfKqoUYZq4N8vh4LLMQwLR6zi6J'
50-
'tu82nB5k8')
51-
}]
52-
}
44+
'alg': 'RSA',
45+
'use': 'foo',
46+
'e': 'AQAB',
47+
'n': (
48+
'wf-wiusGhA-gleZYQAOPQlNUIucPiqXdPVyieDqQbXXOPBe3nuggtV'
49+
'zeq7pVFH1dZz4dY2Q2LA5DaegvP8kRvoSB_87ds3dy3Rfym_GUSc5B'
50+
'0l1TgEobcyaep8jguRoHto6GWHfCfKqoUYZq4N8vh4LLMQwLR6zi6J'
51+
'tu82nB5k8')
52+
}]
53+
}
5354

5455
# 64*8 = 256 bits
5556
HMAC_KEY = [3, 35, 53, 75, 43, 15, 165, 188, 131, 126, 6, 101, 119, 123, 166,
@@ -66,13 +67,13 @@ def full_path(local_file):
6667
'-nrmbSpfn8Rz3y3oXLydvUqj8869PkcEzoJIY5Xf7xDN1Co_qyT9qge'
6768
'-3C6DEwGVHXOwRoXRGQ_h50Vsh60MB5MIuDN188EeZnQ30dtCTBB9KDTSEA2DunplhwLCq4xphnMNUaeHdEk',
6869
'kid': 'rsa1'
69-
},
70+
},
7071
{
7172
"k":
7273
b"YTEyZjBlMDgxMGI4YWU4Y2JjZDFiYTFlZTBjYzljNDU3YWM0ZWNiNzhmNmFlYTNkNTY0NzMzYjE",
7374
"kty": "oct",
74-
}]
75-
}
75+
}]
76+
}
7677

7778
JWKS_b = {
7879
"keys": [
@@ -83,23 +84,23 @@ def full_path(local_file):
8384
"kty": "RSA",
8485
"kid": "rsa1",
8586
"use": "sig"
86-
},
87+
},
8788
{
8889
"k":
8990
b"YTEyZjBlMDgxMGI4YWU4Y2JjZDFiYTFlZTBjYzljNDU3YWM0ZWNiNzhmNmFlYTNkNTY0NzMzYjE",
9091
"kty": "oct",
9192
"use": "sig"
92-
},
93+
},
9394
{
9495
"kty": "EC",
9596
"kid": "ec1",
9697
"use": "sig",
9798
"x": "q0WbWhflRbxyQZKFuQvh2nZvg98ak-twRoO5uo2L7Po",
9899
"y": "GOd2jL_6wa0cfnyA0SmEhok9fkYEnAHFKLLM79BZ8_E",
99100
"crv": "P-256"
100-
}
101-
]
102-
}
101+
}
102+
]
103+
}
103104

104105
JWK_b = {
105106
"keys": [
@@ -113,22 +114,24 @@ def full_path(local_file):
113114
"use": "sig",
114115
"x5c": [
115116
"MIIDPjCCAiqgAwIBAgIQsRiM0jheFZhKk49YD0SK1TAJBgUrDgMCHQUAMC0xKzApBgNVBAMTImFjY291bnRzLmFjY2Vzc2NvbnRyb2wud2luZG93cy5uZXQwHhcNMTQwMTAxMDcwMDAwWhcNMTYwMTAxMDcwMDAwWjAtMSswKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3MubmV0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkSCWg6q9iYxvJE2NIhSyOiKvqoWCO2GFipgH0sTSAs5FalHQosk9ZNTztX0ywS/AHsBeQPqYygfYVJL6/EgzVuwRk5txr9e3n1uml94fLyq/AXbwo9yAduf4dCHTP8CWR1dnDR+Qnz/4PYlWVEuuHHONOw/blbfdMjhY+C/BYM2E3pRxbohBb3x//CfueV7ddz2LYiH3wjz0QS/7kjPiNCsXcNyKQEOTkbHFi3mu0u13SQwNddhcynd/GTgWN8A+6SN1r4hzpjFKFLbZnBt77ACSiYx+IHK4Mp+NaVEi5wQtSsjQtI++XsokxRDqYLwus1I1SihgbV/STTg5enufuwIDAQABo2IwYDBeBgNVHQEEVzBVgBDLebM6bK3BjWGqIBrBNFeNoS8wLTErMCkGA1UEAxMiYWNjb3VudHMuYWNjZXNzY29udHJvbC53aW5kb3dzLm5ldIIQsRiM0jheFZhKk49YD0SK1TAJBgUrDgMCHQUAA4IBAQCJ4JApryF77EKC4zF5bUaBLQHQ1PNtA1uMDbdNVGKCmSf8M65b8h0NwlIjGGGy/unK8P6jWFdm5IlZ0YPTOgzcRZguXDPj7ajyvlVEQ2K2ICvTYiRQqrOhEhZMSSZsTKXFVwNfW6ADDkN3bvVOVbtpty+nBY5UqnI7xbcoHLZ4wYD251uj5+lo13YLnsVrmQ16NCBYq2nQFNPuNJw6t3XUbwBHXpF46aLT1/eGf/7Xx6iy8yPJX4DyrpFTutDz882RWofGEO5t4Cw+zZg70dJ/hH/ODYRMorfXEW+8uKmXMKmX2wyxMKvfiPbTy5LmAU8Jvjs2tLg4rOBcXWLAIarZ"
116-
],
117+
],
117118
"x5t": "kriMPdmBvx68skT8-mPAB3BseeA"
118-
},
119+
},
119120
{
120121
"e": "AQAB",
121122
"issuer": "https://login.microsoftonline.com/{tenantid}/v2.0/",
122123
"kid": "MnC_VZcATfM5pOYiJHMba9goEKY",
123124
"kty": "RSA",
124125
"n":
125-
"vIqz-4-ER_vNWLON9yv8hIYV737JQ6rCl6XfzOC628seYUPf0TaGk91CFxefhzh23V9Tkq-RtwN1Vs_z57hO82kkzL-cQHZX3bMJD-GEGOKXCEXURN7VMyZWMAuzQoW9vFb1k3cR1RW_EW_P-C8bb2dCGXhBYqPfHyimvz2WarXhntPSbM5XyS5v5yCw5T_Vuwqqsio3V8wooWGMpp61y12NhN8bNVDQAkDPNu2DT9DXB1g0CeFINp_KAS_qQ2Kq6TSvRHJqxRR68RezYtje9KAqwqx4jxlmVAQy0T3-T-IAbsk1wRtWDndhO6s1Os-dck5TzyZ_dNOhfXgelixLUQ",
126+
"vIqz-4-ER_vNWLON9yv8hIYV737JQ6rCl6XfzOC628seYUPf0TaGk91CFxefhzh23V9Tkq"
127+
"-RtwN1Vs_z57hO82kkzL-cQHZX3bMJD-GEGOKXCEXURN7VMyZWMAuzQoW9vFb1k3cR1RW_EW_P"
128+
"-C8bb2dCGXhBYqPfHyimvz2WarXhntPSbM5XyS5v5yCw5T_Vuwqqsio3V8wooWGMpp61y12NhN8bNVDQAkDPNu2DT9DXB1g0CeFINp_KAS_qQ2Kq6TSvRHJqxRR68RezYtje9KAqwqx4jxlmVAQy0T3-T-IAbsk1wRtWDndhO6s1Os-dck5TzyZ_dNOhfXgelixLUQ",
126129
"use": "sig",
127130
"x5c": [
128131
"MIIC4jCCAcqgAwIBAgIQQNXrmzhLN4VGlUXDYCRT3zANBgkqhkiG9w0BAQsFADAtMSswKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3MubmV0MB4XDTE0MTAyODAwMDAwMFoXDTE2MTAyNzAwMDAwMFowLTErMCkGA1UEAxMiYWNjb3VudHMuYWNjZXNzY29udHJvbC53aW5kb3dzLm5ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALyKs/uPhEf7zVizjfcr/ISGFe9+yUOqwpel38zgutvLHmFD39E2hpPdQhcXn4c4dt1fU5KvkbcDdVbP8+e4TvNpJMy/nEB2V92zCQ/hhBjilwhF1ETe1TMmVjALs0KFvbxW9ZN3EdUVvxFvz/gvG29nQhl4QWKj3x8opr89lmq14Z7T0mzOV8kub+cgsOU/1bsKqrIqN1fMKKFhjKaetctdjYTfGzVQ0AJAzzbtg0/Q1wdYNAnhSDafygEv6kNiquk0r0RyasUUevEXs2LY3vSgKsKseI8ZZlQEMtE9/k/iAG7JNcEbVg53YTurNTrPnXJOU88mf3TToX14HpYsS1ECAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAfolx45w0i8CdAUjjeAaYdhG9+NDHxop0UvNOqlGqYJexqPLuvX8iyUaYxNGzZxFgGI3GpKfmQP2JQWQ1E5JtY/n8iNLOKRMwqkuxSCKJxZJq4Sl/m/Yv7TS1P5LNgAj8QLCypxsWrTAmq2HSpkeSk4JBtsYxX6uhbGM/K1sEktKybVTHu22/7TmRqWTmOUy9wQvMjJb2IXdMGLG3hVntN/WWcs5w8vbt1i8Kk6o19W2MjZ95JaECKjBDYRlhG1KmSBtrsKsCBQoBzwH/rXfksTO9JoUYLXiW0IppB7DhNH4PJ5hZI91R8rR0H3/bKkLSuDaKLWSqMhozdhXsIIKvJQ=="
129-
],
132+
],
130133
"x5t": "MnC_VZcATfM5pOYiJHMba9goEKY"
131-
},
134+
},
132135
{
133136
"e": "AQAB",
134137
"issuer": "https://login.microsoftonline.com/9188040d-6c67-4c5b"
@@ -142,9 +145,9 @@ def full_path(local_file):
142145
"use": "sig",
143146
"x5c": [
144147
"MIICWzCCAcSgAwIBAgIJAKVzMH2FfC12MA0GCSqGSIb3DQEBBQUAMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleTAeFw0xMzExMTExODMzMDhaFw0xNjExMTAxODMzMDhaMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5ymq/xwmst1nstPr8YFOTyD1J5N4idYmrph7AyAv95RbWXfDRqy8CMRG7sJq+UWOKVOA4MVrd/NdV+ejj1DE5MPSiG+mZK/5iqRCDFvPYqOyRj539xaTlARNY4jeXZ0N6irZYKqSfYACjkkKxbLKcijSu1pJ48thXOTED0oNa6UCAwEAAaOBijCBhzAdBgNVHQ4EFgQURCN+4cb0pvkykJCUmpjyfUfnRMowWQYDVR0jBFIwUIAURCN+4cb0pvkykJCUmpjyfUfnRMqhLaQrMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleYIJAKVzMH2FfC12MAsGA1UdDwQEAwIBxjANBgkqhkiG9w0BAQUFAAOBgQB8v8G5/vUl8k7xVuTmMTDA878AcBKBrJ/Hp6RShmdqEGVI7SFR7IlBN1//NwD0n+IqzmnRV2PPZ7iRgMF/Fyvqi96Gd8X53ds/FaiQpZjUUtcO3fk0hDRQPtCYMII5jq+YAYjSybvF84saB7HGtucVRn2nMZc5cAC42QNYIlPMqA=="
145-
],
148+
],
146149
"x5t": "GvnPApfWMdLRi8PDmisFn7bprKg"
147-
},
150+
},
148151
{
149152
"e": "AQAB",
150153
"issuer": "https://login.microsoftonline.com/9188040d-6c67-4c5b"
@@ -156,11 +159,11 @@ def full_path(local_file):
156159
"use": "sig",
157160
"x5c": [
158161
"MIICWzCCAcSgAwIBAgIJAL3MzqqEFMYjMA0GCSqGSIb3DQEBBQUAMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleTAeFw0xMzExMTExOTA1MDJaFw0xOTExMTAxOTA1MDJaMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAx7HNcD9ZxTFRaAgZ7+gdYLkgQua3zvQseqBJIt8Uq3MimInMZoE9QGQeSML7qZPlowb5BUakdLI70ayM4vN36++0ht8+oCHhl8YjGFQkU+Iv2yahWHEP+1EK6eOEYu6INQP9Lk0HMk3QViLwshwb+KXVD02jdmX2HNdYJdPyc0cCAwEAAaOBijCBhzAdBgNVHQ4EFgQULR0aj9AtiNMgqIY8ZyXZGsHcJ5gwWQYDVR0jBFIwUIAULR0aj9AtiNMgqIY8ZyXZGsHcJ5ihLaQrMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleYIJAL3MzqqEFMYjMAsGA1UdDwQEAwIBxjANBgkqhkiG9w0BAQUFAAOBgQBshrsF9yls4ArxOKqXdQPDgHrbynZL8m1iinLI4TeSfmTCDevXVBJrQ6SgDkihl3aCj74IEte2MWN78sHvLLTWTAkiQSlGf1Zb0durw+OvlunQ2AKbK79Qv0Q+wwGuK+oymWc3GSdP1wZqk9dhrQxb3FtdU2tMke01QTut6wr7ig=="
159-
],
162+
],
160163
"x5t": "dEtpjbEvbhfgwUI-bdK5xAU_9UQ"
161-
}
162-
]
163-
}
164+
}
165+
]
166+
}
164167

165168
SIGJWKS = KeyBundle(JWKS_b)
166169

@@ -174,7 +177,7 @@ def test_1():
174177
"iss": "joe",
175178
"exp": 1300819380,
176179
"http://example.com/is_root": True
177-
}
180+
}
178181

179182
_jws = JWS(claimset, cty="JWT", alg='none')
180183
_jwt = _jws.sign_compact()
@@ -372,7 +375,7 @@ def test_jws_mm():
372375
(ec.SECP256R1, "ES256"),
373376
(ec.SECP384R1, "ES384"),
374377
(ec.SECP521R1, "ES512"),
375-
])
378+
])
376379
def test_signer_es(ec_func, alg):
377380
payload = "Please take a moment to register today"
378381
eck = ec.generate_private_key(ec_func(), default_backend())
@@ -492,8 +495,8 @@ def test_sign_2():
492495
"kid": "af22448d-4c7b-464d-b63a-f5bd90f6d7d1",
493496
"n": "o9g8DpUwBW6B1qmcm-TfEh4rNX7n1t38jdo4Gkl_cI3q"
494497
"--7n0Blg0kN88LHZvyZjUB2NhBdFYNxMP8ucy0dOXvWGWzaPmGnq3DM__lN8P4WjD1cCTAVEYKawNBAmGKqrFj1SgpPNsSqiqK-ALM1w6mZ-QGimjOgwCyJy3l9lzZh5D8tKnS2t1pZgE0X5P7lZQWHYpHPqp4jKhETzrCpPGfv0Rl6nmmjp7NlRYBkWKf_HEKE333J6M039m2FbKgxrBg3zmYYpmHuMzVgxxb8LSiv5aqyeyJjxM-YDUAgNQBfKNhONqXyu9DqtSprNkw6sqmuxK0QUVrNYl3b03PgS5Q"
495-
}]
496-
}
498+
}]
499+
}
497500

498501
keys = KeyBundle(keyset)
499502
jws = JWS("payload", alg="RS512")
@@ -538,8 +541,8 @@ def test_verify_protected_headers():
538541
header=dict(alg=u"ES256", jwk=_key.serialize()),
539542
protected=protectedHeader,
540543
signature=sig,
541-
)
542-
])
544+
)
545+
])
543546

544547
# _pub_key = ECKey().load_key(eck.public_key())
545548
_jws = JWS()
@@ -574,7 +577,13 @@ def test_verify_json():
574577
keys=[key])
575578

576579
vkeys = [ECKey().load_key(eck.public_key())]
577-
assert JWS().verify_json(_jwt, keys=vkeys)
580+
_jws = JWS()
581+
assert _jws.verify_json(_jwt, keys=vkeys)
582+
# alg is always protected by default
583+
_protected = _jws.protected_headers()
584+
assert set(_protected.keys()) == {'foo', 'alg'}
585+
assert _protected['foo'] == protected_headers["foo"]
586+
assert _protected['alg'] == "ES256"
578587

579588

580589
def test_sign_json_dont_include_empty_unprotected_headers():
@@ -631,7 +640,9 @@ def test_verify_json_flattened_syntax():
631640
keys=[key], flatten=True)
632641

633642
vkeys = [ECKey().load_key(key.public_key())]
634-
assert JWS().verify_json(_jwt, keys=vkeys)
643+
_jws = JWS()
644+
assert _jws.verify_json(_jwt, keys=vkeys)
645+
assert _jws.protected_headers() == {'alg': "ES256", 'foo': 'bar'}
635646

636647

637648
def test_sign_json_dont_flatten_if_multiple_signatures():

0 commit comments

Comments
 (0)