Skip to content

Commit e59c47d

Browse files
committed
fix(types): using __future__ annotations
1 parent 939b7c4 commit e59c47d

File tree

24 files changed

+217
-205
lines changed

24 files changed

+217
-205
lines changed

src/joserfc/_keys.py

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from __future__ import annotations
12
import typing as t
23
import random
34
from .rfc7517.types import AnyKey, KeyParameters, DictKey
@@ -46,8 +47,8 @@ class JWKRegistry:
4647
def import_key(
4748
cls,
4849
data: AnyKey,
49-
key_type: t.Optional[str] = None,
50-
parameters: t.Optional[KeyParameters] = None) -> Key:
50+
key_type: str | None = None,
51+
parameters: KeyParameters | None = None) -> Key:
5152
"""A class method for importing a key from bytes, string, and dict.
5253
When ``value`` is a dict, this method can tell the key type automatically,
5354
otherwise, developers SHOULD pass the ``key_type`` themselves.
@@ -76,8 +77,8 @@ def import_key(
7677
def generate_key(
7778
cls,
7879
key_type: str,
79-
crv_or_size: t.Union[str, int],
80-
parameters: t.Optional[KeyParameters] = None,
80+
crv_or_size: str | int,
81+
parameters: KeyParameters | None = None,
8182
private: bool = True,
8283
auto_kid: bool = False) -> Key:
8384
"""A class method for generating key according to the given key type.
@@ -102,12 +103,12 @@ def generate_key(
102103

103104
class KeySet:
104105
#: keys in the key set
105-
keys: t.List[Key]
106+
keys: list[Key]
106107

107108
registry_cls: t.Type[JWKRegistry] = JWKRegistry
108-
algorithm_keys: t.ClassVar[t.Dict[str, t.List[str]]] = {}
109+
algorithm_keys: t.ClassVar[t.Dict[str, list[str]]] = {}
109110

110-
def __init__(self, keys: t.List[Key]):
111+
def __init__(self, keys: list[Key]):
111112
for key in keys:
112113
key.ensure_kid()
113114
self.keys = keys
@@ -118,8 +119,8 @@ def __iter__(self) -> t.Iterator[Key]:
118119
def __bool__(self) -> bool:
119120
return bool(self.keys)
120121

121-
def as_dict(self, private: t.Optional[bool] = None, **params: t.Any) -> KeySetSerialization:
122-
keys: t.List[DictKey] = []
122+
def as_dict(self, private: bool | None = None, **params: t.Any) -> KeySetSerialization:
123+
keys: list[DictKey] = []
123124

124125
for key in self.keys:
125126
# trigger key to generate kid via thumbprint
@@ -130,7 +131,7 @@ def as_dict(self, private: t.Optional[bool] = None, **params: t.Any) -> KeySetSe
130131
keys.append(key.as_dict(private=private, **params))
131132
return {"keys": keys}
132133

133-
def get_by_kid(self, kid: t.Optional[str] = None) -> Key:
134+
def get_by_kid(self, kid: str | None = None) -> Key:
134135
if kid is None and len(self.keys) == 1:
135136
return self.keys[0]
136137

@@ -153,8 +154,8 @@ def pick_random_key(self, algorithm: str) -> t.Optional[Key]:
153154
def import_key_set(
154155
cls,
155156
value: KeySetSerialization,
156-
parameters: t.Optional[KeyParameters] = None) -> "KeySet":
157-
keys: t.List[Key] = []
157+
parameters: KeyParameters | None = None) -> "KeySet":
158+
keys: list[Key] = []
158159

