+# Stubs for hashlib\r
+\r
+import sys\r
+from typing import AbstractSet, Optional, Union\r
+\r
+_DataType = Union[bytes, bytearray, memoryview]\r
+\r
+class _Hash(object):\r
+ digest_size = ... # type: int\r
+ block_size = ... # type: int\r
+\r
+ # [Python documentation note] Changed in version 3.4: The name attribute has\r
+ # been present in CPython since its inception, but until Python 3.4 was not\r
+ # formally specified, so may not exist on some platforms\r
+ name = ... # type: str\r
+\r
+ def __init__(self, data: _DataType = ...) -> None: ...\r
+\r
+ def copy(self) -> _Hash: ...\r
+ def digest(self) -> bytes: ...\r
+ def hexdigest(self) -> str: ...\r
+ def update(self, arg: _DataType) -> None: ...\r
+\r
+def md5(arg: _DataType = ...) -> _Hash: ...\r
+def sha1(arg: _DataType = ...) -> _Hash: ...\r
+def sha224(arg: _DataType = ...) -> _Hash: ...\r
+def sha256(arg: _DataType = ...) -> _Hash: ...\r
+def sha384(arg: _DataType = ...) -> _Hash: ...\r
+def sha512(arg: _DataType = ...) -> _Hash: ...\r
+\r
+def new(name: str, data: _DataType = ...) -> _Hash: ...\r
+\r
+algorithms_guaranteed = ... # type: AbstractSet[str]\r
+algorithms_available = ... # type: AbstractSet[str]\r
+\r
+def pbkdf2_hmac(hash_name: str, password: _DataType, salt: _DataType, iterations: int, dklen: Optional[int] = ...) -> bytes: ...\r
+\r
+if sys.version_info >= (3, 6):\r
+ class _VarLenHash(object):\r
+ digest_size = ... # type: int\r
+ block_size = ... # type: int\r
+ name = ... # type: str\r
+\r
+ def __init__(self, data: _DataType = ...) -> None: ...\r
+\r
+ def copy(self) -> _VarLenHash: ...\r
+ def digest(self, length: int) -> bytes: ...\r
+ def hexdigest(self, length: int) -> str: ...\r
+ def update(self, arg: _DataType) -> None: ...\r
+\r
+ sha3_224 = _Hash\r
+ sha3_256 = _Hash\r
+ sha3_384 = _Hash\r
+ sha3_512 = _Hash\r
+ shake_128 = _VarLenHash\r
+ shake_256 = _VarLenHash\r
+\r
+ def scrypt(password: _DataType, *, salt: _DataType, n: int, r: int, p: int, maxmem: int = ..., dklen: int = ...) -> bytes: ...\r
+\r
+ class _BlakeHash(_Hash):\r
+ MAX_DIGEST_SIZE = ... # type: int\r
+ MAX_KEY_SIZE = ... # type: int\r
+ PERSON_SIZE = ... # type: int\r
+ SALT_SIZE = ... # type: int\r
+\r
+ def __init__(self, data: _DataType = ..., digest_size: int = ..., key: _DataType = ..., salt: _DataType = ..., person: _DataType = ..., fanout: int = ..., depth: int = ..., leaf_size: int = ..., node_offset: int = ..., node_depth: int = ..., inner_size: int = ..., last_node: bool = ...) -> None: ...\r
+\r
+ blake2b = _BlakeHash\r
+ blake2s = _BlakeHash\r