@@ -2,10 +2,39 @@ import sys
22from _typeshed import ReadableBuffer
33from collections .abc import Callable
44from types import ModuleType
5- from typing import AnyStr , Protocol , TypeAlias , final , overload , type_check_only
5+ from typing import AnyStr , Literal , Protocol , TypeAlias , final , overload , type_check_only
66from typing_extensions import Self , disjoint_base
77
88_DigestMod : TypeAlias = str | Callable [[], _HashObject ] | ModuleType | None
9+ _FixedDigestName : TypeAlias = Literal [
10+ "md5" ,
11+ "MD5" ,
12+ "sha1" ,
13+ "SHA1" ,
14+ "sha224" ,
15+ "SHA224" ,
16+ "sha256" ,
17+ "SHA256" ,
18+ "sha384" ,
19+ "SHA384" ,
20+ "sha512" ,
21+ "SHA512" ,
22+ "sha3_224" ,
23+ "sha3-224" ,
24+ "SHA3-224" ,
25+ "sha3_256" ,
26+ "sha3-256" ,
27+ "SHA3-256" ,
28+ "sha3_384" ,
29+ "sha3-384" ,
30+ "SHA3-384" ,
31+ "sha3_512" ,
32+ "sha3-512" ,
33+ "SHA3-512" ,
34+ ]
35+ _XofDigestName : TypeAlias = Literal [
36+ "shake_128" , "shake128" , "SHAKE128" , "shake-128" , "SHAKE-128" , "shake_256" , "shake256" , "SHAKE256" , "shake-256" , "SHAKE-256"
37+ ]
938
1039openssl_md_meth_names : frozenset [str ]
1140
@@ -22,17 +51,31 @@ class _HashObject(Protocol):
2251 def hexdigest (self ) -> str : ...
2352 def update (self , obj : ReadableBuffer , / ) -> None : ...
2453
54+ @type_check_only
55+ class _HashObjectWithOptionalLength (Protocol ):
56+ @property
57+ def digest_size (self ) -> int : ...
58+ @property
59+ def block_size (self ) -> int : ...
60+ @property
61+ def name (self ) -> str : ...
62+ def copy (self ) -> Self : ...
63+ # Depending on the algorithm, length is either required or not accepted.
64+ def digest (self , length : int = ...) -> bytes : ...
65+ def hexdigest (self , length : int = ...) -> str : ...
66+ def update (self , obj : ReadableBuffer , / ) -> None : ...
67+
2568@disjoint_base
26- class HASH :
69+ class HASH ( _HashObjectWithOptionalLength ) :
2770 @property
2871 def digest_size (self ) -> int : ...
2972 @property
3073 def block_size (self ) -> int : ...
3174 @property
3275 def name (self ) -> str : ...
3376 def copy (self ) -> Self : ...
34- def digest (self ) -> bytes : ...
35- def hexdigest (self ) -> str : ...
77+ def digest (self ) -> bytes : ... # type: ignore[override]
78+ def hexdigest (self ) -> str : ... # type: ignore[override]
3679 def update (self , obj : ReadableBuffer , / ) -> None : ...
3780
3881class UnsupportedDigestmodError (ValueError ): ...
@@ -63,9 +106,19 @@ def get_fips_mode() -> int: ...
63106def hmac_new (key : ReadableBuffer , msg : ReadableBuffer = b"" , digestmod : _DigestMod = None ) -> HMAC : ...
64107
65108if sys .version_info >= (3 , 13 ):
109+ @overload
66110 def new (
67- name : str , data : ReadableBuffer = b"" , * , usedforsecurity : bool = True , string : ReadableBuffer | None = None
111+ name : _XofDigestName , data : ReadableBuffer = b"" , * , usedforsecurity : bool = True , string : ReadableBuffer | None = None
112+ ) -> HASHXOF : ...
113+ @overload
114+ def new (
115+ name : _FixedDigestName , data : ReadableBuffer = b"" , * , usedforsecurity : bool = True , string : ReadableBuffer | None = None
68116 ) -> HASH : ...
117+ @overload
118+ def new (
119+ name : str , data : ReadableBuffer = b"" , * , usedforsecurity : bool = True , string : ReadableBuffer | None = None
120+ ) -> _HashObjectWithOptionalLength : ...
121+
69122 def openssl_md5 (
70123 data : ReadableBuffer = b"" , * , usedforsecurity : bool = True , string : ReadableBuffer | None = None
71124 ) -> HASH : ...
@@ -102,9 +155,14 @@ if sys.version_info >= (3, 13):
102155 def openssl_shake_256 (
103156 data : ReadableBuffer = b"" , * , usedforsecurity : bool = True , string : ReadableBuffer | None = None
104157 ) -> HASHXOF : ...
105-
106158else :
107- def new (name : str , string : ReadableBuffer = b"" , * , usedforsecurity : bool = True ) -> HASH : ...
159+ @overload
160+ def new (name : _XofDigestName , string : ReadableBuffer = b"" , * , usedforsecurity : bool = True ) -> HASHXOF : ...
161+ @overload
162+ def new (name : _FixedDigestName , string : ReadableBuffer = b"" , * , usedforsecurity : bool = True ) -> HASH : ...
163+ @overload
164+ def new (name : str , string : ReadableBuffer = b"" , * , usedforsecurity : bool = True ) -> _HashObjectWithOptionalLength : ...
165+
108166 def openssl_md5 (string : ReadableBuffer = b"" , * , usedforsecurity : bool = True ) -> HASH : ...
109167 def openssl_sha1 (string : ReadableBuffer = b"" , * , usedforsecurity : bool = True ) -> HASH : ...
110168 def openssl_sha224 (string : ReadableBuffer = b"" , * , usedforsecurity : bool = True ) -> HASH : ...
0 commit comments