Skip to content

Commit ed6938e

Browse files
committed
Merge branch 'develop' into python39
2 parents 08cc50b + fdc837d commit ed6938e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+3157
-2476
lines changed

.travis.yml

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,28 @@
11
sudo: false
22
language: python
33
python:
4-
- 3.6
5-
- 3.7
6-
- 3.8
7-
- 3.9-dev
84
- pypy3
5+
- 3.6
6+
- 3.7
7+
- 3.8
8+
- 3.9-dev
99
addons:
1010
apt:
1111
packages:
1212
-
1313
install:
14-
- pip install codecov
15-
- pip install tox
16-
- pip install tox-travis
14+
- pip install codecov
15+
- pip install tox
16+
- pip install tox-travis
17+
- pip install isort
18+
- pip install black
1719
script:
18-
- codecov --version
19-
- tox
20+
- isort --check --recursive src tests
21+
- black --check src tests
22+
- codecov --version
23+
- tox
2024
after_success:
21-
- codecov
25+
- codecov
2226
notifications:
2327
email: true
2428
deploy:

codecov.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
codecov:
2+
branch: develop

setup.cfg

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[isort]
2+
multi_line_output = 3
3+
include_trailing_comma = True
4+
force_grid_wrap = 0
5+
use_parentheses = True
6+
line_length = 88

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]',
2727
fd.read(), re.MULTILINE).group(1)
2828

29-
tests_requires = ['responses', 'pytest']
29+
tests_requires = ['responses', 'pytest', 'isort', 'black']
3030

3131
setup(
3232
name="cryptojwt",

src/cryptojwt/__init__.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,21 @@
2121
except ImportError:
2222
pass
2323

24-
__version__ = '1.0.0'
24+
__version__ = "1.0.0"
2525

2626
logger = logging.getLogger(__name__)
2727

2828
JWT_TYPES = (u"JWT", u"application/jws", u"JWS", u"JWE")
2929

30-
JWT_CLAIMS = {"iss": str, "sub": str, "aud": str, "exp": int, "nbf": int,
31-
"iat": int, "jti": str, "typ": str}
30+
JWT_CLAIMS = {
31+
"iss": str,
32+
"sub": str,
33+
"aud": str,
34+
"exp": int,
35+
"nbf": int,
36+
"iat": int,
37+
"jti": str,
38+
"typ": str,
39+
}
3240

3341
JWT_HEADERS = ["typ", "cty"]

src/cryptojwt/jwe/__init__.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,32 @@
44
"A256GCM": 256,
55
"A128CBC-HS256": 256,
66
"A192CBC-HS384": 384,
7-
"A256CBC-HS512": 512
7+
"A256CBC-HS512": 512,
88
}
99

1010
KEY_LEN_BYTES = dict([(s, int(n / 8)) for s, n in KEY_LEN.items()])
1111

1212
SUPPORTED = {
13-
"alg": ["RSA1_5", "RSA-OAEP", "RSA-OAEP-256", "A128KW", "A192KW", "A256KW",
14-
"ECDH-ES", "ECDH-ES+A128KW", "ECDH-ES+A192KW", "ECDH-ES+A256KW"],
15-
"enc": ["A128CBC-HS256", "A192CBC-HS384", "A256CBC-HS512",
16-
"A128GCM", "A192GCM", "A256GCM"],
13+
"alg": [
14+
"RSA1_5",
15+
"RSA-OAEP",
16+
"RSA-OAEP-256",
17+
"A128KW",
18+
"A192KW",
19+
"A256KW",
20+
"ECDH-ES",
21+
"ECDH-ES+A128KW",
22+
"ECDH-ES+A192KW",
23+
"ECDH-ES+A256KW",
24+
],
25+
"enc": [
26+
"A128CBC-HS256",
27+
"A192CBC-HS384",
28+
"A256CBC-HS512",
29+
"A128GCM",
30+
"A192GCM",
31+
"A256GCM",
32+
],
1733
}
1834

1935

src/cryptojwt/jwe/aes.py

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ class AES_CBCEncrypter(Encrypter):
2121
"""
2222
"""
2323

24-
def __init__(self, key_len=32, key=None, msg_padding='PKCS7'):
24+
def __init__(self, key_len=32, key=None, msg_padding="PKCS7"):
2525
Encrypter.__init__(self)
2626
if key:
2727
self.key = key
2828
else:
2929
self.key = os.urandom(key_len)
3030