159160
for data in value["keys"]:
160161
keys.append(cls.registry_cls.import_key(data, parameters=parameters))
@@ -165,12 +166,12 @@ def import_key_set(
165166
def generate_key_set(
166167
cls,
167168
key_type: str,
168-
crv_or_size: t.Union[str, int],
169-
parameters: t.Optional[KeyParameters] = None,
169+
crv_or_size: str | int,
170+
parameters: KeyParameters | None = None,
170171
private: bool = True,
171172
count: int = 4) -> "KeySet":
172173

173-
keys: t.List[Key] = []
174+
keys: list[Key] = []
174175
for _ in range(count):
175176
key = cls.registry_cls.generate_key(key_type, crv_or_size, parameters, private)
176177
keys.append(key)

src/joserfc/drafts/jwe_chacha20.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Tuple
1+
from __future__ import annotations
22
from Crypto.Cipher import ChaCha20_Poly1305
33
from ..rfc7516.registry import JWERegistry
44
from ..rfc7516.models import JWEEncModel
@@ -16,7 +16,7 @@ def __init__(self, name: str, description: str, iv_size: int):
1616
self.description = description
1717
self.iv_size = iv_size
1818

19-
def encrypt(self, plaintext: bytes, cek: bytes, iv: bytes, aad: bytes) -> Tuple[bytes, bytes]:
19+
def encrypt(self, plaintext: bytes, cek: bytes, iv: bytes, aad: bytes) -> tuple[bytes, bytes]:
2020
"""Key Encryption with AEAD_CHACHA20_POLY1305
2121
"""
2222
chacha = ChaCha20_Poly1305.new(key=cek, nonce=iv)

src/joserfc/drafts/jwe_ecdh_1pu.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import typing as t
1+
from __future__ import annotations
22
from ..rfc7516.models import (
33
Recipient,
44
JWEKeyAgreement,
@@ -36,7 +36,7 @@ class ECDH1PUAlgModel(JWEKeyAgreement):
3636
key_types = ["EC", "OKP"]
3737
tag_aware = True
3838

39-
def __init__(self, key_wrapping: t.Optional[JWEKeyWrapping]):
39+
def __init__(self, key_wrapping: JWEKeyWrapping | None):
4040
if key_wrapping is None:
4141
self.name = "ECDH-1PU"
4242
self.description = "ECDH-1PU using one-pass KDF and CEK in the Direct Key Agreement mode"
@@ -86,7 +86,7 @@ def __encrypt_agreed_upon_key(
8686
self,
8787
enc: JWEEncModel,
8888
recipient: Recipient[ECKey],
89-
tag: t.Optional[bytes]) -> bytes:
89+
tag: bytes | None) -> bytes:
9090
sender_key = recipient.sender_key
9191
recipient_key = recipient.recipient_key
9292
ephemeral_key = recipient.ephemeral_key
@@ -104,7 +104,7 @@ def __decrypt_agreed_upon_key(
104104
self,
105105
enc: JWEEncModel,
106106
recipient: Recipient[ECKey],
107-
tag: t.Optional[bytes]) -> bytes:
107+
tag: bytes | None) -> bytes:
108108

109109
self._check_enc(enc)
110110
headers = recipient.headers()

src/joserfc/errors.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Optional
1+
from __future__ import annotations
22

33

44
class JoseError(Exception):
@@ -9,7 +9,7 @@ class JoseError(Exception):
99
#: long-string to describe this error
1010
description: str = ""
1111

12-
def __init__(self, description: Optional[str] = None):
12+
def __init__(self, description: str | None = None):
1313
if description is not None:
1414
self.description = description
1515

src/joserfc/jwe.py

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import typing as t
1+
from __future__ import annotations
22
from typing import overload
33
from .rfc7516.types import (
44
GeneralJSONSerialization,
@@ -69,11 +69,11 @@ def register_algorithms() -> None:
6969

7070
def encrypt_compact(
7171
protected: Header,
72-
plaintext: t.Union[bytes, str],
72+
plaintext: bytes | str,
7373
public_key: KeyFlexible,
74-
algorithms: t.Optional[t.List[str]] = None,
75-
registry: t.Optional[JWERegistry] = None,
76-
sender_key: t.Optional[t.Union[ECKey, OKPKey, KeySet]] = None) -> str:
74+
algorithms: list[str] | None = None,
75+
registry: JWERegistry | None = None,
76+
sender_key: ECKey | OKPKey | KeySet | None = None) -> str:
7777
"""Generate a JWE Compact Serialization. The JWE Compact Serialization represents
7878
encrypted content as a compact, URL-safe string. This string is::
7979
@@ -111,11 +111,11 @@ def encrypt_compact(
111111

112112

113113
def decrypt_compact(
114-
value: t.Union[bytes, str],
114+
value: bytes | str,
115115
private_key: KeyFlexible,
116-
algorithms: t.Optional[t.List[str]] = None,
117-
registry: t.Optional[JWERegistry] = None,
118-
sender_key: t.Optional[t.Union[ECKey, OKPKey, KeySet]] = None) -> CompactEncryption:
116+
algorithms: list[str] | None = None,
117+
registry: JWERegistry | None = None,
118+
sender_key: ECKey | OKPKey | KeySet | None = None) -> CompactEncryption:
119119
"""Extract and validate the JWE Compact Serialization (in string, or bytes)
120120
with the given key. An JWE Compact Serialization looks like:
121121
@@ -156,30 +156,30 @@ def decrypt_compact(
156156
@overload
157157
def encrypt_json(
158158
obj: GeneralJSONEncryption,
159-
public_key: t.Optional[KeyFlexible],
160-
algorithms: t.Optional[t.List[str]] = None,
161-
registry: t.Optional[JWERegistry] = None,
162-
sender_key: t.Optional[t.Union[ECKey, OKPKey, KeySet]] = None) -> GeneralJSONSerialization:
159+
public_key: KeyFlexible | None,
160+
algorithms: list[str] | None = None,
161+
registry: JWERegistry | None = None,
162+
sender_key: ECKey | OKPKey | KeySet | None = None) -> GeneralJSONSerialization:
163163
...
164164

