Skip to content

Commit ddd0403

Browse files
author
Roland Hedberg
committed
Need long ints not ints. A Python2 problem.
1 parent ba8942b commit ddd0403

4 files changed

Lines changed: 46 additions & 9 deletions

File tree

src/jwkest/ecc.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from __future__ import print_function
44
from __future__ import absolute_import
55
from __future__ import division
6+
import six
7+
68
try:
79
from builtins import object
810
except ImportError:
@@ -68,12 +70,8 @@ def public_key_for(self, priv):
6870
# key
6971
def dh_z(self, priv, pub):
7072
return self.int2bytes( mulp(self.a, self.b, self.p, pub, priv)[0] )
71-
72-
# ECDSA (adapted from ecdsa.py)
73-
def sign(self, h, priv, k=None):
74-
while h > self.N:
75-
h >>= 1
76-
r = s = 0
73+
74+
def _sign_loop(self, r, s, h, k, priv):
7775
while r == 0 or s == 0:
7876
if k is None:
7977
k = (getrandbits(self.bits) % (self.N - 1)) + 1
@@ -83,7 +81,21 @@ def sign(self, h, priv, k=None):
8381
if r == 0:
8482
continue
8583
s = (kinv * (h + r * priv)) % self.N
86-
return self.int2bytes(r) + self.int2bytes(s)
84+
return r, s
85+
86+
# ECDSA (adapted from ecdsa.py)
87+
def sign(self, h, priv, k=None):
88+
while h > self.N:
89+
h >>= 1
90+
91+
if six.PY2:
92+
r = s = 0L
93+
else:
94+
r = s = 0
95+
96+
r, s = self._sign_loop(r, s, h, k, priv)
97+
98+
return self.int2bytes(r) + self.int2bytes(s)
8799

88100
def verify(self, h, sig, pub):
89101
while h > self.N:

src/jwkest/jwk.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,15 @@ def _split(self):
396396
self.d = self.key.d
397397
except AttributeError:
398398
pass
399+
else:
400+
for param in ["p", "q"]:
401+
try:
402+
val = getattr(self.key, param)
403+
except AttributeError:
404+
pass
405+
else:
406+
if val:
407+
setattr(self, param, val)
399408

400409
def load(self, filename):
401410
"""

tests/test_1_jwt.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,18 @@ def test_pack_unpack():
3434
"http://example.com/is_root"]
3535

3636

37+
def test_unpack_str():
38+
_jwt = JWT(**{"alg": "none"})
39+
payload = {"iss": "joe", "exp": 1300819380,
40+
"http://example.com/is_root": True}
41+
jwt = _jwt.pack(parts=[payload, ""])
42+
43+
jwt = jwt.decode('utf-8')
44+
45+
_jwt2 = JWT().unpack(jwt)
46+
assert _jwt2
47+
out_payload = _jwt2.payload()
48+
49+
3750
if __name__ == "__main__":
38-
test_pack_unpack()
51+
test_unpack_str()

tests/test_2_jwk.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
import six
88
from jwkest.ecc import P256
99
from jwkest import long2intarr
10-
from jwkest.jwk import jwk_wrap, import_rsa_key_from_file, rsa_eq, keyrep
10+
from jwkest.jwk import jwk_wrap
11+
from jwkest.jwk import import_rsa_key_from_file
12+
from jwkest.jwk import rsa_eq
13+
from jwkest.jwk import keyrep
1114
from jwkest.jwk import KEYS
1215
from jwkest.jwk import base64url_to_long
1316
from jwkest.jwk import ECKey

0 commit comments

Comments
 (0)