Skip to content

Commit 1390392

Browse files
authored
Merge pull request #165 from blag/json-encodeable-jwk-dict
Json encodeable jwk dict
2 parents ba738d9 + 9df2861 commit 1390392

File tree

10 files changed

+48
-32
lines changed

10 files changed

+48
-32
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog #
22

3+
## Development ##
4+
5+
* Fix `to_dict` output, which should always be JSON encodeable. #139 (fixes #127 and #137)
6+
37
## 3.1.0 -- 2019-12-10 ##
48

59
This is a greatly overdue release.

CHANGELOG.rst

Whitespace-only changes.

jose/backends/cryptography_backend.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -183,15 +183,15 @@ def to_dict(self):
183183
'alg': self._algorithm,
184184
'kty': 'EC',
185185
'crv': crv,
186-
'x': long_to_base64(public_key.public_numbers().x, size=key_size),
187-
'y': long_to_base64(public_key.public_numbers().y, size=key_size),
186+
'x': long_to_base64(public_key.public_numbers().x, size=key_size).decode('ASCII'),
187+
'y': long_to_base64(public_key.public_numbers().y, size=key_size).decode('ASCII'),
188188
}
189189

190190
if not self.is_public():
191191
data['d'] = long_to_base64(
192192
self.prepared_key.private_numbers().private_value,
193193
size=key_size
194-
)
194+
).decode('ASCII')
195195

196196
return data
197197

@@ -354,18 +354,18 @@ def to_dict(self):
354354
data = {
355355
'alg': self._algorithm,
356356
'kty': 'RSA',
357-
'n': long_to_base64(public_key.public_numbers().n),
358-
'e': long_to_base64(public_key.public_numbers().e),
357+
'n': long_to_base64(public_key.public_numbers().n).decode('ASCII'),
358+
'e': long_to_base64(public_key.public_numbers().e).decode('ASCII'),
359359
}
360360

361361
if not self.is_public():
362362
data.update({
363-
'd': long_to_base64(self.prepared_key.private_numbers().d),
364-
'p': long_to_base64(self.prepared_key.private_numbers().p),
365-
'q': long_to_base64(self.prepared_key.private_numbers().q),
366-
'dp': long_to_base64(self.prepared_key.private_numbers().dmp1),
367-
'dq': long_to_base64(self.prepared_key.private_numbers().dmq1),
368-
'qi': long_to_base64(self.prepared_key.private_numbers().iqmp),
363+
'd': long_to_base64(self.prepared_key.private_numbers().d).decode('ASCII'),
364+
'p': long_to_base64(self.prepared_key.private_numbers().p).decode('ASCII'),
365+
'q': long_to_base64(self.prepared_key.private_numbers().q).decode('ASCII'),
366+
'dp': long_to_base64(self.prepared_key.private_numbers().dmp1).decode('ASCII'),
367+
'dq': long_to_base64(self.prepared_key.private_numbers().dmq1).decode('ASCII'),
368+
'qi': long_to_base64(self.prepared_key.private_numbers().iqmp).decode('ASCII'),
369369
})
370370

371371
return data

jose/backends/ecdsa_backend.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,14 +131,14 @@ def to_dict(self):
131131
'alg': self._algorithm,
132132
'kty': 'EC',
133133
'crv': crv,
134-
'x': long_to_base64(public_key.pubkey.point.x(), size=key_size),
135-
'y': long_to_base64(public_key.pubkey.point.y(), size=key_size),
134+
'x': long_to_base64(public_key.pubkey.point.x(), size=key_size).decode('ASCII'),
135+
'y': long_to_base64(public_key.pubkey.point.y(), size=key_size).decode('ASCII'),
136136
}
137137

138138
if not self.is_public():
139139
data['d'] = long_to_base64(
140140
self.prepared_key.privkey.secret_multiplier,
141141
size=key_size
142-
)
142+
).decode('ASCII')
143143

144144
return data

jose/backends/pycrypto_backend.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,8 @@ def to_dict(self):
185185
data = {
186186
'alg': self._algorithm,
187187
'kty': 'RSA',
188-
'n': long_to_base64(self.prepared_key.n),
189-
'e': long_to_base64(self.prepared_key.e),
188+
'n': long_to_base64(self.prepared_key.n).decode('ASCII'),
189+
'e': long_to_base64(self.prepared_key.e).decode('ASCII'),
190190
}
191191