165165

166166
@overload
167167
def encrypt_json(
168168
obj: FlattenedJSONEncryption,
169-
public_key: t.Optional[KeyFlexible],
170-
algorithms: t.Optional[t.List[str]] = None,
171-
registry: t.Optional[JWERegistry] = None,
172-
sender_key: t.Optional[t.Union[ECKey, OKPKey, KeySet]] = None) -> FlattenedJSONSerialization:
169+
public_key: KeyFlexible | None,
170+
algorithms: list[str] | None = None,
171+
registry: JWERegistry | None = None,
172+
sender_key: ECKey | OKPKey | KeySet | None = None) -> FlattenedJSONSerialization:
173173
...
174174

175175

176176
def encrypt_json(
177-
obj: t.Union[GeneralJSONEncryption, FlattenedJSONEncryption],
178-
public_key: t.Optional[KeyFlexible],
179-
algorithms: t.Optional[t.List[str]] = None,
180-
registry: t.Optional[JWERegistry] = None,
181-
sender_key: t.Optional[t.Union[ECKey, OKPKey, KeySet]] = None
182-
) -> t.Union[GeneralJSONSerialization, FlattenedJSONSerialization]:
177+
obj: GeneralJSONEncryption | FlattenedJSONEncryption,
178+
public_key: KeyFlexible | None,
179+
algorithms: list[str] | None = None,
180+
registry: JWERegistry | None = None,
181+
sender_key: ECKey | OKPKey | KeySet | None = None
182+
) -> GeneralJSONSerialization | FlattenedJSONSerialization:
183183
"""Generate a JWE JSON Serialization (in dict). The JWE JSON Serialization
184184
represents encrypted content as a JSON object. This representation is neither
185185
optimized for compactness nor URL safe.
@@ -228,12 +228,12 @@ def encrypt_json(
228228

229229

230230
def decrypt_json(
231-
data: t.Union[GeneralJSONSerialization, FlattenedJSONSerialization],
231+
data: GeneralJSONSerialization | FlattenedJSONSerialization,
232232
private_key: KeyFlexible,
233-
algorithms: t.Optional[t.List[str]] = None,
234-
registry: t.Optional[JWERegistry] = None,
235-
sender_key: t.Optional[t.Union[ECKey, OKPKey, KeySet]] = None
236-
) -> t.Union[GeneralJSONEncryption, FlattenedJSONEncryption]:
233+
algorithms: list[str] | None = None,
234+
registry: JWERegistry | None = None,
235+
sender_key: ECKey | OKPKey | KeySet | None = None
236+
) -> GeneralJSONEncryption | FlattenedJSONEncryption:
237237
"""Decrypt the JWE JSON Serialization (in dict) to a
238238
``GeneralJSONEncryption`` or ``FlattenedJSONEncryption`` object.
239239
@@ -262,9 +262,9 @@ def decrypt_json(
262262

263263

264264
def _attach_recipient_keys(
265-
recipients: t.List[Recipient[Key]],
265+
recipients: list[Recipient[Key]],
266266
private_key: KeyFlexible,
267-
sender_key: t.Optional[t.Union[ECKey, OKPKey, KeySet]] = None) -> None:
267+
sender_key: ECKey | OKPKey | KeySet | None = None) -> None:
268268
for recipient in recipients:
269269
key = guess_key(private_key, recipient)
270270
key.check_use("enc")
@@ -275,8 +275,8 @@ def _attach_recipient_keys(
275275

276276
def _guess_sender_key(
277277
recipient: Recipient[Key],
278-
key: t.Union[ECKey, OKPKey, KeySet],
279-
use_random: bool = False) -> t.Union[ECKey, OKPKey]:
278+
key: ECKey | OKPKey | KeySet,
279+
use_random: bool = False) -> ECKey | OKPKey:
280280
if isinstance(key, KeySet):
281281
headers = recipient.headers()
282282
skid = headers.get('skid')

src/joserfc/jwk.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from __future__ import annotations
12
import typing as t
23
import warnings
34
from ._keys import (
@@ -77,12 +78,12 @@ def guess_key(key: KeyFlexible, obj: GuestProtocol, use_random: bool = False) ->
7778
return rv_key
7879

7980

80-
def _normalize_key(key: KeyBase) -> t.Union[Key, KeySet]:
81-
if isinstance(key, (str, bytes)):
81+
def _normalize_key(key: KeyBase) -> Key | KeySet:
82+
if isinstance(key, (str, bytes)): # pragma: no cover
8283
warnings.warn(
8384
"Please use a Key object instead of bytes or string.",
8485
DeprecationWarning,
8586
stacklevel=2,
8687
)
87-
return OctKey.import_key(key) # pragma: no cover
88+
return OctKey.import_key(key)
8889
return key

0 commit comments

Comments
 (0)