Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/cryptography/hazmat/primitives/hashes.py: 84%
128 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-08 06:05 +0000
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-08 06:05 +0000
1# This file is dual licensed under the terms of the Apache License, Version
2# 2.0, and the BSD License. See the LICENSE file in the root of this repository
3# for complete details.
5from __future__ import annotations
7import abc
8import typing
10from cryptography.hazmat.bindings._rust import openssl as rust_openssl
12__all__ = [
13 "HashAlgorithm",
14 "HashContext",
15 "Hash",
16 "ExtendableOutputFunction",
17 "SHA1",
18 "SHA512_224",
19 "SHA512_256",
20 "SHA224",
21 "SHA256",
22 "SHA384",
23 "SHA512",
24 "SHA3_224",
25 "SHA3_256",
26 "SHA3_384",
27 "SHA3_512",
28 "SHAKE128",
29 "SHAKE256",
30 "MD5",
31 "BLAKE2b",
32 "BLAKE2s",
33 "SM3",
34]
37class HashAlgorithm(metaclass=abc.ABCMeta):
38 @property
39 @abc.abstractmethod
40 def name(self) -> str:
41 """
42 A string naming this algorithm (e.g. "sha256", "md5").
43 """
45 @property
46 @abc.abstractmethod
47 def digest_size(self) -> int:
48 """
49 The size of the resulting digest in bytes.
50 """
52 @property
53 @abc.abstractmethod
54 def block_size(self) -> typing.Optional[int]:
55 """
56 The internal block size of the hash function, or None if the hash
57 function does not use blocks internally (e.g. SHA3).
58 """
61class HashContext(metaclass=abc.ABCMeta):
62 @property
63 @abc.abstractmethod
64 def algorithm(self) -> HashAlgorithm:
65 """
66 A HashAlgorithm that will be used by this context.
67 """
69 @abc.abstractmethod
70 def update(self, data: bytes) -> None:
71 """
72 Processes the provided bytes through the hash.
73 """
75 @abc.abstractmethod
76 def finalize(self) -> bytes:
77 """
78 Finalizes the hash context and returns the hash digest as bytes.
79 """
81 @abc.abstractmethod
82 def copy(self) -> HashContext:
83 """
84 Return a HashContext that is a copy of the current context.
85 """
88Hash = rust_openssl.hashes.Hash
89HashContext.register(Hash)
92class ExtendableOutputFunction(metaclass=abc.ABCMeta):
93 """
94 An interface for extendable output functions.
95 """
98class SHA1(HashAlgorithm):
99 name = "sha1"
100 digest_size = 20
101 block_size = 64
104class SHA512_224(HashAlgorithm): # noqa: N801
105 name = "sha512-224"
106 digest_size = 28
107 block_size = 128
110class SHA512_256(HashAlgorithm): # noqa: N801
111 name = "sha512-256"
112 digest_size = 32
113 block_size = 128
116class SHA224(HashAlgorithm):
117 name = "sha224"
118 digest_size = 28
119 block_size = 64
122class SHA256(HashAlgorithm):
123 name = "sha256"
124 digest_size = 32
125 block_size = 64
128class SHA384(HashAlgorithm):
129 name = "sha384"
130 digest_size = 48
131 block_size = 128
134class SHA512(HashAlgorithm):
135 name = "sha512"
136 digest_size = 64
137 block_size = 128
140class SHA3_224(HashAlgorithm): # noqa: N801
141 name = "sha3-224"
142 digest_size = 28
143 block_size = None
146class SHA3_256(HashAlgorithm): # noqa: N801
147 name = "sha3-256"
148 digest_size = 32
149 block_size = None
152class SHA3_384(HashAlgorithm): # noqa: N801
153 name = "sha3-384"
154 digest_size = 48
155 block_size = None
158class SHA3_512(HashAlgorithm): # noqa: N801
159 name = "sha3-512"
160 digest_size = 64
161 block_size = None
164class SHAKE128(HashAlgorithm, ExtendableOutputFunction):
165 name = "shake128"
166 block_size = None
168 def __init__(self, digest_size: int):
169 if not isinstance(digest_size, int):
170 raise TypeError("digest_size must be an integer")
172 if digest_size < 1:
173 raise ValueError("digest_size must be a positive integer")
175 self._digest_size = digest_size
177 @property
178 def digest_size(self) -> int:
179 return self._digest_size
182class SHAKE256(HashAlgorithm, ExtendableOutputFunction):
183 name = "shake256"
184 block_size = None
186 def __init__(self, digest_size: int):
187 if not isinstance(digest_size, int):
188 raise TypeError("digest_size must be an integer")
190 if digest_size < 1:
191 raise ValueError("digest_size must be a positive integer")
193 self._digest_size = digest_size
195 @property
196 def digest_size(self) -> int:
197 return self._digest_size
200class MD5(HashAlgorithm):
201 name = "md5"
202 digest_size = 16
203 block_size = 64
206class BLAKE2b(HashAlgorithm):
207 name = "blake2b"
208 _max_digest_size = 64
209 _min_digest_size = 1
210 block_size = 128
212 def __init__(self, digest_size: int):
213 if digest_size != 64:
214 raise ValueError("Digest size must be 64")
216 self._digest_size = digest_size
218 @property
219 def digest_size(self) -> int:
220 return self._digest_size
223class BLAKE2s(HashAlgorithm):
224 name = "blake2s"
225 block_size = 64
226 _max_digest_size = 32
227 _min_digest_size = 1
229 def __init__(self, digest_size: int):
230 if digest_size != 32:
231 raise ValueError("Digest size must be 32")
233 self._digest_size = digest_size
235 @property
236 def digest_size(self) -> int:
237 return self._digest_size
240class SM3(HashAlgorithm):
241 name = "sm3"
242 digest_size = 32
243 block_size = 64