Skip to content

Commit 2bf6328

Browse files
committed
fix(jwk): add security warnings at OctKey.import_key and RSAKey.import_key
1 parent d91b358 commit 2bf6328

File tree

4 files changed

+42
-3
lines changed

4 files changed

+42
-3
lines changed

src/joserfc/_rfc7518/oct_key.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@ def import_key(
5757
parameters: KeyParameters | None = None,
5858
password: Any = None,
5959
) -> "OctKey":
60-
return super(OctKey, cls).import_key(value, parameters, password)
60+
key: OctKey = super(OctKey, cls).import_key(value, parameters, password)
61+
if len(key.raw_value) < 14:
62+
# https://csrc.nist.gov/publications/detail/sp/800-131a/rev-2/final
63+
warnings.warn("Key size should be >= 112 bits", SecurityWarning)
64+
return key
6165

6266
@classmethod
6367
def generate_key(

src/joserfc/_rfc7518/rsa_key.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,11 @@ def import_key(
139139
parameters: KeyParameters | None = None,
140140
password: Any = None,
141141
) -> "RSAKey":
142-
return super(RSAKey, cls).import_key(value, parameters, password)
142+
key: RSAKey = super(RSAKey, cls).import_key(value, parameters, password)
143+
if key.raw_value.key_size < 2048:
144+
# https://csrc.nist.gov/publications/detail/sp/800-131a/rev-2/final
145+
warnings.warn("Key size should be >= 2048 bits", SecurityWarning)
146+
return key
143147

144148
@classmethod
145149
def generate_key(

tests/jwk/test_oct_key.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from unittest import TestCase
22
from joserfc.jwk import OctKey
3+
from joserfc.errors import SecurityWarning
34
from tests.keys import read_key
45

56

@@ -86,7 +87,7 @@ def test_invalid_key_ops(self):
8687

8788
def test_import_pem_key(self):
8889
public_pem = read_key("ec-p256-public.pem")
89-
self.assertWarns(UserWarning, OctKey.import_key, public_pem)
90+
self.assertWarns(SecurityWarning, OctKey.import_key, public_pem)
9091

9192
def test_generate_key(self):
9293
key = OctKey.generate_key()
@@ -103,6 +104,12 @@ def test_generate_key(self):
103104
key = OctKey.generate_key(auto_kid=True)
104105
self.assertIsNotNone(key.kid)
105106

107+
def test_generate_key_with_warnings(self):
108+
self.assertWarns(SecurityWarning, OctKey.generate_key, 16)
109+
110+
def test_import_key_with_warnings(self):
111+
self.assertWarns(SecurityWarning, OctKey.import_key, b"rfc")
112+
106113
def test_key_eq(self):
107114
key1 = OctKey.generate_key()
108115
key2 = OctKey.import_key(key1.as_dict())

tests/jwk/test_rsa_key.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from unittest import TestCase
22
from joserfc.jwk import RSAKey
3+
from joserfc.errors import SecurityWarning
34
from tests.keys import read_key
45

56

@@ -126,6 +127,29 @@ def test_generate_key(self):
126127
key = RSAKey.generate_key(auto_kid=True)
127128
self.assertIsNotNone(key.kid)
128129

130+
def test_generate_key_with_warnings(self):
131+
self.assertWarns(SecurityWarning, RSAKey.generate_key, 1024)
132+
133+
def test_import_key_with_warnings(self):
134+
rsa_jwk = {
135+
"n": (
136+
"qEr7algLblN5qcstFCfOkAVERAWOyq3UuIor3BZq6s932Zs97yrkKw6XhKobGlNKEXNJhFiKU9oG-XA1dyvwv"
137+
"9uRbFPiUxLC0IS1mnIeF1Uz3n9h8o3v23TIkbcTPPNsJJuSPiRybefddDBtld7i_9mzNjDR4Ios6DJCNthnIKc"
138+
),
139+
"e": "AQAB",
140+
"d": (
141+
"QfOYkXVNjX_TFvJTiSmMbq5RsWKIMe9rhKJJS-fRIJILgtCutdKWNjVytX_APVHUngATGHVmSDQSNaB-o2Qp5TMG"
142+
"0KQ8-TuCXD3nRQIsDj0CCRSuq_CoVUjsFkP3hPvJ8MStN5xpyNGWusHNjgyz_KMQMziFM2wnjRIpMw7J3ck"
143+
),
144+
"p": "3fJ5EmJpD7YCElVtAWBUWSVw5uO_NcvDMvTsshVsSY7H6atE4UZSsKEy3HKmVLB3zfqHZYg1Bd8DV52EnGOogw",
145+
"q": "wh0awdt7hnpdHJGbrbaC1Pr12MRd6bnraPTGewBB9o6KxPXpkSVBlm5mLuhEiB0gnuA933zxvt1bSHHUNuGGDQ",
146+
"dp": "1GFJ6YWx8w6_PLvx6vc6v3NMbiRQvDGXQBOOy3okfN7b_YWeC9M3HT2jZb9v2mpiuf-ZwFZuJogYsqZQVzYl8Q",
147+
"dq": "U5Tqn4xdHON1UkbULLFIlmJVF3g-I9SdK70x9WaAAKUR1Ys5ffj3y8lPkGUMlTtNf3t4yNFo2lE_6-qvgM4MxQ",
148+
"qi": "dhaZmFV6lFH-jD4hb_-GtaMlsk97gqW7zU2gSVZdULGXZsqbQEfm0k34mglOWC6Hxmi1rqQB_HAe9HUyNdHPXg",
149+
"kty": "RSA",
150+
}
151+
self.assertWarns(SecurityWarning, RSAKey.import_key, rsa_jwk)
152+
129153
def test_import_from_der_bytes(self):
130154
value1 = self.default_key.as_der()
131155
key1 = RSAKey.import_key(value1)

0 commit comments

Comments
 (0)