192192
if not self.is_public():
@@ -201,12 +201,12 @@ def to_dict(self):
201201
dp = self.prepared_key.d % (self.prepared_key.p - 1)
202202
dq = self.prepared_key.d % (self.prepared_key.q - 1)
203203
data.update({
204-
'd': long_to_base64(self.prepared_key.d),
205-
'p': long_to_base64(self.prepared_key.q),
206-
'q': long_to_base64(self.prepared_key.p),
207-
'dp': long_to_base64(dq),
208-
'dq': long_to_base64(dp),
209-
'qi': long_to_base64(self.prepared_key.u),
204+
'd': long_to_base64(self.prepared_key.d).decode('ASCII'),
205+
'p': long_to_base64(self.prepared_key.q).decode('ASCII'),
206+
'q': long_to_base64(self.prepared_key.p).decode('ASCII'),
207+
'dp': long_to_base64(dq).decode('ASCII'),
208+
'dq': long_to_base64(dp).decode('ASCII'),
209+
'qi': long_to_base64(self.prepared_key.u).decode('ASCII'),
210210
})
211211

212212
return data

jose/backends/rsa_backend.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -246,18 +246,18 @@ def to_dict(self):
246246
data = {
247247
'alg': self._algorithm,
248248
'kty': 'RSA',
249-
'n': long_to_base64(public_key.n),
250-
'e': long_to_base64(public_key.e),
249+
'n': long_to_base64(public_key.n).decode('ASCII'),
250+
'e': long_to_base64(public_key.e).decode('ASCII'),
251251
}
252252

253253
if not self.is_public():
254254
data.update({
255-
'd': long_to_base64(self._prepared_key.d),
256-
'p': long_to_base64(self._prepared_key.p),
257-
'q': long_to_base64(self._prepared_key.q),
258-
'dp': long_to_base64(self._prepared_key.exp1),
259-
'dq': long_to_base64(self._prepared_key.exp2),
260-
'qi': long_to_base64(self._prepared_key.coef),
255+
'd': long_to_base64(self._prepared_key.d).decode('ASCII'),
256+
'p': long_to_base64(self._prepared_key.p).decode('ASCII'),
257+
'q': long_to_base64(self._prepared_key.q).decode('ASCII'),
258+
'dp': long_to_base64(self._prepared_key.exp1).decode('ASCII'),
259+
'dq': long_to_base64(self._prepared_key.exp2).decode('ASCII'),
260+
'qi': long_to_base64(self._prepared_key.coef).decode('ASCII'),
261261
})
262262

263263
return data

jose/jwk.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,5 +137,5 @@ def to_dict(self):
137137
return {
138138
'alg': self._algorithm,
139139
'kty': 'oct',
140-
'k': base64url_encode(self.prepared_key),
140+
'k': base64url_encode(self.prepared_key).decode('ASCII'),
141141
}

tests/algorithms/test_EC.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import json
12

23
from jose.constants import ALGORITHMS
34
from jose.exceptions import JOSEError, JWKError
@@ -194,6 +195,9 @@ def assert_parameters(self, as_dict, private):
194195
# Private parameters should be absent
195196
assert 'd' not in as_dict
196197

198+
# as_dict should be serializable to JSON
199+
json.dumps(as_dict)
200+
197201
def test_to_dict(self):
198202
key = ECKey(private_key, ALGORITHMS.ES256)
199203
self.assert_parameters(key.to_dict(), private=True)

tests/algorithms/test_HMAC.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import json
12

23
from jose.constants import ALGORITHMS
34
from jose.exceptions import JOSEError
@@ -31,7 +32,7 @@ def test_RSA_key(self):
3132

3233
def test_to_dict(self):
3334
passphrase = 'The quick brown fox jumps over the lazy dog'
34-
encoded = b'VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw'
35+
encoded = 'VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw'
3536
key = HMACKey(passphrase, ALGORITHMS.HS256)
3637

3738
as_dict = key.to_dict()
@@ -43,3 +44,6 @@ def test_to_dict(self):
4344

4445
assert 'k' in as_dict
4546
assert as_dict['k'] == encoded
47+
48+
# as_dict should be serializable to JSON
49+
json.dumps(as_dict)

tests/algorithms/test_RSA.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import base64
2+
import json
23
import sys
34

45
try:
@@ -370,6 +371,9 @@ def assert_parameters(self, as_dict, private):
370371
assert 'dq' not in as_dict
371372
assert 'qi' not in as_dict
372373

374+
# as_dict should be serializable to JSON
375+
json.dumps(as_dict)
376+
373377
def assert_roundtrip(self, key):
374378
assert RSAKey(
375379
key.to_dict(),

0 commit comments

Comments
 (0)