Skip to content

Commit abe1f20

Browse files
authored
Merge pull request #96 from IdentityPython/key_size
To be able to verify that keys are of a certain length/size.
2 parents 9ece2d0 + 5b654f5 commit abe1f20

File tree

5 files changed

+42
-1
lines changed

5 files changed

+42
-1
lines changed

src/cryptojwt/jwk/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ def serialize(self, private=False):
178178

179179
def get_key(self, private=False, **kwargs):
180180
"""
181-
Get a keys useful for signing and/or encrypting information.
181+
Get a key useful for signing and/or encrypting information.
182182
183183
:param private: Private key requested. If false return a public key.
184184
:return: A key instance. This can be an RSA, EC or other
@@ -290,6 +290,9 @@ def appropriate_for(self, usage, **kwargs):
290290
def update(self):
291291
pass
292292

293+
def key_len(self):
294+
raise NotImplemented
295+
293296

294297
def pems_to_x5c(cert_chain):
295298
"""

src/cryptojwt/jwk/ec.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from cryptography.hazmat.backends import default_backend
22
from cryptography.hazmat.primitives.asymmetric import ec
33

4+
from cryptojwt.exception import KeyNotFound
5+
46
from ..exception import DeSerializationNotPossible
57
from ..exception import JWKESTException
68
from ..exception import UnsupportedECurve
@@ -254,6 +256,14 @@ def __eq__(self, other):
254256

255257
return False
256258

259+
def key_len(self):
260+
if self.priv_key:
261+
return self.priv_key.key_size
262+
elif self.pub_key:
263+
return self.pub_key.key_size
264+
else:
265+
raise KeyNotFound
266+
257267

258268
def cmp_keys(a, b, key_type):
259269
if isinstance(a, key_type):

src/cryptojwt/jwk/hmac.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import logging
22
import os
33

4+
from cryptojwt.exception import KeyNotFound
5+
46
from ..exception import JWKException
57
from ..exception import UnsupportedAlgorithm
68
from ..exception import WrongUsage
@@ -149,6 +151,12 @@ def __eq__(self, other):
149151

150152
return True
151153

154+
def key_len(self):
155+
if self.key:
156+
return len(self.key)
157+
else:
158+
raise KeyNotFound
159+
152160

153161
def new_sym_key(use="", bytes=24, kid=""):
154162
_key = SYMKey(use=use, kid=kid, key=as_unicode(os.urandom(bytes)))

src/cryptojwt/jwk/rsa.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
from cryptography.hazmat.primitives import serialization
66
from cryptography.hazmat.primitives.asymmetric import rsa
77

8+
from cryptojwt.exception import KeyNotFound
9+
810
from ..exception import DeSerializationNotPossible
911
from ..exception import JWKESTException
1012
from ..exception import SerializationNotPossible
@@ -470,6 +472,14 @@ def __eq__(self, other):
470472
else:
471473
return cmp_private_numbers(pn1, pn2)
472474

475+
def key_len(self):
476+
if self.priv_key:
477+
return self.priv_key.key_size
478+
elif self.pub_key:
479+
return self.pub_key.key_size
480+
else:
481+
raise KeyNotFound
482+
473483

474484
def new_rsa_key(key_size=2048, kid="", public_exponent=65537, **kwargs):
475485
"""

tests/test_02_jwk.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,12 @@ def test_dumps():
115115
assert _eq(list(jwk.keys()), ["kty", "e", "n", "kid"])
116116

117117

118+
def test_key_size():
119+
_ckey = import_rsa_key_from_cert_file(CERT)
120+
jwk = jwk_wrap(_ckey)
121+
assert jwk.key_len() == 1024
122+
123+
118124
def test_import_rsa_key():
119125
_ckey = import_private_rsa_key_from_file(full_path(KEY))
120126
assert isinstance(_ckey, rsa.RSAPrivateKey)
@@ -163,6 +169,7 @@ def test_verify_2():
163169
_key = RSAKey()
164170
_key.load_key(import_rsa_key_from_cert_file(CERT))
165171
assert _key.verify()
172+
assert _key.key_len() == 1024 # default
166173

167174

168175
def test_cmp_rsa():
@@ -188,11 +195,13 @@ def test_import_export_eckey():
188195
_key = ECKey(**ECKEY)
189196
_key.deserialize()
190197
assert _eq(list(_key.keys()), ["y", "x", "d", "crv", "kty"])
198+
assert _key.key_len() == 521
191199

192200

193201
def test_new_ec_key():
194202
ec_key = new_ec_key("P-256")
195203
assert isinstance(ec_key, ECKey)
204+
assert ec_key.key_len() == 256
196205

197206

198207
def test_create_eckey():
@@ -622,6 +631,7 @@ def test_mint_new_sym_key():
622631
assert key.use == "sig"
623632
assert key.kid == "one"
624633
assert len(key.key) == 24
634+
assert key.key_len() == 24
625635

626636

627637
def test_dump_load():

0 commit comments

Comments
 (0)