1import sys
2from _typeshed import ReadableBuffer
3from typing import AbstractSet, Optional
4
5class _Hash(object):
6    digest_size: int
7    block_size: int
8
9    # [Python documentation note] Changed in version 3.4: The name attribute has
10    # been present in CPython since its inception, but until Python 3.4 was not
11    # formally specified, so may not exist on some platforms
12    name: str
13    def __init__(self, data: ReadableBuffer = ...) -> None: ...
14    def copy(self) -> _Hash: ...
15    def digest(self) -> bytes: ...
16    def hexdigest(self) -> str: ...
17    def update(self, __data: ReadableBuffer) -> None: ...
18
19if sys.version_info >= (3, 9):
20    def new(name: str, data: ReadableBuffer = ..., *, usedforsecurity: bool = ...) -> _Hash: ...
21    def md5(string: ReadableBuffer = ..., *, usedforsecurity: bool = ...) -> _Hash: ...
22    def sha1(string: ReadableBuffer = ..., *, usedforsecurity: bool = ...) -> _Hash: ...
23    def sha224(string: ReadableBuffer = ..., *, usedforsecurity: bool = ...) -> _Hash: ...
24    def sha256(string: ReadableBuffer = ..., *, usedforsecurity: bool = ...) -> _Hash: ...
25    def sha384(string: ReadableBuffer = ..., *, usedforsecurity: bool = ...) -> _Hash: ...
26    def sha512(string: ReadableBuffer = ..., *, usedforsecurity: bool = ...) -> _Hash: ...
27
28elif sys.version_info >= (3, 8):
29    def new(name: str, data: ReadableBuffer = ...) -> _Hash: ...
30    def md5(string: ReadableBuffer = ...) -> _Hash: ...
31    def sha1(string: ReadableBuffer = ...) -> _Hash: ...
32    def sha224(string: ReadableBuffer = ...) -> _Hash: ...
33    def sha256(string: ReadableBuffer = ...) -> _Hash: ...
34    def sha384(string: ReadableBuffer = ...) -> _Hash: ...
35    def sha512(string: ReadableBuffer = ...) -> _Hash: ...
36
37else:
38    def new(name: str, data: ReadableBuffer = ...) -> _Hash: ...
39    def md5(__string: ReadableBuffer = ...) -> _Hash: ...
40    def sha1(__string: ReadableBuffer = ...) -> _Hash: ...
41    def sha224(__string: ReadableBuffer = ...) -> _Hash: ...
42    def sha256(__string: ReadableBuffer = ...) -> _Hash: ...
43    def sha384(__string: ReadableBuffer = ...) -> _Hash: ...
44    def sha512(__string: ReadableBuffer = ...) -> _Hash: ...
45
46algorithms_guaranteed: AbstractSet[str]
47algorithms_available: AbstractSet[str]
48
49def pbkdf2_hmac(
50    hash_name: str, password: ReadableBuffer, salt: ReadableBuffer, iterations: int, dklen: Optional[int] = ...
51) -> bytes: ...
52
53class _VarLenHash(object):
54    digest_size: int
55    block_size: int
56    name: str
57    def __init__(self, data: ReadableBuffer = ...) -> None: ...
58    def copy(self) -> _VarLenHash: ...
59    def digest(self, __length: int) -> bytes: ...
60    def hexdigest(self, __length: int) -> str: ...
61    def update(self, __data: ReadableBuffer) -> None: ...
62
63sha3_224 = _Hash
64sha3_256 = _Hash
65sha3_384 = _Hash
66sha3_512 = _Hash
67shake_128 = _VarLenHash
68shake_256 = _VarLenHash
69
70def scrypt(
71    password: ReadableBuffer,
72    *,
73    salt: Optional[ReadableBuffer] = ...,
74    n: Optional[int] = ...,
75    r: Optional[int] = ...,
76    p: Optional[int] = ...,
77    maxmem: int = ...,
78    dklen: int = ...,
79) -> bytes: ...
80
81class _BlakeHash(_Hash):
82    MAX_DIGEST_SIZE: int
83    MAX_KEY_SIZE: int
84    PERSON_SIZE: int
85    SALT_SIZE: int
86
87    if sys.version_info >= (3, 9):
88        def __init__(
89            self,
90            __data: ReadableBuffer = ...,
91            *,
92            digest_size: int = ...,
93            key: ReadableBuffer = ...,
94            salt: ReadableBuffer = ...,
95            person: ReadableBuffer = ...,
96            fanout: int = ...,
97            depth: int = ...,
98            leaf_size: int = ...,
99            node_offset: int = ...,
100            node_depth: int = ...,
101            inner_size: int = ...,
102            last_node: bool = ...,
103            usedforsecurity: bool = ...,
104        ) -> None: ...
105    else:
106        def __init__(
107            self,
108            __data: ReadableBuffer = ...,
109            *,
110            digest_size: int = ...,
111            key: ReadableBuffer = ...,
112            salt: ReadableBuffer = ...,
113            person: ReadableBuffer = ...,
114            fanout: int = ...,
115            depth: int = ...,
116            leaf_size: int = ...,
117            node_offset: int = ...,
118            node_depth: int = ...,
119            inner_size: int = ...,
120            last_node: bool = ...,
121        ) -> None: ...
122
123blake2b = _BlakeHash
124blake2s = _BlakeHash
125