31-
if msg_padding == 'PKCS7':
31+
if msg_padding == "PKCS7":
3232
self.padder = PKCS7(128).padder()
3333
self.unpadder = PKCS7(128).unpadder()
3434
else:
@@ -46,18 +46,18 @@ def _mac(self, hash_key, hash_func, auth_data, iv, enc_msg, key_len):
4646
m = h.finalize()
4747
return m[:key_len]
4848

49-
def encrypt(self, msg, iv='', auth_data=b''):
49+
def encrypt(self, msg, iv="", auth_data=b""):
5050
if not iv:
5151
iv = os.urandom(16)
5252
self.iv = iv
5353
else:
5454
self.iv = iv
5555

56-
hash_key, enc_key, key_len, hash_func = get_keys_seclen_dgst(self.key,
57-
iv)
56+
hash_key, enc_key, key_len, hash_func = get_keys_seclen_dgst(self.key, iv)
5857

59-
cipher = Cipher(algorithms.AES(enc_key), modes.CBC(iv),
60-
backend=default_backend())
58+
cipher = Cipher(
59+
algorithms.AES(enc_key), modes.CBC(iv), backend=default_backend()
60+
)
6161
encryptor = cipher.encryptor()
6262

6363
pmsg = self.padder.update(msg)
@@ -67,21 +67,22 @@ def encrypt(self, msg, iv='', auth_data=b''):
6767
tag = self._mac(hash_key, hash_func, auth_data, iv, ct, key_len)
6868
return ct, tag
6969

70-
def decrypt(self, msg, iv='', auth_data=b'', tag=b'', key=None):
70+
def decrypt(self, msg, iv="", auth_data=b"", tag=b"", key=None):
7171
if key is None:
7272
if self.key:
7373
key = self.key
7474
else:
75-
raise MissingKey('No available key')
75+
raise MissingKey("No available key")
7676

7777
hash_key, enc_key, key_len, hash_func = get_keys_seclen_dgst(key, iv)
7878

7979
comp_tag = self._mac(hash_key, hash_func, auth_data, iv, msg, key_len)
8080
if comp_tag != tag:
81-
raise VerificationError('AES-CBC HMAC')
81+
raise VerificationError("AES-CBC HMAC")
8282

83-
cipher = Cipher(algorithms.AES(enc_key), modes.CBC(iv),
84-
backend=default_backend())
83+
cipher = Cipher(
84+
algorithms.AES(enc_key), modes.CBC(iv), backend=default_backend()
85+
)
8586
decryptor = cipher.decryptor()
8687

8788
ctext = decryptor.update(msg)
@@ -102,9 +103,9 @@ def __init__(self, bit_length=0, key=None):
102103

103104
self.key = AESGCM(AESGCM.generate_key(bit_length=bit_length))
104105
else:
105-
raise ValueError('Need key or key bit length')
106+
raise ValueError("Need key or key bit length")
106107

107-
def encrypt(self, msg, iv='', auth_data=None):
108+
def encrypt(self, msg, iv="", auth_data=None):
108109
"""
109110
Encrypts and authenticates the data provided as well as authenticating
110111
the associated_data.
@@ -115,11 +116,11 @@ def encrypt(self, msg, iv='', auth_data=None):
115116
:return: The cipher text bytes with the 16 byte tag appended.
116117
"""
117118
if not iv:
118-
raise ValueError('Missing Nonce')
119+
raise ValueError("Missing Nonce")
119120

120121
return self.key.encrypt(iv, msg, auth_data)
121122

122-
def decrypt(self, cipher_text, iv='', auth_data=None, tag=b''):
123+
def decrypt(self, cipher_text, iv="", auth_data=None, tag=b""):
123124
"""
124125
Decrypts the data and authenticates the associated_data (if provided).
125126
@@ -130,6 +131,6 @@ def decrypt(self, cipher_text, iv='', auth_data=None, tag=b''):
130131
:return: The original plaintext
131132
"""
132133
if not iv:
133-
raise ValueError('Missing Nonce')
134+
raise ValueError("Missing Nonce")
134135

135-
return self.key.decrypt(iv, cipher_text+tag, auth_data)
136+
return self.key.decrypt(iv, cipher_text + tag, auth_data)

src/cryptojwt/jwe/jwe.py

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,29 @@
2020

2121
logger = logging.getLogger(__name__)
2222

