Skip to content

Commit c2e28a1

Browse files
committed
Sem-Ver: bugfix Add an explicit test for how none algorithm jwt are handled.
Signed-off-by: David Black <[email protected]>
1 parent e736314 commit c2e28a1

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

atlassian_jwt_auth/tests/test_verifier.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,33 @@
11
import datetime
22
import unittest
33

4+
import jwt
5+
import jwt.exceptions
46
import mock
57

68
import atlassian_jwt_auth
79
import atlassian_jwt_auth.exceptions
10+
import atlassian_jwt_auth.key
11+
import atlassian_jwt_auth.signer
812
from atlassian_jwt_auth.tests import utils
913

1014

15+
class NoneAlgorithmJwtSigner(atlassian_jwt_auth.signer.JWTAuthSigner):
16+
""" A JwtSigner that generates JWTs using the none algorithm
17+
and supports specifying arbitrary alg jwt header values.
18+
"""
19+
20+
def generate_jwt(self, audience, **kwargs):
21+
alg_header = kwargs.get('alg_header', 'none')
22+
key_identifier, private_key_pem = self.private_key_retriever.load(
23+
self.issuer)
24+
return jwt.encode(self._generate_claims(audience, **kwargs),
25+
algorithm=None,
26+
key=None,
27+
headers={'kid': key_identifier.key_id,
28+
'alg': alg_header})
29+
30+
1131
class BaseJWTAuthVerifierTest(object):
1232

1333
""" tests for the JWTAuthVerifier class. """
@@ -45,6 +65,25 @@ def test_verify_jwt_with_valid_jwt(self):
4565
self.assertEqual(v_claims['aud'], self._example_aud)
4666
self.assertEqual(v_claims['iss'], self._example_issuer)
4767

68+
def test_verify_jwt_with_none_algorithm(self):
69+
""" tests that verify_jwt does not accept jwt that use the none
70+
algorithm.
71+
"""
72+
verifier = self._setup_jwt_auth_verifier(self._public_key_pem)
73+
private_key_ret = atlassian_jwt_auth.key.StaticPrivateKeyRetriever(
74+
self._example_key_id, self._private_key_pem.decode())
75+
jwt_signer = NoneAlgorithmJwtSigner(
76+
issuer=self._example_issuer,
77+
private_key_retriever=private_key_ret,
78+
)
79+
for algorithm in ['none', 'None', 'nOne', 'nonE', 'NONE']:
80+
jwt_token = jwt_signer.generate_jwt(
81+
self._example_aud, alg_header=algorithm)
82+
jwt_headers = jwt.get_unverified_header(jwt_token)
83+
self.assertEqual(jwt_headers['alg'], algorithm)
84+
with self.assertRaises(jwt.exceptions.InvalidAlgorithmError):
85+
verifier.verify_jwt(jwt_token, self._example_aud)
86+
4887
def test_verify_jwt_with_key_identifier_not_starting_with_issuer(self):
4988
""" tests that verify_jwt rejects a jwt if the key identifier does
5089
not start with the claimed issuer.

0 commit comments

Comments
 (0)