Skip to content

Commit 585cc31

Browse files
committed
To be able to verify that keys are of a certain length/size.
1 parent 9ece2d0 commit 585cc31

File tree

5 files changed

+40
-4
lines changed

5 files changed

+40
-4
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: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from cryptography.hazmat.backends import default_backend
22
from cryptography.hazmat.primitives.asymmetric import ec
3+
from cryptojwt.exception import KeyNotFound
34

45
from ..exception import DeSerializationNotPossible
56
from ..exception import JWKESTException
@@ -254,6 +255,14 @@ def __eq__(self, other):
254255

255256
return False
256257

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

258267
def cmp_keys(a, b, key_type):
259268
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: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from cryptography.hazmat.backends import default_backend
55
from cryptography.hazmat.primitives import serialization
66
from cryptography.hazmat.primitives.asymmetric import rsa
7+
from cryptojwt.exception import KeyNotFound
78

89
from ..exception import DeSerializationNotPossible
910
from ..exception import JWKESTException
@@ -470,6 +471,14 @@ def __eq__(self, other):
470471
else:
471472
return cmp_private_numbers(pn1, pn2)
472473

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

474483
def new_rsa_key(key_size=2048, kid="", public_exponent=65537, **kwargs):
475484
"""

tests/test_02_jwk.py

Lines changed: 10 additions & 3 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,7 +169,7 @@ def test_verify_2():
163169
_key = RSAKey()
164170
_key.load_key(import_rsa_key_from_cert_file(CERT))
165171
assert _key.verify()
166-
172+
assert _key.key_len() == 1024 # default
167173

168174
def test_cmp_rsa():
169175
_key1 = RSAKey()
@@ -188,12 +194,13 @@ def test_import_export_eckey():
188194
_key = ECKey(**ECKEY)
189195
_key.deserialize()
190196
assert _eq(list(_key.keys()), ["y", "x", "d", "crv", "kty"])
197+
assert _key.key_len() == 521
191198

192199

193200
def test_new_ec_key():
194201
ec_key = new_ec_key("P-256")
195202
assert isinstance(ec_key, ECKey)
196-
203+
assert ec_key.key_len() == 256
197204

198205
def test_create_eckey():
199206
ec = new_ec_key("P-256")
@@ -622,7 +629,7 @@ def test_mint_new_sym_key():
622629
assert key.use == "sig"
623630
assert key.kid == "one"
624631
assert len(key.key) == 24
625-
632+
assert key.key_len() == 24
626633

627634
def test_dump_load():
628635
_ckey = import_rsa_key_from_cert_file(CERT)

0 commit comments

Comments
 (0)