Skip to content

Commit f8e2c92

Browse files
author
Gasper Zejn
committed
Key.to_dict() now always returns JSON encodeable keys and values.
Fixes #137.
1 parent 1c3c1a6 commit f8e2c92

File tree

9 files changed

+46
-32
lines changed

9 files changed

+46
-32
lines changed

CHANGELOG.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ Bugfixes
2525

2626
* Fix invalid RSA private key PKCS8 encoding by python-rsa backend.
2727
`#120 <https://github.com/mpdavis/python-jose/pull/120>`_
28+
* Fix to_dict output, which should always be JSON encodeable.
29+
`#139 <https://github.com/mpdavis/python-jose/pull/139>`_
2830

2931
Housekeeping
3032
""""""""""""

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
@@ -138,5 +138,5 @@ def to_dict(self):
138138
return {
139139
'alg': self._algorithm,
140140
'kty': 'oct',
141-
'k': base64url_encode(self.prepared_key),
141+
'k': base64url_encode(self.prepared_key).decode('ascii'),
142142
}

tests/algorithms/test_EC.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,10 @@ def assert_parameters(self, as_dict, private):
194194
# Private parameters should be absent
195195
assert 'd' not in as_dict
196196

197+
# as_dict should be serializable to JSON
198+
import 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
@@ -31,7 +31,7 @@ def test_RSA_key(self):
3131

3232
def test_to_dict(self):
3333
passphrase = 'The quick brown fox jumps over the lazy dog'
34-
encoded = b'VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw'
34+
encoded = 'VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw'
3535
key = HMACKey(passphrase, ALGORITHMS.HS256)
3636

3737
as_dict = key.to_dict()
@@ -43,3 +43,7 @@ def test_to_dict(self):
4343

4444
assert 'k' in as_dict
4545
assert as_dict['k'] == encoded
46+
47+
# as_dict should be serializable to JSON
48+
import 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
@@ -370,6 +370,10 @@ def assert_parameters(self, as_dict, private):
370370
assert 'dq' not in as_dict
371371
assert 'qi' not in as_dict
372372

373+
# as_dict should be serializable to JSON
374+
import 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)