--- /dev/null
+from typing import Text
+
+class InvalidToken(Exception): ...
+
+class Fernet(object):
+ def __init__(self, key: bytes | Text) -> None: ...
+ def decrypt(self, token: bytes, ttl: int | None = ...) -> bytes: ...
+ # decrypt_at_time accepts None ttl at runtime but it's an implementtion detail and it doesn't really
+ # make sense for the client code to use it like that, so the parameter is typed as int as opposed to
+ # int | None.
+ def decrypt_at_time(self, token: bytes, ttl: int, current_time: int) -> bytes: ...
+ def encrypt(self, data: bytes) -> bytes: ...
+ def encrypt_at_time(self, data: bytes, current_time: int) -> bytes: ...
+ def extract_timestamp(self, token: bytes) -> int: ...
+ @classmethod
+ def generate_key(cls) -> bytes: ...
+
+class MultiFernet(object):
+ def __init__(self, fernets: list[Fernet]) -> None: ...
+ def decrypt(self, token: bytes, ttl: int | None = ...) -> bytes: ...
+ # See a note above on the typing of the ttl parameter.
+ def decrypt_at_time(self, token: bytes, ttl: int, current_time: int) -> bytes: ...
+ def encrypt(self, data: bytes) -> bytes: ...
+ def encrypt_at_time(self, data: bytes, current_time: int) -> bytes: ...
+ def rotate(self, msg: bytes) -> bytes: ...