Skip to content

Commit 382b39d

Browse files
committed
fix(jwk): as_dict, as_pem, as_der export public key by default
#99
1 parent 955aaa0 commit 382b39d

8 files changed

Lines changed: 25 additions & 31 deletions

File tree

src/joserfc/_keys.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,16 +127,13 @@ def __eq__(self, other: t.Any) -> bool:
127127
assert isinstance(other, KeySet)
128128
return self.keys == other.keys
129129

130-
def as_dict(self, private: bool | None = None, **params: t.Any) -> KeySetSerialization:
130+
def as_dict(self, private: bool = False, **params: t.Any) -> KeySetSerialization:
131131
keys: list[DictKey] = []
132132

133133
for key in self.keys:
134134
# trigger key to generate kid via thumbprint
135135
key.ensure_kid()
136-
if isinstance(key, OctKey):
137-
keys.append(key.as_dict(**params))
138-
else:
139-
keys.append(key.as_dict(private=private, **params))
136+
keys.append(key.as_dict(private=private, **params))
140137
return {"keys": keys}
141138

142139
def get_by_kid(self, kid: str | None = None, parameters: KeyParameters | None = None) -> Key:

src/joserfc/_rfc7517/models.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def import_from_bytes(cls, value: bytes, password: t.Any = None) -> t.Any:
4949
def as_bytes(
5050
key: GenericKey,
5151
encoding: t.Literal["PEM", "DER"] | None = None,
52-
private: bool | None = None,
52+
private: bool = False,
5353
password: str | None = None,
5454
) -> bytes:
5555
raise NotImplementedError()
@@ -177,7 +177,7 @@ def thumbprint_uri(self) -> str:
177177
value = self.thumbprint()
178178
return concat_thumbprint_uri(value, self.thumbprint_digest_method)
179179