23-
__author__ = 'Roland Hedberg'
23+
__author__ = "Roland Hedberg"
2424

2525

2626
KEY_ERR = "Could not find any suitable encryption key for alg='{}'"
2727

2828

2929
class JWE(JWx):
30-
args = ["alg", "enc", "epk", "zip", "jku", "jwk", "x5u", "x5t",
31-
"x5c", "kid", "typ", "cty", "apu", "crit"]
30+
args = [
31+
"alg",
32+
"enc",
33+
"epk",
34+
"zip",
35+
"jku",
36+
"jwk",
37+
"x5u",
38+
"x5t",
39+
"x5c",
40+
"kid",
41+
"typ",
42+
"cty",
43+
"apu",
44+
"crit",
45+
]
3246

3347
"""
3448
:param msg: The message
@@ -91,7 +105,8 @@ def encrypt(self, keys=None, cek="", iv="", **kwargs):
91105
else: # _alg.startswith("ECDH-ES"):
92106
encrypter = JWE_EC(**self._dict)
93107
cek, encrypted_key, iv, params, eprivk = encrypter.enc_setup(
94-
self.msg, key=keys[0], **self._dict)
108+
self.msg, key=keys[0], **self._dict
109+
)
95110
kwargs["encrypted_key"] = encrypted_key
96111
kwargs["params"] = params
97112

@@ -114,12 +129,11 @@ def encrypt(self, keys=None, cek="", iv="", **kwargs):
114129

115130
try:
116131
token = encrypter.encrypt(key=_key, **kwargs)
117-
self["cek"] = encrypter.cek if 'cek' in encrypter else None
132+
self["cek"] = encrypter.cek if "cek" in encrypter else None
118133
except TypeError as err:
119134
raise err
120135
else:
121-
logger.debug(
122-
"Encrypted message using key with kid={}".format(key.kid))
136+
logger.debug("Encrypted message using key with kid={}".format(key.kid))
123137
return token
124138

125139
# logger.error("Could not find any suitable encryption key")
@@ -133,7 +147,7 @@ def decrypt(self, token=None, keys=None, alg=None, cek=None):
133147
elif self.jwt:
134148
_jwe = self.jwt
135149
else:
136-
raise ValueError('Nothing to decrypt')
150+
raise ValueError("Nothing to decrypt")
137151

138152
_alg = _jwe.headers["alg"]
139153
if alg and alg != _alg:
@@ -146,7 +160,7 @@ def decrypt(self, token=None, keys=None, alg=None, cek=None):
146160
keys = self.pick_keys(self._get_keys(), use="enc", alg=_alg)
147161

148162
try:
149-
keys.append(key_from_jwk_dict(_jwe.headers['jwk']))
163+
keys.append(key_from_jwk_dict(_jwe.headers["jwk"]))
150164
except KeyError:
151165
pass
152166

@@ -172,7 +186,7 @@ def decrypt(self, token=None, keys=None, alg=None, cek=None):
172186
if cek:
173187
try:
174188
msg = decrypter.decrypt(_jwe, cek=cek)
175-
self["cek"] = decrypter.cek if 'cek' in decrypter else None
189+
self["cek"] = decrypter.cek if "cek" in decrypter else None
176190
except (KeyError, DecryptionFailed):
177191
pass
178192
else:
@@ -187,22 +201,20 @@ def decrypt(self, token=None, keys=None, alg=None, cek=None):
187201

188202
try:
189203
msg = decrypter.decrypt(_jwe, _key)
190-
self["cek"] = decrypter.cek if 'cek' in decrypter else None
204+
self["cek"] = decrypter.cek if "cek" in decrypter else None
191205
except (KeyError, DecryptionFailed):
192206
pass
193207
else:
194-
logger.debug(
195-
"Decrypted message using key with kid=%s" % key.kid)
208+
logger.debug("Decrypted message using key with kid=%s" % key.kid)
196209
return msg
197210

198-
raise DecryptionFailed(
199-
"No available key that could decrypt the message")
211+
raise DecryptionFailed("No available key that could decrypt the message")
200212

201213
def alg2keytype(self, alg):
202214
return alg2keytype(alg)
203215

204216

205-
def factory(token, alg='', enc=''):
217+
def factory(token, alg="", enc=""):
206218
try:
207219
_jwt = JWEnc().unpack(token, alg=alg, enc=enc)
208220
except KeyError:

0 commit comments

Comments
 (0)