180-
def as_dict(self, private: bool | None = None, **params: t.Any) -> DictKey:
180+
def as_dict(self, private: bool = False, **params: t.Any) -> DictKey:
181181
"""Output this key to a JWK format (in dict). By default, it will return
182182
the ``dict_value`` of this key.
183183
@@ -190,7 +190,7 @@ def as_dict(self, private: bool | None = None, **params: t.Any) -> DictKey:
190190
raise ValueError("This key is not a private key.")
191191

192192
data = self.dict_value.copy()
193-
if private is not False:
193+
if private:
194194
data.update(params)
195195
return data
196196

@@ -322,15 +322,15 @@ def raw_value(self) -> t.Union[NativePublicKey, NativePrivateKey]:
322322
def as_bytes(
323323
self,
324324
encoding: t.Literal["PEM", "DER"] | None = None,
325-
private: bool | None = None,
325+
private: bool = False,
326326
password: str | None = None,
327327
) -> bytes:
328328
return self.binding.as_bytes(self, encoding, private, password)
329329

330-
def as_pem(self, private: bool | None = None, password: str | None = None) -> bytes:
330+
def as_pem(self, private: bool = False, password: str | None = None) -> bytes:
331331
return self.as_bytes(private=private, password=password)
332332

333-
def as_der(self, private: bool | None = None, password: str | None = None) -> bytes:
333+
def as_der(self, private: bool = False, password: str | None = None) -> bytes:
334334
return self.as_bytes(encoding="DER", private=private, password=password)
335335

336336

src/joserfc/_rfc7517/pem.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,9 @@ def import_from_bytes(cls, value: bytes, password: Any | None = None) -> Any:
134134
def as_bytes(
135135
key: GenericKey,
136136
encoding: Literal["PEM", "DER"] | None = None,
137-
private: bool | None = False,
137+
private: bool = False,
138138
password: Any | None = None,
139139
) -> bytes:
140-
if private is None:
141-
private = key.is_private
142-
143140
if private:
144141
return dump_pem_key(key.private_key, encoding, private, password)
145142
else:

src/joserfc/_rfc7518/oct_key.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import typing as t
12
from typing import Any
23
import secrets
34
import warnings
@@ -101,3 +102,6 @@ def generate_key(
101102
if auto_kid:
102103
key.ensure_kid()
103104
return key
105+
106+
def as_dict(self, private: bool = False, **params: t.Any) -> DictKey:
107+
return super().as_dict(private=True, **params)

tests/jwk/test_ec_key.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,14 @@ def test_import_invalid_pem_key(self):
8484

8585
def test_output_with_password(self):
8686
key = ECKey.import_key(read_key("ec-p256-private.pem"))
87-
pem = key.as_pem(password="secret")
87+
pem = key.as_pem(private=True, password="secret")
8888
self.assertRaises(TypeError, ECKey.import_key, pem)
8989
key2 = ECKey.import_key(pem, password="secret")
9090
self.assertEqual(key.as_dict(), key2.as_dict())
9191

9292
def test_key_eq(self):
9393
key1 = self.default_key
94-
key2 = ECKey.import_key(key1.as_dict())
94+
key2 = ECKey.import_key(key1.as_dict(private=True))
9595
self.assertEqual(key1, key2)
9696
key3 = ECKey.generate_key()
9797
self.assertNotEqual(key1, key3)

tests/jwk/test_jwk_set.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def test_generate_and_import_key_set(self):
1919
# we will ensure kid when generating the key set
2020
self.assertIsNotNone(key.kid)
2121

22-
jwks1_data = jwks1.as_dict()
22+
jwks1_data = jwks1.as_dict(private=True)
2323
self.assertEqual(list(jwks1_data.keys()), ["keys"])
2424
for d1 in jwks1_data["keys"]:
2525
self.assertIn("d", d1)
@@ -90,6 +90,6 @@ def test_key_eq_with_same_keys(self):
9090

9191
def test_key_eq_with_new_keys(self):
9292
key_set1 = KeySet.generate_key_set("RSA", 2048)
93-
key_set2 = KeySet([RSAKey.import_key(k.as_dict()) for k in key_set1])
93+
key_set2 = KeySet([RSAKey.import_key(k.as_dict(private=True)) for k in key_set1])
9494
self.assertIsNot(key_set1, key_set2)
9595
self.assertEqual(key_set1, key_set2)

tests/jwk/test_okp_key.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@ def test_import_pem_key(self):
4646
private_key: OKPKey = OKPKey.import_key(private_pem)
4747
public_key: OKPKey = OKPKey.import_key(public_pem)
4848

49-
self.assertEqual(private_key.as_pem(), private_pem)
49+
self.assertEqual(private_key.as_pem(private=True), private_pem)
5050
self.assertEqual(private_key.as_pem(private=False), public_pem)
5151
self.assertEqual(public_key.as_pem(), public_pem)
5252

53-
self.assertIn("d", private_key.as_dict())
53+
self.assertIn("d", private_key.as_dict(private=True))
5454
self.assertNotIn("d", public_key.as_dict())
5555

5656
def test_import_invalid_pem_key(self):
@@ -88,15 +88,15 @@ def test_all_as_methods(self):
8888
key: OKPKey = OKPKey.import_key(private_json)
8989

9090
# as_dict
91-
data = key.as_dict()
91+
data = key.as_dict(private=True)
9292
self.assertIn("d", data)
9393
self.assertEqual(data, private_json)
9494
data = key.as_dict(private=False)
9595
self.assertNotIn("d", data)
9696
self.assertEqual(data, public_json)
9797

9898
# as_pem
99-
data = key.as_pem()
99+
data = key.as_pem(private=True)
100100
self.assertIn(b"PRIVATE", data)
101101
data = key.as_pem(private=False)
102102
self.assertIn(b"PUBLIC", data)
@@ -107,14 +107,14 @@ def test_all_as_methods(self):
107107

108108
def test_output_with_password(self):
109109
key = OKPKey.import_key(read_key("okp-ed25519-private.json"))
110-
pem = key.as_pem(password="secret")
110+
pem = key.as_pem(private=True, password="secret")
111111
self.assertRaises(TypeError, OKPKey.import_key, pem)
112112
key2 = OKPKey.import_key(pem, password="secret")
113113
self.assertEqual(key.as_pem(), key2.as_pem())
114114

115115
def test_key_eq(self):
116116
key1 = OKPKey.generate_key()
117-
key2 = OKPKey.import_key(key1.as_dict())
117+
key2 = OKPKey.import_key(key1.as_dict(private=True))
118118
self.assertIsNot(key1, key2)
119119
self.assertEqual(key1, key2)
120120
key3 = OKPKey.generate_key()

tests/jwk/test_rsa_key.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,16 +101,12 @@ def test_output_as_methods(self):
101101
key: RSAKey = RSAKey.import_key(private_pem)
102102

103103
# as_dict
104-
data = key.as_dict()
105-
self.assertIn("d", data)
106104
data = key.as_dict(private=True)
107105
self.assertIn("d", data)
108106
data = key.as_dict(private=False)
109107
self.assertNotIn("d", data)
110108

111109
# as_pem
112-
data = key.as_pem()
113-
self.assertIn(b"PRIVATE", data)
114110
data = key.as_pem(private=True)
115111
self.assertIn(b"PRIVATE", data)
116112
data = key.as_pem(private=False)
@@ -172,14 +168,14 @@ def test_import_invalid_pem_key(self):
172168
def test_output_with_password(self):
173169
private_pem = read_key("rsa-openssl-private.pem")
174170
key: RSAKey = RSAKey.import_key(private_pem)
175-
pem = key.as_pem(password="secret")
171+
pem = key.as_pem(private=True, password="secret")
176172
self.assertRaises(TypeError, RSAKey.import_key, pem)
177173
key2 = RSAKey.import_key(pem, password="secret")
178174
self.assertEqual(key.as_dict(), key2.as_dict())
179175

180176
def test_key_eq(self):
181177
key1 = self.default_key
182-
key2 = RSAKey.import_key(key1.as_dict())
178+
key2 = RSAKey.import_key(key1.as_dict(private=True))
183179
self.assertIsNot(key1, key2)
184180
self.assertEqual(key1, key2)
185181
key3 = RSAKey.generate_key()

0 commit comments

Comments
 (0)