uh oh im bundling the deps
This commit is contained in:
		
							parent
							
								
									ae28da8d60
								
							
						
					
					
						commit
						ecca301ceb
					
				
					 584 changed files with 119933 additions and 24 deletions
				
			
		|  | @ -1,5 +1,5 @@ | ||||||
| <?xml version='1.0' encoding='utf-8'?> | <?xml version='1.0' encoding='utf-8'?> | ||||||
| <addon id="plugin.audio.librespot" version="0.0.1" name="Librespot" provider-name="Cere"> | <addon id="plugin.audio.librespot" version="0.0.2" name="Librespot" provider-name="Cere"> | ||||||
|     <requires> |     <requires> | ||||||
|         <import addon="xbmc.python" version="3.0.0" /> |         <import addon="xbmc.python" version="3.0.0" /> | ||||||
|         <import addon="xbmc.addon" version="18.9.701" /> |         <import addon="xbmc.addon" version="18.9.701" /> | ||||||
|  | @ -20,8 +20,8 @@ | ||||||
|         <summary lang="en_GB">Unofficial Spotify music plugin for Kodi</summary> |         <summary lang="en_GB">Unofficial Spotify music plugin for Kodi</summary> | ||||||
|         <description lang="en_GB">Allows you to use your Spotify premium account to connect and play Spotify through Kodi. After installing, use 'Configure' to enter your Spotify username and password.</description> |         <description lang="en_GB">Allows you to use your Spotify premium account to connect and play Spotify through Kodi. After installing, use 'Configure' to enter your Spotify username and password.</description> | ||||||
|         <disclaimer lang="en_GB">This product uses the SPOTIFY WEB API but is not endorsed, certified or otherwise approved in any way by Spotify. Spotify is the registered trademark of Spotify AB.</disclaimer> |         <disclaimer lang="en_GB">This product uses the SPOTIFY WEB API but is not endorsed, certified or otherwise approved in any way by Spotify. Spotify is the registered trademark of Spotify AB.</disclaimer> | ||||||
|         <source>https://example.com</source> |         <source>https://gitdab.com/cere/plugin.audio.librespot</source> | ||||||
|         <website>https://cere.gay</website> |         <website>https://gitdab.com/cere/</website> | ||||||
|         <news>Deez Nuts |         <news>Deez Nuts | ||||||
|         </news> |         </news> | ||||||
|         <assets> |         <assets> | ||||||
|  |  | ||||||
							
								
								
									
										234
									
								
								resources/lib/deps/Cryptodome/Cipher/AES.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										234
									
								
								resources/lib/deps/Cryptodome/Cipher/AES.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,234 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | #  Cipher/AES.py : AES | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | import sys | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Cipher import _create_cipher | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   VoidPointer, SmartPointer, | ||||||
|  |                                   c_size_t, c_uint8_ptr) | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util import _cpu_features | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | 
 | ||||||
|  | MODE_ECB = 1        #: Electronic Code Book (:ref:`ecb_mode`) | ||||||
|  | MODE_CBC = 2        #: Cipher-Block Chaining (:ref:`cbc_mode`) | ||||||
|  | MODE_CFB = 3        #: Cipher Feedback (:ref:`cfb_mode`) | ||||||
|  | MODE_OFB = 5        #: Output Feedback (:ref:`ofb_mode`) | ||||||
|  | MODE_CTR = 6        #: Counter mode (:ref:`ctr_mode`) | ||||||
|  | MODE_OPENPGP = 7    #: OpenPGP mode (:ref:`openpgp_mode`) | ||||||
|  | MODE_CCM = 8        #: Counter with CBC-MAC (:ref:`ccm_mode`) | ||||||
|  | MODE_EAX = 9        #: :ref:`eax_mode` | ||||||
|  | MODE_SIV = 10       #: Synthetic Initialization Vector (:ref:`siv_mode`) | ||||||
|  | MODE_GCM = 11       #: Galois Counter Mode (:ref:`gcm_mode`) | ||||||
|  | MODE_OCB = 12       #: Offset Code Book (:ref:`ocb_mode`) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | _cproto = """ | ||||||
|  |         int AES_start_operation(const uint8_t key[], | ||||||
|  |                                 size_t key_len, | ||||||
|  |                                 void **pResult); | ||||||
|  |         int AES_encrypt(const void *state, | ||||||
|  |                         const uint8_t *in, | ||||||
|  |                         uint8_t *out, | ||||||
|  |                         size_t data_len); | ||||||
|  |         int AES_decrypt(const void *state, | ||||||
|  |                         const uint8_t *in, | ||||||
|  |                         uint8_t *out, | ||||||
|  |                         size_t data_len); | ||||||
|  |         int AES_stop_operation(void *state); | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Load portable AES | ||||||
|  | _raw_aes_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_aes", | ||||||
|  |                                          _cproto) | ||||||
|  | 
 | ||||||
|  | # Try to load AES with AES NI instructions | ||||||
|  | try: | ||||||
|  |     _raw_aesni_lib = None | ||||||
|  |     if _cpu_features.have_aes_ni(): | ||||||
|  |         _raw_aesni_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_aesni", | ||||||
|  |                                                    _cproto.replace("AES", | ||||||
|  |                                                                    "AESNI")) | ||||||
|  | # _raw_aesni may not have been compiled in | ||||||
|  | except OSError: | ||||||
|  |     pass | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_base_cipher(dict_parameters): | ||||||
|  |     """This method instantiates and returns a handle to a low-level | ||||||
|  |     base cipher. It will absorb named parameters in the process.""" | ||||||
|  | 
 | ||||||
|  |     use_aesni = dict_parameters.pop("use_aesni", True) | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         key = dict_parameters.pop("key") | ||||||
|  |     except KeyError: | ||||||
|  |         raise TypeError("Missing 'key' parameter") | ||||||
|  | 
 | ||||||
|  |     if len(key) not in key_size: | ||||||
|  |         raise ValueError("Incorrect AES key length (%d bytes)" % len(key)) | ||||||
|  | 
 | ||||||
|  |     if use_aesni and _raw_aesni_lib: | ||||||
|  |         start_operation = _raw_aesni_lib.AESNI_start_operation | ||||||
|  |         stop_operation = _raw_aesni_lib.AESNI_stop_operation | ||||||
|  |     else: | ||||||
|  |         start_operation = _raw_aes_lib.AES_start_operation | ||||||
|  |         stop_operation = _raw_aes_lib.AES_stop_operation | ||||||
|  | 
 | ||||||
|  |     cipher = VoidPointer() | ||||||
|  |     result = start_operation(c_uint8_ptr(key), | ||||||
|  |                              c_size_t(len(key)), | ||||||
|  |                              cipher.address_of()) | ||||||
|  |     if result: | ||||||
|  |         raise ValueError("Error %X while instantiating the AES cipher" | ||||||
|  |                          % result) | ||||||
|  |     return SmartPointer(cipher.get(), stop_operation) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _derive_Poly1305_key_pair(key, nonce): | ||||||
|  |     """Derive a tuple (r, s, nonce) for a Poly1305 MAC. | ||||||
|  | 
 | ||||||
|  |     If nonce is ``None``, a new 16-byte nonce is generated. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     if len(key) != 32: | ||||||
|  |         raise ValueError("Poly1305 with AES requires a 32-byte key") | ||||||
|  | 
 | ||||||
|  |     if nonce is None: | ||||||
|  |         nonce = get_random_bytes(16) | ||||||
|  |     elif len(nonce) != 16: | ||||||
|  |         raise ValueError("Poly1305 with AES requires a 16-byte nonce") | ||||||
|  | 
 | ||||||
|  |     s = new(key[:16], MODE_ECB).encrypt(nonce) | ||||||
|  |     return key[16:], s, nonce | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(key, mode, *args, **kwargs): | ||||||
|  |     """Create a new AES cipher. | ||||||
|  | 
 | ||||||
|  |     Args: | ||||||
|  |       key(bytes/bytearray/memoryview): | ||||||
|  |         The secret key to use in the symmetric cipher. | ||||||
|  | 
 | ||||||
|  |         It must be 16 (*AES-128)*, 24 (*AES-192*) or 32 (*AES-256*) bytes long. | ||||||
|  | 
 | ||||||
|  |         For ``MODE_SIV`` only, it doubles to 32, 48, or 64 bytes. | ||||||
|  |       mode (a ``MODE_*`` constant): | ||||||
|  |         The chaining mode to use for encryption or decryption. | ||||||
|  |         If in doubt, use ``MODE_EAX``. | ||||||
|  | 
 | ||||||
|  |     Keyword Args: | ||||||
|  |       iv (bytes/bytearray/memoryview): | ||||||
|  |         (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, | ||||||
|  |         and ``MODE_OPENPGP`` modes). | ||||||
|  | 
 | ||||||
|  |         The initialization vector to use for encryption or decryption. | ||||||
|  | 
 | ||||||
|  |         For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 16 bytes long. | ||||||
|  | 
 | ||||||
|  |         For ``MODE_OPENPGP`` mode only, | ||||||
|  |         it must be 16 bytes long for encryption | ||||||
|  |         and 18 bytes for decryption (in the latter case, it is | ||||||
|  |         actually the *encrypted* IV which was prefixed to the ciphertext). | ||||||
|  | 
 | ||||||
|  |         If not provided, a random byte string is generated (you must then | ||||||
|  |         read its value with the :attr:`iv` attribute). | ||||||
|  | 
 | ||||||
|  |       nonce (bytes/bytearray/memoryview): | ||||||
|  |         (Only applicable for ``MODE_CCM``, ``MODE_EAX``, ``MODE_GCM``, | ||||||
|  |         ``MODE_SIV``, ``MODE_OCB``, and ``MODE_CTR``). | ||||||
|  | 
 | ||||||
|  |         A value that must never be reused for any other encryption done | ||||||
|  |         with this key (except possibly for ``MODE_SIV``, see below). | ||||||
|  | 
 | ||||||
|  |         For ``MODE_EAX``, ``MODE_GCM`` and ``MODE_SIV`` there are no | ||||||
|  |         restrictions on its length (recommended: **16** bytes). | ||||||
|  | 
 | ||||||
|  |         For ``MODE_CCM``, its length must be in the range **[7..13]**. | ||||||
|  |         Bear in mind that with CCM there is a trade-off between nonce | ||||||
|  |         length and maximum message size. Recommendation: **11** bytes. | ||||||
|  | 
 | ||||||
|  |         For ``MODE_OCB``, its length must be in the range **[1..15]** | ||||||
|  |         (recommended: **15**). | ||||||
|  | 
 | ||||||
|  |         For ``MODE_CTR``, its length must be in the range **[0..15]** | ||||||
|  |         (recommended: **8**). | ||||||
|  | 
 | ||||||
|  |         For ``MODE_SIV``, the nonce is optional, if it is not specified, | ||||||
|  |         then no nonce is being used, which renders the encryption | ||||||
|  |         deterministic. | ||||||
|  | 
 | ||||||
|  |         If not provided, for modes other than ``MODE_SIV``, a random | ||||||
|  |         byte string of the recommended length is used (you must then | ||||||
|  |         read its value with the :attr:`nonce` attribute). | ||||||
|  | 
 | ||||||
|  |       segment_size (integer): | ||||||
|  |         (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext | ||||||
|  |         are segmented in. It must be a multiple of 8. | ||||||
|  |         If not specified, it will be assumed to be 8. | ||||||
|  | 
 | ||||||
|  |       mac_len (integer): | ||||||
|  |         (Only ``MODE_EAX``, ``MODE_GCM``, ``MODE_OCB``, ``MODE_CCM``) | ||||||
|  |         Length of the authentication tag, in bytes. | ||||||
|  | 
 | ||||||
|  |         It must be even and in the range **[4..16]**. | ||||||
|  |         The recommended value (and the default, if not specified) is **16**. | ||||||
|  | 
 | ||||||
|  |       msg_len (integer): | ||||||
|  |         (Only ``MODE_CCM``). Length of the message to (de)cipher. | ||||||
|  |         If not specified, ``encrypt`` must be called with the entire message. | ||||||
|  |         Similarly, ``decrypt`` can only be called once. | ||||||
|  | 
 | ||||||
|  |       assoc_len (integer): | ||||||
|  |         (Only ``MODE_CCM``). Length of the associated data. | ||||||
|  |         If not specified, all associated data is buffered internally, | ||||||
|  |         which may represent a problem for very large messages. | ||||||
|  | 
 | ||||||
|  |       initial_value (integer or bytes/bytearray/memoryview): | ||||||
|  |         (Only ``MODE_CTR``). | ||||||
|  |         The initial value for the counter. If not present, the cipher will | ||||||
|  |         start counting from 0. The value is incremented by one for each block. | ||||||
|  |         The counter number is encoded in big endian mode. | ||||||
|  | 
 | ||||||
|  |       counter (object): | ||||||
|  |         (Only ``MODE_CTR``). | ||||||
|  |         Instance of ``Cryptodome.Util.Counter``, which allows full customization | ||||||
|  |         of the counter block. This parameter is incompatible to both ``nonce`` | ||||||
|  |         and ``initial_value``. | ||||||
|  | 
 | ||||||
|  |       use_aesni: (boolean): | ||||||
|  |         Use Intel AES-NI hardware extensions (default: use if available). | ||||||
|  | 
 | ||||||
|  |     Returns: | ||||||
|  |         an AES object, of the applicable mode. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     kwargs["add_aes_modes"] = True | ||||||
|  |     return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Size of a data block (in bytes) | ||||||
|  | block_size = 16 | ||||||
|  | # Size of a key (in bytes) | ||||||
|  | key_size = (16, 24, 32) | ||||||
							
								
								
									
										156
									
								
								resources/lib/deps/Cryptodome/Cipher/AES.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								resources/lib/deps/Cryptodome/Cipher/AES.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,156 @@ | ||||||
|  | from typing import Dict, Optional, Tuple, Union, overload | ||||||
|  | from typing_extensions import Literal | ||||||
|  | 
 | ||||||
|  | Buffer=bytes|bytearray|memoryview | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Cipher._mode_ecb import EcbMode | ||||||
|  | from Cryptodome.Cipher._mode_cbc import CbcMode | ||||||
|  | from Cryptodome.Cipher._mode_cfb import CfbMode | ||||||
|  | from Cryptodome.Cipher._mode_ofb import OfbMode | ||||||
|  | from Cryptodome.Cipher._mode_ctr import CtrMode | ||||||
|  | from Cryptodome.Cipher._mode_openpgp import OpenPgpMode | ||||||
|  | from Cryptodome.Cipher._mode_ccm import CcmMode | ||||||
|  | from Cryptodome.Cipher._mode_eax import EaxMode | ||||||
|  | from Cryptodome.Cipher._mode_gcm import GcmMode | ||||||
|  | from Cryptodome.Cipher._mode_siv import SivMode | ||||||
|  | from Cryptodome.Cipher._mode_ocb import OcbMode | ||||||
|  | 
 | ||||||
|  | MODE_ECB: Literal[1] | ||||||
|  | MODE_CBC: Literal[2] | ||||||
|  | MODE_CFB: Literal[3] | ||||||
|  | MODE_OFB: Literal[5] | ||||||
|  | MODE_CTR: Literal[6] | ||||||
|  | MODE_OPENPGP: Literal[7] | ||||||
|  | MODE_CCM: Literal[8] | ||||||
|  | MODE_EAX: Literal[9] | ||||||
|  | MODE_SIV: Literal[10] | ||||||
|  | MODE_GCM: Literal[11] | ||||||
|  | MODE_OCB: Literal[12] | ||||||
|  | 
 | ||||||
|  | # MODE_ECB | ||||||
|  | @overload | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: Literal[1], | ||||||
|  |         use_aesni : bool = ...) -> \ | ||||||
|  |         EcbMode: ... | ||||||
|  | 
 | ||||||
|  | # MODE_CBC | ||||||
|  | @overload | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: Literal[2], | ||||||
|  |         iv : Optional[Buffer] = ..., | ||||||
|  |         use_aesni : bool = ...) -> \ | ||||||
|  |         CbcMode: ... | ||||||
|  | 
 | ||||||
|  | @overload | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: Literal[2], | ||||||
|  |         IV : Optional[Buffer] = ..., | ||||||
|  |         use_aesni : bool = ...) -> \ | ||||||
|  |         CbcMode: ... | ||||||
|  | 
 | ||||||
|  | # MODE_CFB | ||||||
|  | @overload | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: Literal[3], | ||||||
|  |         iv : Optional[Buffer] = ..., | ||||||
|  |         segment_size : int = ..., | ||||||
|  |         use_aesni : bool = ...) -> \ | ||||||
|  |         CfbMode: ... | ||||||
|  | 
 | ||||||
|  | @overload | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: Literal[3], | ||||||
|  |         IV : Optional[Buffer] = ..., | ||||||
|  |         segment_size : int = ..., | ||||||
|  |         use_aesni : bool = ...) -> \ | ||||||
|  |         CfbMode: ... | ||||||
|  | 
 | ||||||
|  | # MODE_OFB | ||||||
|  | @overload | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: Literal[5], | ||||||
|  |         iv : Optional[Buffer] = ..., | ||||||
|  |         use_aesni : bool = ...) -> \ | ||||||
|  |         OfbMode: ... | ||||||
|  | 
 | ||||||
|  | @overload | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: Literal[5], | ||||||
|  |         IV : Optional[Buffer] = ..., | ||||||
|  |         use_aesni : bool = ...) -> \ | ||||||
|  |         OfbMode: ... | ||||||
|  | 
 | ||||||
|  | # MODE_CTR | ||||||
|  | @overload | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: Literal[6], | ||||||
|  |         nonce : Optional[Buffer] = ..., | ||||||
|  |         initial_value : Union[int, Buffer] = ..., | ||||||
|  |         counter : Dict = ..., | ||||||
|  |         use_aesni : bool = ...) -> \ | ||||||
|  |         CtrMode: ... | ||||||
|  | 
 | ||||||
|  | # MODE_OPENPGP | ||||||
|  | @overload | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: Literal[7], | ||||||
|  |         iv : Optional[Buffer] = ..., | ||||||
|  |         use_aesni : bool = ...) -> \ | ||||||
|  |         OpenPgpMode: ... | ||||||
|  | 
 | ||||||
|  | @overload | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: Literal[7], | ||||||
|  |         IV : Optional[Buffer] = ..., | ||||||
|  |         use_aesni : bool = ...) -> \ | ||||||
|  |         OpenPgpMode: ... | ||||||
|  | 
 | ||||||
|  | # MODE_CCM | ||||||
|  | @overload | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: Literal[8], | ||||||
|  |         nonce : Optional[Buffer] = ..., | ||||||
|  |         mac_len : int = ..., | ||||||
|  |         assoc_len : int = ..., | ||||||
|  |         use_aesni : bool = ...) -> \ | ||||||
|  |         CcmMode: ... | ||||||
|  | 
 | ||||||
|  | # MODE_EAX | ||||||
|  | @overload | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: Literal[9], | ||||||
|  |         nonce : Optional[Buffer] = ..., | ||||||
|  |         mac_len : int = ..., | ||||||
|  |         use_aesni : bool = ...) -> \ | ||||||
|  |         EaxMode: ... | ||||||
|  | 
 | ||||||
|  | # MODE_GCM | ||||||
|  | @overload | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: Literal[10], | ||||||
|  |         nonce : Optional[Buffer] = ..., | ||||||
|  |         use_aesni : bool = ...) -> \ | ||||||
|  |         SivMode: ... | ||||||
|  | 
 | ||||||
|  | # MODE_SIV | ||||||
|  | @overload | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: Literal[11], | ||||||
|  |         nonce : Optional[Buffer] = ..., | ||||||
|  |         mac_len : int = ..., | ||||||
|  |         use_aesni : bool = ...) -> \ | ||||||
|  |         GcmMode: ... | ||||||
|  | 
 | ||||||
|  | # MODE_OCB | ||||||
|  | @overload | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: Literal[12], | ||||||
|  |         nonce : Optional[Buffer] = ..., | ||||||
|  |         mac_len : int = ..., | ||||||
|  |         use_aesni : bool = ...) -> \ | ||||||
|  |         OcbMode: ... | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | block_size: int | ||||||
|  | key_size: Tuple[int, int, int] | ||||||
							
								
								
									
										175
									
								
								resources/lib/deps/Cryptodome/Cipher/ARC2.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										175
									
								
								resources/lib/deps/Cryptodome/Cipher/ARC2.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,175 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | #  Cipher/ARC2.py : ARC2.py | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | """ | ||||||
|  | Module's constants for the modes of operation supported with ARC2: | ||||||
|  | 
 | ||||||
|  | :var MODE_ECB: :ref:`Electronic Code Book (ECB) <ecb_mode>` | ||||||
|  | :var MODE_CBC: :ref:`Cipher-Block Chaining (CBC) <cbc_mode>` | ||||||
|  | :var MODE_CFB: :ref:`Cipher FeedBack (CFB) <cfb_mode>` | ||||||
|  | :var MODE_OFB: :ref:`Output FeedBack (OFB) <ofb_mode>` | ||||||
|  | :var MODE_CTR: :ref:`CounTer Mode (CTR) <ctr_mode>` | ||||||
|  | :var MODE_OPENPGP:  :ref:`OpenPGP Mode <openpgp_mode>` | ||||||
|  | :var MODE_EAX: :ref:`EAX Mode <eax_mode>` | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | import sys | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Cipher import _create_cipher | ||||||
|  | from Cryptodome.Util.py3compat import byte_string | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   VoidPointer, SmartPointer, | ||||||
|  |                                   c_size_t, c_uint8_ptr) | ||||||
|  | 
 | ||||||
|  | _raw_arc2_lib = load_pycryptodome_raw_lib( | ||||||
|  |                         "Cryptodome.Cipher._raw_arc2", | ||||||
|  |                         """ | ||||||
|  |                         int ARC2_start_operation(const uint8_t key[], | ||||||
|  |                                                  size_t key_len, | ||||||
|  |                                                  size_t effective_key_len, | ||||||
|  |                                                  void **pResult); | ||||||
|  |                         int ARC2_encrypt(const void *state, | ||||||
|  |                                          const uint8_t *in, | ||||||
|  |                                          uint8_t *out, | ||||||
|  |                                          size_t data_len); | ||||||
|  |                         int ARC2_decrypt(const void *state, | ||||||
|  |                                          const uint8_t *in, | ||||||
|  |                                          uint8_t *out, | ||||||
|  |                                          size_t data_len); | ||||||
|  |                         int ARC2_stop_operation(void *state); | ||||||
|  |                         """ | ||||||
|  |                         ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_base_cipher(dict_parameters): | ||||||
|  |     """This method instantiates and returns a handle to a low-level | ||||||
|  |     base cipher. It will absorb named parameters in the process.""" | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         key = dict_parameters.pop("key") | ||||||
|  |     except KeyError: | ||||||
|  |         raise TypeError("Missing 'key' parameter") | ||||||
|  | 
 | ||||||
|  |     effective_keylen = dict_parameters.pop("effective_keylen", 1024) | ||||||
|  | 
 | ||||||
|  |     if len(key) not in key_size: | ||||||
|  |         raise ValueError("Incorrect ARC2 key length (%d bytes)" % len(key)) | ||||||
|  | 
 | ||||||
|  |     if not (40 <= effective_keylen <= 1024): | ||||||
|  |         raise ValueError("'effective_key_len' must be at least 40 and no larger than 1024 " | ||||||
|  |                          "(not %d)" % effective_keylen) | ||||||
|  | 
 | ||||||
|  |     start_operation = _raw_arc2_lib.ARC2_start_operation | ||||||
|  |     stop_operation = _raw_arc2_lib.ARC2_stop_operation | ||||||
|  | 
 | ||||||
|  |     cipher = VoidPointer() | ||||||
|  |     result = start_operation(c_uint8_ptr(key), | ||||||
|  |                              c_size_t(len(key)), | ||||||
|  |                              c_size_t(effective_keylen), | ||||||
|  |                              cipher.address_of()) | ||||||
|  |     if result: | ||||||
|  |         raise ValueError("Error %X while instantiating the ARC2 cipher" | ||||||
|  |                          % result) | ||||||
|  | 
 | ||||||
|  |     return SmartPointer(cipher.get(), stop_operation) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(key, mode, *args, **kwargs): | ||||||
|  |     """Create a new RC2 cipher. | ||||||
|  | 
 | ||||||
|  |     :param key: | ||||||
|  |         The secret key to use in the symmetric cipher. | ||||||
|  |         Its length can vary from 5 to 128 bytes; the actual search space | ||||||
|  |         (and the cipher strength) can be reduced with the ``effective_keylen`` parameter. | ||||||
|  |     :type key: bytes, bytearray, memoryview | ||||||
|  | 
 | ||||||
|  |     :param mode: | ||||||
|  |         The chaining mode to use for encryption or decryption. | ||||||
|  |     :type mode: One of the supported ``MODE_*`` constants | ||||||
|  | 
 | ||||||
|  |     :Keyword Arguments: | ||||||
|  |         *   **iv** (*bytes*, *bytearray*, *memoryview*) -- | ||||||
|  |             (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, | ||||||
|  |             and ``MODE_OPENPGP`` modes). | ||||||
|  | 
 | ||||||
|  |             The initialization vector to use for encryption or decryption. | ||||||
|  | 
 | ||||||
|  |             For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 8 bytes long. | ||||||
|  | 
 | ||||||
|  |             For ``MODE_OPENPGP`` mode only, | ||||||
|  |             it must be 8 bytes long for encryption | ||||||
|  |             and 10 bytes for decryption (in the latter case, it is | ||||||
|  |             actually the *encrypted* IV which was prefixed to the ciphertext). | ||||||
|  | 
 | ||||||
|  |             If not provided, a random byte string is generated (you must then | ||||||
|  |             read its value with the :attr:`iv` attribute). | ||||||
|  | 
 | ||||||
|  |         *   **nonce** (*bytes*, *bytearray*, *memoryview*) -- | ||||||
|  |             (Only applicable for ``MODE_EAX`` and ``MODE_CTR``). | ||||||
|  | 
 | ||||||
|  |             A value that must never be reused for any other encryption done | ||||||
|  |             with this key. | ||||||
|  | 
 | ||||||
|  |             For ``MODE_EAX`` there are no | ||||||
|  |             restrictions on its length (recommended: **16** bytes). | ||||||
|  | 
 | ||||||
|  |             For ``MODE_CTR``, its length must be in the range **[0..7]**. | ||||||
|  | 
 | ||||||
|  |             If not provided for ``MODE_EAX``, a random byte string is generated (you | ||||||
|  |             can read it back via the ``nonce`` attribute). | ||||||
|  | 
 | ||||||
|  |         *   **effective_keylen** (*integer*) -- | ||||||
|  |             Optional. Maximum strength in bits of the actual key used by the ARC2 algorithm. | ||||||
|  |             If the supplied ``key`` parameter is longer (in bits) of the value specified | ||||||
|  |             here, it will be weakened to match it. | ||||||
|  |             If not specified, no limitation is applied. | ||||||
|  | 
 | ||||||
|  |         *   **segment_size** (*integer*) -- | ||||||
|  |             (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext | ||||||
|  |             are segmented in. It must be a multiple of 8. | ||||||
|  |             If not specified, it will be assumed to be 8. | ||||||
|  | 
 | ||||||
|  |         *   **mac_len** : (*integer*) -- | ||||||
|  |             (Only ``MODE_EAX``) | ||||||
|  |             Length of the authentication tag, in bytes. | ||||||
|  |             It must be no longer than 8 (default). | ||||||
|  | 
 | ||||||
|  |         *   **initial_value** : (*integer*) -- | ||||||
|  |             (Only ``MODE_CTR``). The initial value for the counter within | ||||||
|  |             the counter block. By default it is **0**. | ||||||
|  | 
 | ||||||
|  |     :Return: an ARC2 object, of the applicable mode. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) | ||||||
|  | 
 | ||||||
|  | MODE_ECB = 1 | ||||||
|  | MODE_CBC = 2 | ||||||
|  | MODE_CFB = 3 | ||||||
|  | MODE_OFB = 5 | ||||||
|  | MODE_CTR = 6 | ||||||
|  | MODE_OPENPGP = 7 | ||||||
|  | MODE_EAX = 9 | ||||||
|  | 
 | ||||||
|  | # Size of a data block (in bytes) | ||||||
|  | block_size = 8 | ||||||
|  | # Size of a key (in bytes) | ||||||
|  | key_size = range(5, 128 + 1) | ||||||
							
								
								
									
										35
									
								
								resources/lib/deps/Cryptodome/Cipher/ARC2.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								resources/lib/deps/Cryptodome/Cipher/ARC2.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,35 @@ | ||||||
|  | from typing import Union, Dict, Iterable, Optional | ||||||
|  | 
 | ||||||
|  | Buffer = bytes|bytearray|memoryview | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Cipher._mode_ecb import EcbMode | ||||||
|  | from Cryptodome.Cipher._mode_cbc import CbcMode | ||||||
|  | from Cryptodome.Cipher._mode_cfb import CfbMode | ||||||
|  | from Cryptodome.Cipher._mode_ofb import OfbMode | ||||||
|  | from Cryptodome.Cipher._mode_ctr import CtrMode | ||||||
|  | from Cryptodome.Cipher._mode_openpgp import OpenPgpMode | ||||||
|  | from Cryptodome.Cipher._mode_eax import EaxMode | ||||||
|  | 
 | ||||||
|  | ARC2Mode = int | ||||||
|  | 
 | ||||||
|  | MODE_ECB: ARC2Mode | ||||||
|  | MODE_CBC: ARC2Mode | ||||||
|  | MODE_CFB: ARC2Mode | ||||||
|  | MODE_OFB: ARC2Mode | ||||||
|  | MODE_CTR: ARC2Mode | ||||||
|  | MODE_OPENPGP: ARC2Mode | ||||||
|  | MODE_EAX: ARC2Mode | ||||||
|  | 
 | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: ARC2Mode, | ||||||
|  |         iv : Optional[Buffer] = ..., | ||||||
|  |         IV : Optional[Buffer] = ..., | ||||||
|  |         nonce : Optional[Buffer] = ..., | ||||||
|  |         segment_size : int = ..., | ||||||
|  |         mac_len : int = ..., | ||||||
|  |         initial_value : Union[int, Buffer] = ..., | ||||||
|  |         counter : Dict = ...) -> \ | ||||||
|  |         Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... | ||||||
|  | 
 | ||||||
|  | block_size: int | ||||||
|  | key_size: Iterable[int] | ||||||
							
								
								
									
										136
									
								
								resources/lib/deps/Cryptodome/Cipher/ARC4.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								resources/lib/deps/Cryptodome/Cipher/ARC4.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,136 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | #  Cipher/ARC4.py : ARC4 | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, | ||||||
|  |                                   create_string_buffer, get_raw_buffer, | ||||||
|  |                                   SmartPointer, c_size_t, c_uint8_ptr) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | _raw_arc4_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._ARC4", """ | ||||||
|  |                     int ARC4_stream_encrypt(void *rc4State, const uint8_t in[], | ||||||
|  |                                             uint8_t out[], size_t len); | ||||||
|  |                     int ARC4_stream_init(uint8_t *key, size_t keylen, | ||||||
|  |                                          void **pRc4State); | ||||||
|  |                     int ARC4_stream_destroy(void *rc4State); | ||||||
|  |                     """) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ARC4Cipher: | ||||||
|  |     """ARC4 cipher object. Do not create it directly. Use | ||||||
|  |     :func:`Cryptodome.Cipher.ARC4.new` instead. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, key, *args, **kwargs): | ||||||
|  |         """Initialize an ARC4 cipher object | ||||||
|  | 
 | ||||||
|  |         See also `new()` at the module level.""" | ||||||
|  | 
 | ||||||
|  |         if len(args) > 0: | ||||||
|  |             ndrop = args[0] | ||||||
|  |             args = args[1:] | ||||||
|  |         else: | ||||||
|  |             ndrop = kwargs.pop('drop', 0) | ||||||
|  | 
 | ||||||
|  |         if len(key) not in key_size: | ||||||
|  |             raise ValueError("Incorrect ARC4 key length (%d bytes)" % | ||||||
|  |                              len(key)) | ||||||
|  | 
 | ||||||
|  |         self._state = VoidPointer() | ||||||
|  |         result = _raw_arc4_lib.ARC4_stream_init(c_uint8_ptr(key), | ||||||
|  |                                                 c_size_t(len(key)), | ||||||
|  |                                                 self._state.address_of()) | ||||||
|  |         if result != 0: | ||||||
|  |             raise ValueError("Error %d while creating the ARC4 cipher" | ||||||
|  |                              % result) | ||||||
|  |         self._state = SmartPointer(self._state.get(), | ||||||
|  |                                    _raw_arc4_lib.ARC4_stream_destroy) | ||||||
|  | 
 | ||||||
|  |         if ndrop > 0: | ||||||
|  |             # This is OK even if the cipher is used for decryption, | ||||||
|  |             # since encrypt and decrypt are actually the same thing | ||||||
|  |             # with ARC4. | ||||||
|  |             self.encrypt(b'\x00' * ndrop) | ||||||
|  | 
 | ||||||
|  |         self.block_size = 1 | ||||||
|  |         self.key_size = len(key) | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, plaintext): | ||||||
|  |         """Encrypt a piece of data. | ||||||
|  | 
 | ||||||
|  |         :param plaintext: The data to encrypt, of any size. | ||||||
|  |         :type plaintext: bytes, bytearray, memoryview | ||||||
|  |         :returns: the encrypted byte string, of equal length as the | ||||||
|  |           plaintext. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         ciphertext = create_string_buffer(len(plaintext)) | ||||||
|  |         result = _raw_arc4_lib.ARC4_stream_encrypt(self._state.get(), | ||||||
|  |                                                    c_uint8_ptr(plaintext), | ||||||
|  |                                                    ciphertext, | ||||||
|  |                                                    c_size_t(len(plaintext))) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while encrypting with RC4" % result) | ||||||
|  |         return get_raw_buffer(ciphertext) | ||||||
|  | 
 | ||||||
|  |     def decrypt(self, ciphertext): | ||||||
|  |         """Decrypt a piece of data. | ||||||
|  | 
 | ||||||
|  |         :param ciphertext: The data to decrypt, of any size. | ||||||
|  |         :type ciphertext: bytes, bytearray, memoryview | ||||||
|  |         :returns: the decrypted byte string, of equal length as the | ||||||
|  |           ciphertext. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         try: | ||||||
|  |             return self.encrypt(ciphertext) | ||||||
|  |         except ValueError as e: | ||||||
|  |             raise ValueError(str(e).replace("enc", "dec")) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(key, *args, **kwargs): | ||||||
|  |     """Create a new ARC4 cipher. | ||||||
|  | 
 | ||||||
|  |     :param key: | ||||||
|  |         The secret key to use in the symmetric cipher. | ||||||
|  |         Its length must be in the range ``[1..256]``. | ||||||
|  |         The recommended length is 16 bytes. | ||||||
|  |     :type key: bytes, bytearray, memoryview | ||||||
|  | 
 | ||||||
|  |     :Keyword Arguments: | ||||||
|  |         *   *drop* (``integer``) -- | ||||||
|  |             The amount of bytes to discard from the initial part of the keystream. | ||||||
|  |             In fact, such part has been found to be distinguishable from random | ||||||
|  |             data (while it shouldn't) and also correlated to key. | ||||||
|  | 
 | ||||||
|  |             The recommended value is 3072_ bytes. The default value is 0. | ||||||
|  | 
 | ||||||
|  |     :Return: an `ARC4Cipher` object | ||||||
|  | 
 | ||||||
|  |     .. _3072: http://eprint.iacr.org/2002/067.pdf | ||||||
|  |     """ | ||||||
|  |     return ARC4Cipher(key, *args, **kwargs) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Size of a data block (in bytes) | ||||||
|  | block_size = 1 | ||||||
|  | # Size of a key (in bytes) | ||||||
|  | key_size = range(1, 256+1) | ||||||
							
								
								
									
										16
									
								
								resources/lib/deps/Cryptodome/Cipher/ARC4.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								resources/lib/deps/Cryptodome/Cipher/ARC4.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | ||||||
|  | from typing import Any, Union, Iterable | ||||||
|  | 
 | ||||||
|  | Buffer = bytes|bytearray|memoryview | ||||||
|  | 
 | ||||||
|  | class ARC4Cipher: | ||||||
|  |     block_size: int | ||||||
|  |     key_size: int | ||||||
|  | 
 | ||||||
|  |     def __init__(self, key: Buffer, *args: Any, **kwargs: Any) -> None: ... | ||||||
|  |     def encrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     def decrypt(self, ciphertext: Buffer) -> bytes: ... | ||||||
|  | 
 | ||||||
|  | def new(key: Buffer, drop : int = ...) -> ARC4Cipher: ... | ||||||
|  | 
 | ||||||
|  | block_size: int | ||||||
|  | key_size: Iterable[int] | ||||||
							
								
								
									
										159
									
								
								resources/lib/deps/Cryptodome/Cipher/Blowfish.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								resources/lib/deps/Cryptodome/Cipher/Blowfish.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,159 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | #  Cipher/Blowfish.py : Blowfish | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | """ | ||||||
|  | Module's constants for the modes of operation supported with Blowfish: | ||||||
|  | 
 | ||||||
|  | :var MODE_ECB: :ref:`Electronic Code Book (ECB) <ecb_mode>` | ||||||
|  | :var MODE_CBC: :ref:`Cipher-Block Chaining (CBC) <cbc_mode>` | ||||||
|  | :var MODE_CFB: :ref:`Cipher FeedBack (CFB) <cfb_mode>` | ||||||
|  | :var MODE_OFB: :ref:`Output FeedBack (OFB) <ofb_mode>` | ||||||
|  | :var MODE_CTR: :ref:`CounTer Mode (CTR) <ctr_mode>` | ||||||
|  | :var MODE_OPENPGP:  :ref:`OpenPGP Mode <openpgp_mode>` | ||||||
|  | :var MODE_EAX: :ref:`EAX Mode <eax_mode>` | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | import sys | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Cipher import _create_cipher | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   VoidPointer, SmartPointer, c_size_t, | ||||||
|  |                                   c_uint8_ptr) | ||||||
|  | 
 | ||||||
|  | _raw_blowfish_lib = load_pycryptodome_raw_lib( | ||||||
|  |         "Cryptodome.Cipher._raw_blowfish", | ||||||
|  |         """ | ||||||
|  |         int Blowfish_start_operation(const uint8_t key[], | ||||||
|  |                                      size_t key_len, | ||||||
|  |                                      void **pResult); | ||||||
|  |         int Blowfish_encrypt(const void *state, | ||||||
|  |                              const uint8_t *in, | ||||||
|  |                              uint8_t *out, | ||||||
|  |                              size_t data_len); | ||||||
|  |         int Blowfish_decrypt(const void *state, | ||||||
|  |                              const uint8_t *in, | ||||||
|  |                              uint8_t *out, | ||||||
|  |                              size_t data_len); | ||||||
|  |         int Blowfish_stop_operation(void *state); | ||||||
|  |         """ | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_base_cipher(dict_parameters): | ||||||
|  |     """This method instantiates and returns a smart pointer to | ||||||
|  |     a low-level base cipher. It will absorb named parameters in | ||||||
|  |     the process.""" | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         key = dict_parameters.pop("key") | ||||||
|  |     except KeyError: | ||||||
|  |         raise TypeError("Missing 'key' parameter") | ||||||
|  | 
 | ||||||
|  |     if len(key) not in key_size: | ||||||
|  |         raise ValueError("Incorrect Blowfish key length (%d bytes)" % len(key)) | ||||||
|  | 
 | ||||||
|  |     start_operation = _raw_blowfish_lib.Blowfish_start_operation | ||||||
|  |     stop_operation = _raw_blowfish_lib.Blowfish_stop_operation | ||||||
|  | 
 | ||||||
|  |     void_p = VoidPointer() | ||||||
|  |     result = start_operation(c_uint8_ptr(key), | ||||||
|  |                              c_size_t(len(key)), | ||||||
|  |                              void_p.address_of()) | ||||||
|  |     if result: | ||||||
|  |         raise ValueError("Error %X while instantiating the Blowfish cipher" | ||||||
|  |                          % result) | ||||||
|  |     return SmartPointer(void_p.get(), stop_operation) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(key, mode, *args, **kwargs): | ||||||
|  |     """Create a new Blowfish cipher | ||||||
|  | 
 | ||||||
|  |     :param key: | ||||||
|  |         The secret key to use in the symmetric cipher. | ||||||
|  |         Its length can vary from 5 to 56 bytes. | ||||||
|  |     :type key: bytes, bytearray, memoryview | ||||||
|  | 
 | ||||||
|  |     :param mode: | ||||||
|  |         The chaining mode to use for encryption or decryption. | ||||||
|  |     :type mode: One of the supported ``MODE_*`` constants | ||||||
|  | 
 | ||||||
|  |     :Keyword Arguments: | ||||||
|  |         *   **iv** (*bytes*, *bytearray*, *memoryview*) -- | ||||||
|  |             (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, | ||||||
|  |             and ``MODE_OPENPGP`` modes). | ||||||
|  | 
 | ||||||
|  |             The initialization vector to use for encryption or decryption. | ||||||
|  | 
 | ||||||
|  |             For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 8 bytes long. | ||||||
|  | 
 | ||||||
|  |             For ``MODE_OPENPGP`` mode only, | ||||||
|  |             it must be 8 bytes long for encryption | ||||||
|  |             and 10 bytes for decryption (in the latter case, it is | ||||||
|  |             actually the *encrypted* IV which was prefixed to the ciphertext). | ||||||
|  | 
 | ||||||
|  |             If not provided, a random byte string is generated (you must then | ||||||
|  |             read its value with the :attr:`iv` attribute). | ||||||
|  | 
 | ||||||
|  |         *   **nonce** (*bytes*, *bytearray*, *memoryview*) -- | ||||||
|  |             (Only applicable for ``MODE_EAX`` and ``MODE_CTR``). | ||||||
|  | 
 | ||||||
|  |             A value that must never be reused for any other encryption done | ||||||
|  |             with this key. | ||||||
|  | 
 | ||||||
|  |             For ``MODE_EAX`` there are no | ||||||
|  |             restrictions on its length (recommended: **16** bytes). | ||||||
|  | 
 | ||||||
|  |             For ``MODE_CTR``, its length must be in the range **[0..7]**. | ||||||
|  | 
 | ||||||
|  |             If not provided for ``MODE_EAX``, a random byte string is generated (you | ||||||
|  |             can read it back via the ``nonce`` attribute). | ||||||
|  | 
 | ||||||
|  |         *   **segment_size** (*integer*) -- | ||||||
|  |             (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext | ||||||
|  |             are segmented in. It must be a multiple of 8. | ||||||
|  |             If not specified, it will be assumed to be 8. | ||||||
|  | 
 | ||||||
|  |         *   **mac_len** : (*integer*) -- | ||||||
|  |             (Only ``MODE_EAX``) | ||||||
|  |             Length of the authentication tag, in bytes. | ||||||
|  |             It must be no longer than 8 (default). | ||||||
|  | 
 | ||||||
|  |         *   **initial_value** : (*integer*) -- | ||||||
|  |             (Only ``MODE_CTR``). The initial value for the counter within | ||||||
|  |             the counter block. By default it is **0**. | ||||||
|  | 
 | ||||||
|  |     :Return: a Blowfish object, of the applicable mode. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) | ||||||
|  | 
 | ||||||
|  | MODE_ECB = 1 | ||||||
|  | MODE_CBC = 2 | ||||||
|  | MODE_CFB = 3 | ||||||
|  | MODE_OFB = 5 | ||||||
|  | MODE_CTR = 6 | ||||||
|  | MODE_OPENPGP = 7 | ||||||
|  | MODE_EAX = 9 | ||||||
|  | 
 | ||||||
|  | # Size of a data block (in bytes) | ||||||
|  | block_size = 8 | ||||||
|  | # Size of a key (in bytes) | ||||||
|  | key_size = range(4, 56 + 1) | ||||||
							
								
								
									
										35
									
								
								resources/lib/deps/Cryptodome/Cipher/Blowfish.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								resources/lib/deps/Cryptodome/Cipher/Blowfish.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,35 @@ | ||||||
|  | from typing import Union, Dict, Iterable, Optional | ||||||
|  | 
 | ||||||
|  | Buffer = bytes|bytearray|memoryview | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Cipher._mode_ecb import EcbMode | ||||||
|  | from Cryptodome.Cipher._mode_cbc import CbcMode | ||||||
|  | from Cryptodome.Cipher._mode_cfb import CfbMode | ||||||
|  | from Cryptodome.Cipher._mode_ofb import OfbMode | ||||||
|  | from Cryptodome.Cipher._mode_ctr import CtrMode | ||||||
|  | from Cryptodome.Cipher._mode_openpgp import OpenPgpMode | ||||||
|  | from Cryptodome.Cipher._mode_eax import EaxMode | ||||||
|  | 
 | ||||||
|  | BlowfishMode = int | ||||||
|  | 
 | ||||||
|  | MODE_ECB: BlowfishMode | ||||||
|  | MODE_CBC: BlowfishMode | ||||||
|  | MODE_CFB: BlowfishMode | ||||||
|  | MODE_OFB: BlowfishMode | ||||||
|  | MODE_CTR: BlowfishMode | ||||||
|  | MODE_OPENPGP: BlowfishMode | ||||||
|  | MODE_EAX: BlowfishMode | ||||||
|  | 
 | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: BlowfishMode, | ||||||
|  |         iv : Optional[Buffer] = ..., | ||||||
|  |         IV : Optional[Buffer] = ..., | ||||||
|  |         nonce : Optional[Buffer] = ..., | ||||||
|  |         segment_size : int = ..., | ||||||
|  |         mac_len : int = ..., | ||||||
|  |         initial_value : Union[int, Buffer] = ..., | ||||||
|  |         counter : Dict = ...) -> \ | ||||||
|  |         Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... | ||||||
|  | 
 | ||||||
|  | block_size: int | ||||||
|  | key_size: Iterable[int] | ||||||
							
								
								
									
										159
									
								
								resources/lib/deps/Cryptodome/Cipher/CAST.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								resources/lib/deps/Cryptodome/Cipher/CAST.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,159 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | #  Cipher/CAST.py : CAST | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | """ | ||||||
|  | Module's constants for the modes of operation supported with CAST: | ||||||
|  | 
 | ||||||
|  | :var MODE_ECB: :ref:`Electronic Code Book (ECB) <ecb_mode>` | ||||||
|  | :var MODE_CBC: :ref:`Cipher-Block Chaining (CBC) <cbc_mode>` | ||||||
|  | :var MODE_CFB: :ref:`Cipher FeedBack (CFB) <cfb_mode>` | ||||||
|  | :var MODE_OFB: :ref:`Output FeedBack (OFB) <ofb_mode>` | ||||||
|  | :var MODE_CTR: :ref:`CounTer Mode (CTR) <ctr_mode>` | ||||||
|  | :var MODE_OPENPGP:  :ref:`OpenPGP Mode <openpgp_mode>` | ||||||
|  | :var MODE_EAX: :ref:`EAX Mode <eax_mode>` | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | import sys | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Cipher import _create_cipher | ||||||
|  | from Cryptodome.Util.py3compat import byte_string | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   VoidPointer, SmartPointer, | ||||||
|  |                                   c_size_t, c_uint8_ptr) | ||||||
|  | 
 | ||||||
|  | _raw_cast_lib = load_pycryptodome_raw_lib( | ||||||
|  |                     "Cryptodome.Cipher._raw_cast", | ||||||
|  |                     """ | ||||||
|  |                     int CAST_start_operation(const uint8_t key[], | ||||||
|  |                                              size_t key_len, | ||||||
|  |                                              void **pResult); | ||||||
|  |                     int CAST_encrypt(const void *state, | ||||||
|  |                                      const uint8_t *in, | ||||||
|  |                                      uint8_t *out, | ||||||
|  |                                      size_t data_len); | ||||||
|  |                     int CAST_decrypt(const void *state, | ||||||
|  |                                      const uint8_t *in, | ||||||
|  |                                      uint8_t *out, | ||||||
|  |                                      size_t data_len); | ||||||
|  |                     int CAST_stop_operation(void *state); | ||||||
|  |                     """) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_base_cipher(dict_parameters): | ||||||
|  |     """This method instantiates and returns a handle to a low-level | ||||||
|  |     base cipher. It will absorb named parameters in the process.""" | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         key = dict_parameters.pop("key") | ||||||
|  |     except KeyError: | ||||||
|  |         raise TypeError("Missing 'key' parameter") | ||||||
|  | 
 | ||||||
|  |     if len(key) not in key_size: | ||||||
|  |         raise ValueError("Incorrect CAST key length (%d bytes)" % len(key)) | ||||||
|  | 
 | ||||||
|  |     start_operation = _raw_cast_lib.CAST_start_operation | ||||||
|  |     stop_operation = _raw_cast_lib.CAST_stop_operation | ||||||
|  | 
 | ||||||
|  |     cipher = VoidPointer() | ||||||
|  |     result = start_operation(c_uint8_ptr(key), | ||||||
|  |                              c_size_t(len(key)), | ||||||
|  |                              cipher.address_of()) | ||||||
|  |     if result: | ||||||
|  |         raise ValueError("Error %X while instantiating the CAST cipher" | ||||||
|  |                          % result) | ||||||
|  | 
 | ||||||
|  |     return SmartPointer(cipher.get(), stop_operation) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(key, mode, *args, **kwargs): | ||||||
|  |     """Create a new CAST cipher | ||||||
|  | 
 | ||||||
|  |     :param key: | ||||||
|  |         The secret key to use in the symmetric cipher. | ||||||
|  |         Its length can vary from 5 to 16 bytes. | ||||||
|  |     :type key: bytes, bytearray, memoryview | ||||||
|  | 
 | ||||||
|  |     :param mode: | ||||||
|  |         The chaining mode to use for encryption or decryption. | ||||||
|  |     :type mode: One of the supported ``MODE_*`` constants | ||||||
|  | 
 | ||||||
|  |     :Keyword Arguments: | ||||||
|  |         *   **iv** (*bytes*, *bytearray*, *memoryview*) -- | ||||||
|  |             (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, | ||||||
|  |             and ``MODE_OPENPGP`` modes). | ||||||
|  | 
 | ||||||
|  |             The initialization vector to use for encryption or decryption. | ||||||
|  | 
 | ||||||
|  |             For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 8 bytes long. | ||||||
|  | 
 | ||||||
|  |             For ``MODE_OPENPGP`` mode only, | ||||||
|  |             it must be 8 bytes long for encryption | ||||||
|  |             and 10 bytes for decryption (in the latter case, it is | ||||||
|  |             actually the *encrypted* IV which was prefixed to the ciphertext). | ||||||
|  | 
 | ||||||
|  |             If not provided, a random byte string is generated (you must then | ||||||
|  |             read its value with the :attr:`iv` attribute). | ||||||
|  | 
 | ||||||
|  |         *   **nonce** (*bytes*, *bytearray*, *memoryview*) -- | ||||||
|  |             (Only applicable for ``MODE_EAX`` and ``MODE_CTR``). | ||||||
|  | 
 | ||||||
|  |             A value that must never be reused for any other encryption done | ||||||
|  |             with this key. | ||||||
|  | 
 | ||||||
|  |             For ``MODE_EAX`` there are no | ||||||
|  |             restrictions on its length (recommended: **16** bytes). | ||||||
|  | 
 | ||||||
|  |             For ``MODE_CTR``, its length must be in the range **[0..7]**. | ||||||
|  | 
 | ||||||
|  |             If not provided for ``MODE_EAX``, a random byte string is generated (you | ||||||
|  |             can read it back via the ``nonce`` attribute). | ||||||
|  | 
 | ||||||
|  |         *   **segment_size** (*integer*) -- | ||||||
|  |             (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext | ||||||
|  |             are segmented in. It must be a multiple of 8. | ||||||
|  |             If not specified, it will be assumed to be 8. | ||||||
|  | 
 | ||||||
|  |         *   **mac_len** : (*integer*) -- | ||||||
|  |             (Only ``MODE_EAX``) | ||||||
|  |             Length of the authentication tag, in bytes. | ||||||
|  |             It must be no longer than 8 (default). | ||||||
|  | 
 | ||||||
|  |         *   **initial_value** : (*integer*) -- | ||||||
|  |             (Only ``MODE_CTR``). The initial value for the counter within | ||||||
|  |             the counter block. By default it is **0**. | ||||||
|  | 
 | ||||||
|  |     :Return: a CAST object, of the applicable mode. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) | ||||||
|  | 
 | ||||||
|  | MODE_ECB = 1 | ||||||
|  | MODE_CBC = 2 | ||||||
|  | MODE_CFB = 3 | ||||||
|  | MODE_OFB = 5 | ||||||
|  | MODE_CTR = 6 | ||||||
|  | MODE_OPENPGP = 7 | ||||||
|  | MODE_EAX = 9 | ||||||
|  | 
 | ||||||
|  | # Size of a data block (in bytes) | ||||||
|  | block_size = 8 | ||||||
|  | # Size of a key (in bytes) | ||||||
|  | key_size = range(5, 16 + 1) | ||||||
							
								
								
									
										35
									
								
								resources/lib/deps/Cryptodome/Cipher/CAST.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								resources/lib/deps/Cryptodome/Cipher/CAST.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,35 @@ | ||||||
|  | from typing import Union, Dict, Iterable, Optional | ||||||
|  | 
 | ||||||
|  | Buffer = bytes|bytearray|memoryview | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Cipher._mode_ecb import EcbMode | ||||||
|  | from Cryptodome.Cipher._mode_cbc import CbcMode | ||||||
|  | from Cryptodome.Cipher._mode_cfb import CfbMode | ||||||
|  | from Cryptodome.Cipher._mode_ofb import OfbMode | ||||||
|  | from Cryptodome.Cipher._mode_ctr import CtrMode | ||||||
|  | from Cryptodome.Cipher._mode_openpgp import OpenPgpMode | ||||||
|  | from Cryptodome.Cipher._mode_eax import EaxMode | ||||||
|  | 
 | ||||||
|  | CASTMode = int | ||||||
|  | 
 | ||||||
|  | MODE_ECB: CASTMode | ||||||
|  | MODE_CBC: CASTMode | ||||||
|  | MODE_CFB: CASTMode | ||||||
|  | MODE_OFB: CASTMode | ||||||
|  | MODE_CTR: CASTMode | ||||||
|  | MODE_OPENPGP: CASTMode | ||||||
|  | MODE_EAX: CASTMode | ||||||
|  | 
 | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: CASTMode, | ||||||
|  |         iv : Optional[Buffer] = ..., | ||||||
|  |         IV : Optional[Buffer] = ..., | ||||||
|  |         nonce : Optional[Buffer] = ..., | ||||||
|  |         segment_size : int = ..., | ||||||
|  |         mac_len : int = ..., | ||||||
|  |         initial_value : Union[int, Buffer] = ..., | ||||||
|  |         counter : Dict = ...) -> \ | ||||||
|  |         Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... | ||||||
|  | 
 | ||||||
|  | block_size: int | ||||||
|  | key_size : Iterable[int] | ||||||
							
								
								
									
										287
									
								
								resources/lib/deps/Cryptodome/Cipher/ChaCha20.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										287
									
								
								resources/lib/deps/Cryptodome/Cipher/ChaCha20.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,287 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2014, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import _copy_bytes | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   create_string_buffer, | ||||||
|  |                                   get_raw_buffer, VoidPointer, | ||||||
|  |                                   SmartPointer, c_size_t, | ||||||
|  |                                   c_uint8_ptr, c_ulong, | ||||||
|  |                                   is_writeable_buffer) | ||||||
|  | 
 | ||||||
|  | _raw_chacha20_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._chacha20", | ||||||
|  |                     """ | ||||||
|  |                     int chacha20_init(void **pState, | ||||||
|  |                                       const uint8_t *key, | ||||||
|  |                                       size_t keySize, | ||||||
|  |                                       const uint8_t *nonce, | ||||||
|  |                                       size_t nonceSize); | ||||||
|  | 
 | ||||||
|  |                     int chacha20_destroy(void *state); | ||||||
|  | 
 | ||||||
|  |                     int chacha20_encrypt(void *state, | ||||||
|  |                                          const uint8_t in[], | ||||||
|  |                                          uint8_t out[], | ||||||
|  |                                          size_t len); | ||||||
|  | 
 | ||||||
|  |                     int chacha20_seek(void *state, | ||||||
|  |                                       unsigned long block_high, | ||||||
|  |                                       unsigned long block_low, | ||||||
|  |                                       unsigned offset); | ||||||
|  |                     int hchacha20(  const uint8_t key[32], | ||||||
|  |                                     const uint8_t nonce16[16], | ||||||
|  |                                     uint8_t subkey[32]); | ||||||
|  |                     """) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _HChaCha20(key, nonce): | ||||||
|  | 
 | ||||||
|  |     assert(len(key) == 32) | ||||||
|  |     assert(len(nonce) == 16) | ||||||
|  | 
 | ||||||
|  |     subkey = bytearray(32) | ||||||
|  |     result = _raw_chacha20_lib.hchacha20( | ||||||
|  |                 c_uint8_ptr(key), | ||||||
|  |                 c_uint8_ptr(nonce), | ||||||
|  |                 c_uint8_ptr(subkey)) | ||||||
|  |     if result: | ||||||
|  |         raise ValueError("Error %d when deriving subkey with HChaCha20" % result) | ||||||
|  | 
 | ||||||
|  |     return subkey | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ChaCha20Cipher(object): | ||||||
|  |     """ChaCha20 (or XChaCha20) cipher object. | ||||||
|  |     Do not create it directly. Use :py:func:`new` instead. | ||||||
|  | 
 | ||||||
|  |     :var nonce: The nonce with length 8, 12 or 24 bytes | ||||||
|  |     :vartype nonce: bytes | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     block_size = 1 | ||||||
|  | 
 | ||||||
|  |     def __init__(self, key, nonce): | ||||||
|  |         """Initialize a ChaCha20/XChaCha20 cipher object | ||||||
|  | 
 | ||||||
|  |         See also `new()` at the module level.""" | ||||||
|  | 
 | ||||||
|  |         self.nonce = _copy_bytes(None, None, nonce) | ||||||
|  | 
 | ||||||
|  |         # XChaCha20 requires a key derivation with HChaCha20 | ||||||
|  |         # See 2.3 in https://tools.ietf.org/html/draft-arciszewski-xchacha-03 | ||||||
|  |         if len(nonce) == 24: | ||||||
|  |             key = _HChaCha20(key, nonce[:16]) | ||||||
|  |             nonce = b'\x00' * 4 + nonce[16:] | ||||||
|  |             self._name = "XChaCha20" | ||||||
|  |         else: | ||||||
|  |             self._name = "ChaCha20" | ||||||
|  |             nonce = self.nonce | ||||||
|  | 
 | ||||||
|  |         self._next = ("encrypt", "decrypt") | ||||||
|  | 
 | ||||||
|  |         self._state = VoidPointer() | ||||||
|  |         result = _raw_chacha20_lib.chacha20_init( | ||||||
|  |                         self._state.address_of(), | ||||||
|  |                         c_uint8_ptr(key), | ||||||
|  |                         c_size_t(len(key)), | ||||||
|  |                         nonce, | ||||||
|  |                         c_size_t(len(nonce))) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d instantiating a %s cipher" % (result, | ||||||
|  |                                                                      self._name)) | ||||||
|  |         self._state = SmartPointer(self._state.get(), | ||||||
|  |                                    _raw_chacha20_lib.chacha20_destroy) | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, plaintext, output=None): | ||||||
|  |         """Encrypt a piece of data. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |           plaintext(bytes/bytearray/memoryview): The data to encrypt, of any size. | ||||||
|  |         Keyword Args: | ||||||
|  |           output(bytes/bytearray/memoryview): The location where the ciphertext | ||||||
|  |             is written to. If ``None``, the ciphertext is returned. | ||||||
|  |         Returns: | ||||||
|  |           If ``output`` is ``None``, the ciphertext is returned as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "encrypt" not in self._next: | ||||||
|  |             raise TypeError("Cipher object can only be used for decryption") | ||||||
|  |         self._next = ("encrypt",) | ||||||
|  |         return self._encrypt(plaintext, output) | ||||||
|  | 
 | ||||||
|  |     def _encrypt(self, plaintext, output): | ||||||
|  |         """Encrypt without FSM checks""" | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             ciphertext = create_string_buffer(len(plaintext)) | ||||||
|  |         else: | ||||||
|  |             ciphertext = output | ||||||
|  | 
 | ||||||
|  |             if not is_writeable_buffer(output): | ||||||
|  |                 raise TypeError("output must be a bytearray or a writeable memoryview") | ||||||
|  | 
 | ||||||
|  |             if len(plaintext) != len(output): | ||||||
|  |                 raise ValueError("output must have the same length as the input" | ||||||
|  |                                  "  (%d bytes)" % len(plaintext)) | ||||||
|  | 
 | ||||||
|  |         result = _raw_chacha20_lib.chacha20_encrypt( | ||||||
|  |                                          self._state.get(), | ||||||
|  |                                          c_uint8_ptr(plaintext), | ||||||
|  |                                          c_uint8_ptr(ciphertext), | ||||||
|  |                                          c_size_t(len(plaintext))) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while encrypting with %s" % (result, self._name)) | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             return get_raw_buffer(ciphertext) | ||||||
|  |         else: | ||||||
|  |             return None | ||||||
|  | 
 | ||||||
|  |     def decrypt(self, ciphertext, output=None): | ||||||
|  |         """Decrypt a piece of data. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |           ciphertext(bytes/bytearray/memoryview): The data to decrypt, of any size. | ||||||
|  |         Keyword Args: | ||||||
|  |           output(bytes/bytearray/memoryview): The location where the plaintext | ||||||
|  |             is written to. If ``None``, the plaintext is returned. | ||||||
|  |         Returns: | ||||||
|  |           If ``output`` is ``None``, the plaintext is returned as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "decrypt" not in self._next: | ||||||
|  |             raise TypeError("Cipher object can only be used for encryption") | ||||||
|  |         self._next = ("decrypt",) | ||||||
|  | 
 | ||||||
|  |         try: | ||||||
|  |             return self._encrypt(ciphertext, output) | ||||||
|  |         except ValueError as e: | ||||||
|  |             raise ValueError(str(e).replace("enc", "dec")) | ||||||
|  | 
 | ||||||
|  |     def seek(self, position): | ||||||
|  |         """Seek to a certain position in the key stream. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |           position (integer): | ||||||
|  |             The absolute position within the key stream, in bytes. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         position, offset = divmod(position, 64) | ||||||
|  |         block_low = position & 0xFFFFFFFF | ||||||
|  |         block_high = position >> 32 | ||||||
|  | 
 | ||||||
|  |         result = _raw_chacha20_lib.chacha20_seek( | ||||||
|  |                                                  self._state.get(), | ||||||
|  |                                                  c_ulong(block_high), | ||||||
|  |                                                  c_ulong(block_low), | ||||||
|  |                                                  offset | ||||||
|  |                                                  ) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while seeking with %s" % (result, self._name)) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _derive_Poly1305_key_pair(key, nonce): | ||||||
|  |     """Derive a tuple (r, s, nonce) for a Poly1305 MAC. | ||||||
|  | 
 | ||||||
|  |     If nonce is ``None``, a new 12-byte nonce is generated. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     if len(key) != 32: | ||||||
|  |         raise ValueError("Poly1305 with ChaCha20 requires a 32-byte key") | ||||||
|  | 
 | ||||||
|  |     if nonce is None: | ||||||
|  |         padded_nonce = nonce = get_random_bytes(12) | ||||||
|  |     elif len(nonce) == 8: | ||||||
|  |         # See RFC7538, 2.6: [...] ChaCha20 as specified here requires a 96-bit | ||||||
|  |         # nonce.  So if the provided nonce is only 64-bit, then the first 32 | ||||||
|  |         # bits of the nonce will be set to a constant number. | ||||||
|  |         # This will usually be zero, but for protocols with multiple senders it may be | ||||||
|  |         # different for each sender, but should be the same for all | ||||||
|  |         # invocations of the function with the same key by a particular | ||||||
|  |         # sender. | ||||||
|  |         padded_nonce = b'\x00\x00\x00\x00' + nonce | ||||||
|  |     elif len(nonce) == 12: | ||||||
|  |         padded_nonce = nonce | ||||||
|  |     else: | ||||||
|  |         raise ValueError("Poly1305 with ChaCha20 requires an 8- or 12-byte nonce") | ||||||
|  | 
 | ||||||
|  |     rs = new(key=key, nonce=padded_nonce).encrypt(b'\x00' * 32) | ||||||
|  |     return rs[:16], rs[16:], nonce | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(**kwargs): | ||||||
|  |     """Create a new ChaCha20 or XChaCha20 cipher | ||||||
|  | 
 | ||||||
|  |     Keyword Args: | ||||||
|  |         key (bytes/bytearray/memoryview): The secret key to use. | ||||||
|  |             It must be 32 bytes long. | ||||||
|  |         nonce (bytes/bytearray/memoryview): A mandatory value that | ||||||
|  |             must never be reused for any other encryption | ||||||
|  |             done with this key. | ||||||
|  | 
 | ||||||
|  |             For ChaCha20, it must be 8 or 12 bytes long. | ||||||
|  | 
 | ||||||
|  |             For XChaCha20, it must be 24 bytes long. | ||||||
|  | 
 | ||||||
|  |             If not provided, 8 bytes will be randomly generated | ||||||
|  |             (you can find them back in the ``nonce`` attribute). | ||||||
|  | 
 | ||||||
|  |     :Return: a :class:`Cryptodome.Cipher.ChaCha20.ChaCha20Cipher` object | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         key = kwargs.pop("key") | ||||||
|  |     except KeyError as e: | ||||||
|  |         raise TypeError("Missing parameter %s" % e) | ||||||
|  | 
 | ||||||
|  |     nonce = kwargs.pop("nonce", None) | ||||||
|  |     if nonce is None: | ||||||
|  |         nonce = get_random_bytes(8) | ||||||
|  | 
 | ||||||
|  |     if len(key) != 32: | ||||||
|  |         raise ValueError("ChaCha20/XChaCha20 key must be 32 bytes long") | ||||||
|  | 
 | ||||||
|  |     if len(nonce) not in (8, 12, 24): | ||||||
|  |         raise ValueError("Nonce must be 8/12 bytes(ChaCha20) or 24 bytes (XChaCha20)") | ||||||
|  | 
 | ||||||
|  |     if kwargs: | ||||||
|  |         raise TypeError("Unknown parameters: " + str(kwargs)) | ||||||
|  | 
 | ||||||
|  |     return ChaCha20Cipher(key, nonce) | ||||||
|  | 
 | ||||||
|  | # Size of a data block (in bytes) | ||||||
|  | block_size = 1 | ||||||
|  | 
 | ||||||
|  | # Size of a key (in bytes) | ||||||
|  | key_size = 32 | ||||||
							
								
								
									
										25
									
								
								resources/lib/deps/Cryptodome/Cipher/ChaCha20.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								resources/lib/deps/Cryptodome/Cipher/ChaCha20.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | ||||||
|  | from typing import Union, overload, Optional | ||||||
|  | 
 | ||||||
|  | Buffer = bytes|bytearray|memoryview | ||||||
|  | 
 | ||||||
|  | def _HChaCha20(key: Buffer, nonce: Buffer) -> bytearray: ... | ||||||
|  | 
 | ||||||
|  | class ChaCha20Cipher: | ||||||
|  |     block_size: int | ||||||
|  |     nonce: bytes | ||||||
|  | 
 | ||||||
|  |     def __init__(self, key: Buffer, nonce: Buffer) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  |     def seek(self, position: int) -> None: ... | ||||||
|  | 
 | ||||||
|  | def new(key: Buffer, nonce: Optional[Buffer] = ...) -> ChaCha20Cipher: ... | ||||||
|  | 
 | ||||||
|  | block_size: int | ||||||
|  | key_size: int | ||||||
							
								
								
									
										336
									
								
								resources/lib/deps/Cryptodome/Cipher/ChaCha20_Poly1305.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										336
									
								
								resources/lib/deps/Cryptodome/Cipher/ChaCha20_Poly1305.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,336 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2018, Helder Eijs <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | from binascii import unhexlify | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Cipher import ChaCha20 | ||||||
|  | from Cryptodome.Cipher.ChaCha20 import _HChaCha20 | ||||||
|  | from Cryptodome.Hash import Poly1305, BLAKE2s | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.number import long_to_bytes | ||||||
|  | from Cryptodome.Util.py3compat import _copy_bytes, bord | ||||||
|  | from Cryptodome.Util._raw_api import is_buffer | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _enum(**enums): | ||||||
|  |     return type('Enum', (), enums) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | _CipherStatus = _enum(PROCESSING_AUTH_DATA=1, | ||||||
|  |                       PROCESSING_CIPHERTEXT=2, | ||||||
|  |                       PROCESSING_DONE=3) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ChaCha20Poly1305Cipher(object): | ||||||
|  |     """ChaCha20-Poly1305 and XChaCha20-Poly1305 cipher object. | ||||||
|  |     Do not create it directly. Use :py:func:`new` instead. | ||||||
|  | 
 | ||||||
|  |     :var nonce: The nonce with length 8, 12 or 24 bytes | ||||||
|  |     :vartype nonce: byte string | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, key, nonce): | ||||||
|  |         """Initialize a ChaCha20-Poly1305 AEAD cipher object | ||||||
|  | 
 | ||||||
|  |         See also `new()` at the module level.""" | ||||||
|  | 
 | ||||||
|  |         self._next = ("update", "encrypt", "decrypt", "digest", | ||||||
|  |                       "verify") | ||||||
|  | 
 | ||||||
|  |         self._authenticator = Poly1305.new(key=key, nonce=nonce, cipher=ChaCha20) | ||||||
|  | 
 | ||||||
|  |         self._cipher = ChaCha20.new(key=key, nonce=nonce) | ||||||
|  |         self._cipher.seek(64)   # Block counter starts at 1 | ||||||
|  | 
 | ||||||
|  |         self._len_aad = 0 | ||||||
|  |         self._len_ct = 0 | ||||||
|  |         self._mac_tag = None | ||||||
|  |         self._status = _CipherStatus.PROCESSING_AUTH_DATA | ||||||
|  | 
 | ||||||
|  |     def update(self, data): | ||||||
|  |         """Protect the associated data. | ||||||
|  | 
 | ||||||
|  |         Associated data (also known as *additional authenticated data* - AAD) | ||||||
|  |         is the piece of the message that must stay in the clear, while | ||||||
|  |         still allowing the receiver to verify its integrity. | ||||||
|  |         An example is packet headers. | ||||||
|  | 
 | ||||||
|  |         The associated data (possibly split into multiple segments) is | ||||||
|  |         fed into :meth:`update` before any call to :meth:`decrypt` or :meth:`encrypt`. | ||||||
|  |         If there is no associated data, :meth:`update` is not called. | ||||||
|  | 
 | ||||||
|  |         :param bytes/bytearray/memoryview assoc_data: | ||||||
|  |             A piece of associated data. There are no restrictions on its size. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "update" not in self._next: | ||||||
|  |             raise TypeError("update() method cannot be called") | ||||||
|  | 
 | ||||||
|  |         self._len_aad += len(data) | ||||||
|  |         self._authenticator.update(data) | ||||||
|  | 
 | ||||||
|  |     def _pad_aad(self): | ||||||
|  | 
 | ||||||
|  |         assert(self._status == _CipherStatus.PROCESSING_AUTH_DATA) | ||||||
|  |         if self._len_aad & 0x0F: | ||||||
|  |             self._authenticator.update(b'\x00' * (16 - (self._len_aad & 0x0F))) | ||||||
|  |         self._status = _CipherStatus.PROCESSING_CIPHERTEXT | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, plaintext, output=None): | ||||||
|  |         """Encrypt a piece of data. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |           plaintext(bytes/bytearray/memoryview): The data to encrypt, of any size. | ||||||
|  |         Keyword Args: | ||||||
|  |           output(bytes/bytearray/memoryview): The location where the ciphertext | ||||||
|  |             is written to. If ``None``, the ciphertext is returned. | ||||||
|  |         Returns: | ||||||
|  |           If ``output`` is ``None``, the ciphertext is returned as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "encrypt" not in self._next: | ||||||
|  |             raise TypeError("encrypt() method cannot be called") | ||||||
|  | 
 | ||||||
|  |         if self._status == _CipherStatus.PROCESSING_AUTH_DATA: | ||||||
|  |             self._pad_aad() | ||||||
|  | 
 | ||||||
|  |         self._next = ("encrypt", "digest") | ||||||
|  | 
 | ||||||
|  |         result = self._cipher.encrypt(plaintext, output=output) | ||||||
|  |         self._len_ct += len(plaintext) | ||||||
|  |         if output is None: | ||||||
|  |             self._authenticator.update(result) | ||||||
|  |         else: | ||||||
|  |             self._authenticator.update(output) | ||||||
|  |         return result | ||||||
|  | 
 | ||||||
|  |     def decrypt(self, ciphertext, output=None): | ||||||
|  |         """Decrypt a piece of data. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |           ciphertext(bytes/bytearray/memoryview): The data to decrypt, of any size. | ||||||
|  |         Keyword Args: | ||||||
|  |           output(bytes/bytearray/memoryview): The location where the plaintext | ||||||
|  |             is written to. If ``None``, the plaintext is returned. | ||||||
|  |         Returns: | ||||||
|  |           If ``output`` is ``None``, the plaintext is returned as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "decrypt" not in self._next: | ||||||
|  |             raise TypeError("decrypt() method cannot be called") | ||||||
|  | 
 | ||||||
|  |         if self._status == _CipherStatus.PROCESSING_AUTH_DATA: | ||||||
|  |             self._pad_aad() | ||||||
|  | 
 | ||||||
|  |         self._next = ("decrypt", "verify") | ||||||
|  | 
 | ||||||
|  |         self._len_ct += len(ciphertext) | ||||||
|  |         self._authenticator.update(ciphertext) | ||||||
|  |         return self._cipher.decrypt(ciphertext, output=output) | ||||||
|  | 
 | ||||||
|  |     def _compute_mac(self): | ||||||
|  |         """Finalize the cipher (if not done already) and return the MAC.""" | ||||||
|  | 
 | ||||||
|  |         if self._mac_tag: | ||||||
|  |             assert(self._status == _CipherStatus.PROCESSING_DONE) | ||||||
|  |             return self._mac_tag | ||||||
|  | 
 | ||||||
|  |         assert(self._status != _CipherStatus.PROCESSING_DONE) | ||||||
|  | 
 | ||||||
|  |         if self._status == _CipherStatus.PROCESSING_AUTH_DATA: | ||||||
|  |             self._pad_aad() | ||||||
|  | 
 | ||||||
|  |         if self._len_ct & 0x0F: | ||||||
|  |             self._authenticator.update(b'\x00' * (16 - (self._len_ct & 0x0F))) | ||||||
|  | 
 | ||||||
|  |         self._status = _CipherStatus.PROCESSING_DONE | ||||||
|  | 
 | ||||||
|  |         self._authenticator.update(long_to_bytes(self._len_aad, 8)[::-1]) | ||||||
|  |         self._authenticator.update(long_to_bytes(self._len_ct, 8)[::-1]) | ||||||
|  |         self._mac_tag = self._authenticator.digest() | ||||||
|  |         return self._mac_tag | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         """Compute the *binary* authentication tag (MAC). | ||||||
|  | 
 | ||||||
|  |         :Return: the MAC tag, as 16 ``bytes``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "digest" not in self._next: | ||||||
|  |             raise TypeError("digest() method cannot be called") | ||||||
|  |         self._next = ("digest",) | ||||||
|  | 
 | ||||||
|  |         return self._compute_mac() | ||||||
|  | 
 | ||||||
|  |     def hexdigest(self): | ||||||
|  |         """Compute the *printable* authentication tag (MAC). | ||||||
|  | 
 | ||||||
|  |         This method is like :meth:`digest`. | ||||||
|  | 
 | ||||||
|  |         :Return: the MAC tag, as a hexadecimal string. | ||||||
|  |         """ | ||||||
|  |         return "".join(["%02x" % bord(x) for x in self.digest()]) | ||||||
|  | 
 | ||||||
|  |     def verify(self, received_mac_tag): | ||||||
|  |         """Validate the *binary* authentication tag (MAC). | ||||||
|  | 
 | ||||||
|  |         The receiver invokes this method at the very end, to | ||||||
|  |         check if the associated data (if any) and the decrypted | ||||||
|  |         messages are valid. | ||||||
|  | 
 | ||||||
|  |         :param bytes/bytearray/memoryview received_mac_tag: | ||||||
|  |             This is the 16-byte *binary* MAC, as received from the sender. | ||||||
|  |         :Raises ValueError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "verify" not in self._next: | ||||||
|  |             raise TypeError("verify() cannot be called" | ||||||
|  |                             " when encrypting a message") | ||||||
|  |         self._next = ("verify",) | ||||||
|  | 
 | ||||||
|  |         secret = get_random_bytes(16) | ||||||
|  | 
 | ||||||
|  |         self._compute_mac() | ||||||
|  | 
 | ||||||
|  |         mac1 = BLAKE2s.new(digest_bits=160, key=secret, | ||||||
|  |                            data=self._mac_tag) | ||||||
|  |         mac2 = BLAKE2s.new(digest_bits=160, key=secret, | ||||||
|  |                            data=received_mac_tag) | ||||||
|  | 
 | ||||||
|  |         if mac1.digest() != mac2.digest(): | ||||||
|  |             raise ValueError("MAC check failed") | ||||||
|  | 
 | ||||||
|  |     def hexverify(self, hex_mac_tag): | ||||||
|  |         """Validate the *printable* authentication tag (MAC). | ||||||
|  | 
 | ||||||
|  |         This method is like :meth:`verify`. | ||||||
|  | 
 | ||||||
|  |         :param string hex_mac_tag: | ||||||
|  |             This is the *printable* MAC. | ||||||
|  |         :Raises ValueError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self.verify(unhexlify(hex_mac_tag)) | ||||||
|  | 
 | ||||||
|  |     def encrypt_and_digest(self, plaintext): | ||||||
|  |         """Perform :meth:`encrypt` and :meth:`digest` in one step. | ||||||
|  | 
 | ||||||
|  |         :param plaintext: The data to encrypt, of any size. | ||||||
|  |         :type plaintext: bytes/bytearray/memoryview | ||||||
|  |         :return: a tuple with two ``bytes`` objects: | ||||||
|  | 
 | ||||||
|  |             - the ciphertext, of equal length as the plaintext | ||||||
|  |             - the 16-byte MAC tag | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         return self.encrypt(plaintext), self.digest() | ||||||
|  | 
 | ||||||
|  |     def decrypt_and_verify(self, ciphertext, received_mac_tag): | ||||||
|  |         """Perform :meth:`decrypt` and :meth:`verify` in one step. | ||||||
|  | 
 | ||||||
|  |         :param ciphertext: The piece of data to decrypt. | ||||||
|  |         :type ciphertext: bytes/bytearray/memoryview | ||||||
|  |         :param bytes received_mac_tag: | ||||||
|  |             This is the 16-byte *binary* MAC, as received from the sender. | ||||||
|  |         :return: the decrypted data (as ``bytes``) | ||||||
|  |         :raises ValueError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         plaintext = self.decrypt(ciphertext) | ||||||
|  |         self.verify(received_mac_tag) | ||||||
|  |         return plaintext | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(**kwargs): | ||||||
|  |     """Create a new ChaCha20-Poly1305 or XChaCha20-Poly1305 AEAD cipher. | ||||||
|  | 
 | ||||||
|  |     :keyword key: The secret key to use. It must be 32 bytes long. | ||||||
|  |     :type key: byte string | ||||||
|  | 
 | ||||||
|  |     :keyword nonce: | ||||||
|  |         A value that must never be reused for any other encryption | ||||||
|  |         done with this key. | ||||||
|  | 
 | ||||||
|  |         For ChaCha20-Poly1305, it must be 8 or 12 bytes long. | ||||||
|  | 
 | ||||||
|  |         For XChaCha20-Poly1305, it must be 24 bytes long. | ||||||
|  | 
 | ||||||
|  |         If not provided, 12 ``bytes`` will be generated randomly | ||||||
|  |         (you can find them back in the ``nonce`` attribute). | ||||||
|  |     :type nonce: bytes, bytearray, memoryview | ||||||
|  | 
 | ||||||
|  |     :Return: a :class:`Cryptodome.Cipher.ChaCha20.ChaCha20Poly1305Cipher` object | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         key = kwargs.pop("key") | ||||||
|  |     except KeyError as e: | ||||||
|  |         raise TypeError("Missing parameter %s" % e) | ||||||
|  | 
 | ||||||
|  |         self._len_ct += len(plaintext) | ||||||
|  | 
 | ||||||
|  |     if len(key) != 32: | ||||||
|  |         raise ValueError("Key must be 32 bytes long") | ||||||
|  | 
 | ||||||
|  |     nonce = kwargs.pop("nonce", None) | ||||||
|  |     if nonce is None: | ||||||
|  |         nonce = get_random_bytes(12) | ||||||
|  | 
 | ||||||
|  |     if len(nonce) in (8, 12): | ||||||
|  |         chacha20_poly1305_nonce = nonce | ||||||
|  |     elif len(nonce) == 24: | ||||||
|  |         key = _HChaCha20(key, nonce[:16]) | ||||||
|  |         chacha20_poly1305_nonce = b'\x00\x00\x00\x00' + nonce[16:] | ||||||
|  |     else: | ||||||
|  |         raise ValueError("Nonce must be 8, 12 or 24 bytes long") | ||||||
|  | 
 | ||||||
|  |     if not is_buffer(nonce): | ||||||
|  |         raise TypeError("nonce must be bytes, bytearray or memoryview") | ||||||
|  | 
 | ||||||
|  |     if kwargs: | ||||||
|  |         raise TypeError("Unknown parameters: " + str(kwargs)) | ||||||
|  | 
 | ||||||
|  |     cipher = ChaCha20Poly1305Cipher(key, chacha20_poly1305_nonce) | ||||||
|  |     cipher.nonce = _copy_bytes(None, None, nonce) | ||||||
|  |     return cipher | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Size of a key (in bytes) | ||||||
|  | key_size = 32 | ||||||
							
								
								
									
										28
									
								
								resources/lib/deps/Cryptodome/Cipher/ChaCha20_Poly1305.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								resources/lib/deps/Cryptodome/Cipher/ChaCha20_Poly1305.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,28 @@ | ||||||
|  | from typing import Union, Tuple, overload, Optional | ||||||
|  | 
 | ||||||
|  | Buffer = bytes|bytearray|memoryview | ||||||
|  | 
 | ||||||
|  | class ChaCha20Poly1305Cipher: | ||||||
|  |     nonce: bytes | ||||||
|  | 
 | ||||||
|  |     def __init__(self, key: Buffer, nonce: Buffer) -> None: ... | ||||||
|  |     def update(self, data: Buffer) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  |     def digest(self) -> bytes: ... | ||||||
|  |     def hexdigest(self) -> str: ... | ||||||
|  |     def verify(self, received_mac_tag: Buffer) -> None: ... | ||||||
|  |     def hexverify(self, received_mac_tag: str) -> None: ... | ||||||
|  |     def encrypt_and_digest(self, plaintext: Buffer) -> Tuple[bytes, bytes]: ... | ||||||
|  |     def decrypt_and_verify(self, ciphertext: Buffer, received_mac_tag: Buffer) -> bytes: ... | ||||||
|  | 
 | ||||||
|  | def new(key: Buffer, nonce: Optional[Buffer] = ...) -> ChaCha20Poly1305Cipher: ... | ||||||
|  | 
 | ||||||
|  | block_size: int | ||||||
|  | key_size: int | ||||||
							
								
								
									
										158
									
								
								resources/lib/deps/Cryptodome/Cipher/DES.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								resources/lib/deps/Cryptodome/Cipher/DES.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,158 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | #  Cipher/DES.py : DES | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | """ | ||||||
|  | Module's constants for the modes of operation supported with Single DES: | ||||||
|  | 
 | ||||||
|  | :var MODE_ECB: :ref:`Electronic Code Book (ECB) <ecb_mode>` | ||||||
|  | :var MODE_CBC: :ref:`Cipher-Block Chaining (CBC) <cbc_mode>` | ||||||
|  | :var MODE_CFB: :ref:`Cipher FeedBack (CFB) <cfb_mode>` | ||||||
|  | :var MODE_OFB: :ref:`Output FeedBack (OFB) <ofb_mode>` | ||||||
|  | :var MODE_CTR: :ref:`CounTer Mode (CTR) <ctr_mode>` | ||||||
|  | :var MODE_OPENPGP:  :ref:`OpenPGP Mode <openpgp_mode>` | ||||||
|  | :var MODE_EAX: :ref:`EAX Mode <eax_mode>` | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | import sys | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Cipher import _create_cipher | ||||||
|  | from Cryptodome.Util.py3compat import byte_string | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   VoidPointer, SmartPointer, | ||||||
|  |                                   c_size_t, c_uint8_ptr) | ||||||
|  | 
 | ||||||
|  | _raw_des_lib = load_pycryptodome_raw_lib( | ||||||
|  |                 "Cryptodome.Cipher._raw_des", | ||||||
|  |                 """ | ||||||
|  |                 int DES_start_operation(const uint8_t key[], | ||||||
|  |                                         size_t key_len, | ||||||
|  |                                         void **pResult); | ||||||
|  |                 int DES_encrypt(const void *state, | ||||||
|  |                                 const uint8_t *in, | ||||||
|  |                                 uint8_t *out, | ||||||
|  |                                 size_t data_len); | ||||||
|  |                 int DES_decrypt(const void *state, | ||||||
|  |                                 const uint8_t *in, | ||||||
|  |                                 uint8_t *out, | ||||||
|  |                                 size_t data_len); | ||||||
|  |                 int DES_stop_operation(void *state); | ||||||
|  |                 """) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_base_cipher(dict_parameters): | ||||||
|  |     """This method instantiates and returns a handle to a low-level | ||||||
|  |     base cipher. It will absorb named parameters in the process.""" | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         key = dict_parameters.pop("key") | ||||||
|  |     except KeyError: | ||||||
|  |         raise TypeError("Missing 'key' parameter") | ||||||
|  | 
 | ||||||
|  |     if len(key) != key_size: | ||||||
|  |         raise ValueError("Incorrect DES key length (%d bytes)" % len(key)) | ||||||
|  | 
 | ||||||
|  |     start_operation = _raw_des_lib.DES_start_operation | ||||||
|  |     stop_operation = _raw_des_lib.DES_stop_operation | ||||||
|  | 
 | ||||||
|  |     cipher = VoidPointer() | ||||||
|  |     result = start_operation(c_uint8_ptr(key), | ||||||
|  |                              c_size_t(len(key)), | ||||||
|  |                              cipher.address_of()) | ||||||
|  |     if result: | ||||||
|  |         raise ValueError("Error %X while instantiating the DES cipher" | ||||||
|  |                          % result) | ||||||
|  |     return SmartPointer(cipher.get(), stop_operation) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(key, mode, *args, **kwargs): | ||||||
|  |     """Create a new DES cipher. | ||||||
|  | 
 | ||||||
|  |     :param key: | ||||||
|  |         The secret key to use in the symmetric cipher. | ||||||
|  |         It must be 8 byte long. The parity bits will be ignored. | ||||||
|  |     :type key: bytes/bytearray/memoryview | ||||||
|  | 
 | ||||||
|  |     :param mode: | ||||||
|  |         The chaining mode to use for encryption or decryption. | ||||||
|  |     :type mode: One of the supported ``MODE_*`` constants | ||||||
|  | 
 | ||||||
|  |     :Keyword Arguments: | ||||||
|  |         *   **iv** (*byte string*) -- | ||||||
|  |             (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, | ||||||
|  |             and ``MODE_OPENPGP`` modes). | ||||||
|  | 
 | ||||||
|  |             The initialization vector to use for encryption or decryption. | ||||||
|  | 
 | ||||||
|  |             For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 8 bytes long. | ||||||
|  | 
 | ||||||
|  |             For ``MODE_OPENPGP`` mode only, | ||||||
|  |             it must be 8 bytes long for encryption | ||||||
|  |             and 10 bytes for decryption (in the latter case, it is | ||||||
|  |             actually the *encrypted* IV which was prefixed to the ciphertext). | ||||||
|  | 
 | ||||||
|  |             If not provided, a random byte string is generated (you must then | ||||||
|  |             read its value with the :attr:`iv` attribute). | ||||||
|  | 
 | ||||||
|  |         *   **nonce** (*byte string*) -- | ||||||
|  |             (Only applicable for ``MODE_EAX`` and ``MODE_CTR``). | ||||||
|  | 
 | ||||||
|  |             A value that must never be reused for any other encryption done | ||||||
|  |             with this key. | ||||||
|  | 
 | ||||||
|  |             For ``MODE_EAX`` there are no | ||||||
|  |             restrictions on its length (recommended: **16** bytes). | ||||||
|  | 
 | ||||||
|  |             For ``MODE_CTR``, its length must be in the range **[0..7]**. | ||||||
|  | 
 | ||||||
|  |             If not provided for ``MODE_EAX``, a random byte string is generated (you | ||||||
|  |             can read it back via the ``nonce`` attribute). | ||||||
|  | 
 | ||||||
|  |         *   **segment_size** (*integer*) -- | ||||||
|  |             (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext | ||||||
|  |             are segmented in. It must be a multiple of 8. | ||||||
|  |             If not specified, it will be assumed to be 8. | ||||||
|  | 
 | ||||||
|  |         *   **mac_len** : (*integer*) -- | ||||||
|  |             (Only ``MODE_EAX``) | ||||||
|  |             Length of the authentication tag, in bytes. | ||||||
|  |             It must be no longer than 8 (default). | ||||||
|  | 
 | ||||||
|  |         *   **initial_value** : (*integer*) -- | ||||||
|  |             (Only ``MODE_CTR``). The initial value for the counter within | ||||||
|  |             the counter block. By default it is **0**. | ||||||
|  | 
 | ||||||
|  |     :Return: a DES object, of the applicable mode. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) | ||||||
|  | 
 | ||||||
|  | MODE_ECB = 1 | ||||||
|  | MODE_CBC = 2 | ||||||
|  | MODE_CFB = 3 | ||||||
|  | MODE_OFB = 5 | ||||||
|  | MODE_CTR = 6 | ||||||
|  | MODE_OPENPGP = 7 | ||||||
|  | MODE_EAX = 9 | ||||||
|  | 
 | ||||||
|  | # Size of a data block (in bytes) | ||||||
|  | block_size = 8 | ||||||
|  | # Size of a key (in bytes) | ||||||
|  | key_size = 8 | ||||||
							
								
								
									
										35
									
								
								resources/lib/deps/Cryptodome/Cipher/DES.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								resources/lib/deps/Cryptodome/Cipher/DES.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,35 @@ | ||||||
|  | from typing import Union, Dict, Iterable, Optional | ||||||
|  | 
 | ||||||
|  | Buffer = bytes|bytearray|memoryview | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Cipher._mode_ecb import EcbMode | ||||||
|  | from Cryptodome.Cipher._mode_cbc import CbcMode | ||||||
|  | from Cryptodome.Cipher._mode_cfb import CfbMode | ||||||
|  | from Cryptodome.Cipher._mode_ofb import OfbMode | ||||||
|  | from Cryptodome.Cipher._mode_ctr import CtrMode | ||||||
|  | from Cryptodome.Cipher._mode_openpgp import OpenPgpMode | ||||||
|  | from Cryptodome.Cipher._mode_eax import EaxMode | ||||||
|  | 
 | ||||||
|  | DESMode = int | ||||||
|  | 
 | ||||||
|  | MODE_ECB: DESMode | ||||||
|  | MODE_CBC: DESMode | ||||||
|  | MODE_CFB: DESMode | ||||||
|  | MODE_OFB: DESMode | ||||||
|  | MODE_CTR: DESMode | ||||||
|  | MODE_OPENPGP: DESMode | ||||||
|  | MODE_EAX: DESMode | ||||||
|  | 
 | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: DESMode, | ||||||
|  |         iv : Optional[Buffer] = ..., | ||||||
|  |         IV : Optional[Buffer] = ..., | ||||||
|  |         nonce : Optional[Buffer] = ..., | ||||||
|  |         segment_size : int = ..., | ||||||
|  |         mac_len : int = ..., | ||||||
|  |         initial_value : Union[int, Buffer] = ..., | ||||||
|  |         counter : Dict = ...) -> \ | ||||||
|  |         Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... | ||||||
|  | 
 | ||||||
|  | block_size: int | ||||||
|  | key_size: int | ||||||
							
								
								
									
										187
									
								
								resources/lib/deps/Cryptodome/Cipher/DES3.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								resources/lib/deps/Cryptodome/Cipher/DES3.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,187 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | #  Cipher/DES3.py : DES3 | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | """ | ||||||
|  | Module's constants for the modes of operation supported with Triple DES: | ||||||
|  | 
 | ||||||
|  | :var MODE_ECB: :ref:`Electronic Code Book (ECB) <ecb_mode>` | ||||||
|  | :var MODE_CBC: :ref:`Cipher-Block Chaining (CBC) <cbc_mode>` | ||||||
|  | :var MODE_CFB: :ref:`Cipher FeedBack (CFB) <cfb_mode>` | ||||||
|  | :var MODE_OFB: :ref:`Output FeedBack (OFB) <ofb_mode>` | ||||||
|  | :var MODE_CTR: :ref:`CounTer Mode (CTR) <ctr_mode>` | ||||||
|  | :var MODE_OPENPGP:  :ref:`OpenPGP Mode <openpgp_mode>` | ||||||
|  | :var MODE_EAX: :ref:`EAX Mode <eax_mode>` | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | import sys | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Cipher import _create_cipher | ||||||
|  | from Cryptodome.Util.py3compat import byte_string, bchr, bord, bstr | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   VoidPointer, SmartPointer, | ||||||
|  |                                   c_size_t) | ||||||
|  | 
 | ||||||
|  | _raw_des3_lib = load_pycryptodome_raw_lib( | ||||||
|  |                     "Cryptodome.Cipher._raw_des3", | ||||||
|  |                     """ | ||||||
|  |                     int DES3_start_operation(const uint8_t key[], | ||||||
|  |                                              size_t key_len, | ||||||
|  |                                              void **pResult); | ||||||
|  |                     int DES3_encrypt(const void *state, | ||||||
|  |                                      const uint8_t *in, | ||||||
|  |                                      uint8_t *out, | ||||||
|  |                                      size_t data_len); | ||||||
|  |                     int DES3_decrypt(const void *state, | ||||||
|  |                                      const uint8_t *in, | ||||||
|  |                                      uint8_t *out, | ||||||
|  |                                      size_t data_len); | ||||||
|  |                     int DES3_stop_operation(void *state); | ||||||
|  |                     """) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def adjust_key_parity(key_in): | ||||||
|  |     """Set the parity bits in a TDES key. | ||||||
|  | 
 | ||||||
|  |     :param key_in: the TDES key whose bits need to be adjusted | ||||||
|  |     :type key_in: byte string | ||||||
|  | 
 | ||||||
|  |     :returns: a copy of ``key_in``, with the parity bits correctly set | ||||||
|  |     :rtype: byte string | ||||||
|  | 
 | ||||||
|  |     :raises ValueError: if the TDES key is not 16 or 24 bytes long | ||||||
|  |     :raises ValueError: if the TDES key degenerates into Single DES | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def parity_byte(key_byte): | ||||||
|  |         parity = 1 | ||||||
|  |         for i in range(1, 8): | ||||||
|  |             parity ^= (key_byte >> i) & 1 | ||||||
|  |         return (key_byte & 0xFE) | parity | ||||||
|  | 
 | ||||||
|  |     if len(key_in) not in key_size: | ||||||
|  |         raise ValueError("Not a valid TDES key") | ||||||
|  | 
 | ||||||
|  |     key_out = b"".join([ bchr(parity_byte(bord(x))) for x in key_in ]) | ||||||
|  | 
 | ||||||
|  |     if key_out[:8] == key_out[8:16] or key_out[-16:-8] == key_out[-8:]: | ||||||
|  |         raise ValueError("Triple DES key degenerates to single DES") | ||||||
|  | 
 | ||||||
|  |     return key_out | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_base_cipher(dict_parameters): | ||||||
|  |     """This method instantiates and returns a handle to a low-level base cipher. | ||||||
|  |     It will absorb named parameters in the process.""" | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         key_in = dict_parameters.pop("key") | ||||||
|  |     except KeyError: | ||||||
|  |         raise TypeError("Missing 'key' parameter") | ||||||
|  | 
 | ||||||
|  |     key = adjust_key_parity(bstr(key_in)) | ||||||
|  | 
 | ||||||
|  |     start_operation = _raw_des3_lib.DES3_start_operation | ||||||
|  |     stop_operation = _raw_des3_lib.DES3_stop_operation | ||||||
|  | 
 | ||||||
|  |     cipher = VoidPointer() | ||||||
|  |     result = start_operation(key, | ||||||
|  |                              c_size_t(len(key)), | ||||||
|  |                              cipher.address_of()) | ||||||
|  |     if result: | ||||||
|  |         raise ValueError("Error %X while instantiating the TDES cipher" | ||||||
|  |                          % result) | ||||||
|  |     return SmartPointer(cipher.get(), stop_operation) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(key, mode, *args, **kwargs): | ||||||
|  |     """Create a new Triple DES cipher. | ||||||
|  | 
 | ||||||
|  |     :param key: | ||||||
|  |         The secret key to use in the symmetric cipher. | ||||||
|  |         It must be 16 or 24 byte long. The parity bits will be ignored. | ||||||
|  |     :type key: bytes/bytearray/memoryview | ||||||
|  | 
 | ||||||
|  |     :param mode: | ||||||
|  |         The chaining mode to use for encryption or decryption. | ||||||
|  |     :type mode: One of the supported ``MODE_*`` constants | ||||||
|  | 
 | ||||||
|  |     :Keyword Arguments: | ||||||
|  |         *   **iv** (*bytes*, *bytearray*, *memoryview*) -- | ||||||
|  |             (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, | ||||||
|  |             and ``MODE_OPENPGP`` modes). | ||||||
|  | 
 | ||||||
|  |             The initialization vector to use for encryption or decryption. | ||||||
|  | 
 | ||||||
|  |             For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 8 bytes long. | ||||||
|  | 
 | ||||||
|  |             For ``MODE_OPENPGP`` mode only, | ||||||
|  |             it must be 8 bytes long for encryption | ||||||
|  |             and 10 bytes for decryption (in the latter case, it is | ||||||
|  |             actually the *encrypted* IV which was prefixed to the ciphertext). | ||||||
|  | 
 | ||||||
|  |             If not provided, a random byte string is generated (you must then | ||||||
|  |             read its value with the :attr:`iv` attribute). | ||||||
|  | 
 | ||||||
|  |         *   **nonce** (*bytes*, *bytearray*, *memoryview*) -- | ||||||
|  |             (Only applicable for ``MODE_EAX`` and ``MODE_CTR``). | ||||||
|  | 
 | ||||||
|  |             A value that must never be reused for any other encryption done | ||||||
|  |             with this key. | ||||||
|  | 
 | ||||||
|  |             For ``MODE_EAX`` there are no | ||||||
|  |             restrictions on its length (recommended: **16** bytes). | ||||||
|  | 
 | ||||||
|  |             For ``MODE_CTR``, its length must be in the range **[0..7]**. | ||||||
|  | 
 | ||||||
|  |             If not provided for ``MODE_EAX``, a random byte string is generated (you | ||||||
|  |             can read it back via the ``nonce`` attribute). | ||||||
|  | 
 | ||||||
|  |         *   **segment_size** (*integer*) -- | ||||||
|  |             (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext | ||||||
|  |             are segmented in. It must be a multiple of 8. | ||||||
|  |             If not specified, it will be assumed to be 8. | ||||||
|  | 
 | ||||||
|  |         *   **mac_len** : (*integer*) -- | ||||||
|  |             (Only ``MODE_EAX``) | ||||||
|  |             Length of the authentication tag, in bytes. | ||||||
|  |             It must be no longer than 8 (default). | ||||||
|  | 
 | ||||||
|  |         *   **initial_value** : (*integer*) -- | ||||||
|  |             (Only ``MODE_CTR``). The initial value for the counter within | ||||||
|  |             the counter block. By default it is **0**. | ||||||
|  | 
 | ||||||
|  |     :Return: a Triple DES object, of the applicable mode. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) | ||||||
|  | 
 | ||||||
|  | MODE_ECB = 1 | ||||||
|  | MODE_CBC = 2 | ||||||
|  | MODE_CFB = 3 | ||||||
|  | MODE_OFB = 5 | ||||||
|  | MODE_CTR = 6 | ||||||
|  | MODE_OPENPGP = 7 | ||||||
|  | MODE_EAX = 9 | ||||||
|  | 
 | ||||||
|  | # Size of a data block (in bytes) | ||||||
|  | block_size = 8 | ||||||
|  | # Size of a key (in bytes) | ||||||
|  | key_size = (16, 24) | ||||||
							
								
								
									
										37
									
								
								resources/lib/deps/Cryptodome/Cipher/DES3.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								resources/lib/deps/Cryptodome/Cipher/DES3.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,37 @@ | ||||||
|  | from typing import Union, Dict, Tuple, Optional | ||||||
|  | 
 | ||||||
|  | Buffer = bytes|bytearray|memoryview | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Cipher._mode_ecb import EcbMode | ||||||
|  | from Cryptodome.Cipher._mode_cbc import CbcMode | ||||||
|  | from Cryptodome.Cipher._mode_cfb import CfbMode | ||||||
|  | from Cryptodome.Cipher._mode_ofb import OfbMode | ||||||
|  | from Cryptodome.Cipher._mode_ctr import CtrMode | ||||||
|  | from Cryptodome.Cipher._mode_openpgp import OpenPgpMode | ||||||
|  | from Cryptodome.Cipher._mode_eax import EaxMode | ||||||
|  | 
 | ||||||
|  | def adjust_key_parity(key_in: bytes) -> bytes: ... | ||||||
|  | 
 | ||||||
|  | DES3Mode = int | ||||||
|  | 
 | ||||||
|  | MODE_ECB: DES3Mode | ||||||
|  | MODE_CBC: DES3Mode | ||||||
|  | MODE_CFB: DES3Mode | ||||||
|  | MODE_OFB: DES3Mode | ||||||
|  | MODE_CTR: DES3Mode | ||||||
|  | MODE_OPENPGP: DES3Mode | ||||||
|  | MODE_EAX: DES3Mode | ||||||
|  | 
 | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: DES3Mode, | ||||||
|  |         iv : Optional[Buffer] = ..., | ||||||
|  |         IV : Optional[Buffer] = ..., | ||||||
|  |         nonce : Optional[Buffer] = ..., | ||||||
|  |         segment_size : int = ..., | ||||||
|  |         mac_len : int = ..., | ||||||
|  |         initial_value : Union[int, Buffer] = ..., | ||||||
|  |         counter : Dict = ...) -> \ | ||||||
|  |         Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... | ||||||
|  | 
 | ||||||
|  | block_size: int | ||||||
|  | key_size: Tuple[int, int] | ||||||
							
								
								
									
										231
									
								
								resources/lib/deps/Cryptodome/Cipher/PKCS1_OAEP.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										231
									
								
								resources/lib/deps/Cryptodome/Cipher/PKCS1_OAEP.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,231 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | #  Cipher/PKCS1_OAEP.py : PKCS#1 OAEP | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Signature.pss import MGF1 | ||||||
|  | import Cryptodome.Hash.SHA1 | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import _copy_bytes | ||||||
|  | import Cryptodome.Util.number | ||||||
|  | from Cryptodome.Util.number import ceil_div, bytes_to_long, long_to_bytes | ||||||
|  | from Cryptodome.Util.strxor import strxor | ||||||
|  | from Cryptodome import Random | ||||||
|  | from ._pkcs1_oaep_decode import oaep_decode | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class PKCS1OAEP_Cipher: | ||||||
|  |     """Cipher object for PKCS#1 v1.5 OAEP. | ||||||
|  |     Do not create directly: use :func:`new` instead.""" | ||||||
|  | 
 | ||||||
|  |     def __init__(self, key, hashAlgo, mgfunc, label, randfunc): | ||||||
|  |         """Initialize this PKCS#1 OAEP cipher object. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |          key : an RSA key object | ||||||
|  |                 If a private half is given, both encryption and decryption are possible. | ||||||
|  |                 If a public half is given, only encryption is possible. | ||||||
|  |          hashAlgo : hash object | ||||||
|  |                 The hash function to use. This can be a module under `Cryptodome.Hash` | ||||||
|  |                 or an existing hash object created from any of such modules. If not specified, | ||||||
|  |                 `Cryptodome.Hash.SHA1` is used. | ||||||
|  |          mgfunc : callable | ||||||
|  |                 A mask generation function that accepts two parameters: a string to | ||||||
|  |                 use as seed, and the lenth of the mask to generate, in bytes. | ||||||
|  |                 If not specified, the standard MGF1 consistent with ``hashAlgo`` is used (a safe choice). | ||||||
|  |          label : bytes/bytearray/memoryview | ||||||
|  |                 A label to apply to this particular encryption. If not specified, | ||||||
|  |                 an empty string is used. Specifying a label does not improve | ||||||
|  |                 security. | ||||||
|  |          randfunc : callable | ||||||
|  |                 A function that returns random bytes. | ||||||
|  | 
 | ||||||
|  |         :attention: Modify the mask generation function only if you know what you are doing. | ||||||
|  |                     Sender and receiver must use the same one. | ||||||
|  |         """ | ||||||
|  |         self._key = key | ||||||
|  | 
 | ||||||
|  |         if hashAlgo: | ||||||
|  |             self._hashObj = hashAlgo | ||||||
|  |         else: | ||||||
|  |             self._hashObj = Cryptodome.Hash.SHA1 | ||||||
|  | 
 | ||||||
|  |         if mgfunc: | ||||||
|  |             self._mgf = mgfunc | ||||||
|  |         else: | ||||||
|  |             self._mgf = lambda x, y: MGF1(x, y, self._hashObj) | ||||||
|  | 
 | ||||||
|  |         self._label = _copy_bytes(None, None, label) | ||||||
|  |         self._randfunc = randfunc | ||||||
|  | 
 | ||||||
|  |     def can_encrypt(self): | ||||||
|  |         """Legacy function to check if you can call :meth:`encrypt`. | ||||||
|  | 
 | ||||||
|  |         .. deprecated:: 3.0""" | ||||||
|  |         return self._key.can_encrypt() | ||||||
|  | 
 | ||||||
|  |     def can_decrypt(self): | ||||||
|  |         """Legacy function to check if you can call :meth:`decrypt`. | ||||||
|  | 
 | ||||||
|  |         .. deprecated:: 3.0""" | ||||||
|  |         return self._key.can_decrypt() | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, message): | ||||||
|  |         """Encrypt a message with PKCS#1 OAEP. | ||||||
|  | 
 | ||||||
|  |         :param message: | ||||||
|  |             The message to encrypt, also known as plaintext. It can be of | ||||||
|  |             variable length, but not longer than the RSA modulus (in bytes) | ||||||
|  |             minus 2, minus twice the hash output size. | ||||||
|  |             For instance, if you use RSA 2048 and SHA-256, the longest message | ||||||
|  |             you can encrypt is 190 byte long. | ||||||
|  |         :type message: bytes/bytearray/memoryview | ||||||
|  | 
 | ||||||
|  |         :returns: The ciphertext, as large as the RSA modulus. | ||||||
|  |         :rtype: bytes | ||||||
|  | 
 | ||||||
|  |         :raises ValueError: | ||||||
|  |             if the message is too long. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         # See 7.1.1 in RFC3447 | ||||||
|  |         modBits = Cryptodome.Util.number.size(self._key.n) | ||||||
|  |         k = ceil_div(modBits, 8)            # Convert from bits to bytes | ||||||
|  |         hLen = self._hashObj.digest_size | ||||||
|  |         mLen = len(message) | ||||||
|  | 
 | ||||||
|  |         # Step 1b | ||||||
|  |         ps_len = k - mLen - 2 * hLen - 2 | ||||||
|  |         if ps_len < 0: | ||||||
|  |             raise ValueError("Plaintext is too long.") | ||||||
|  |         # Step 2a | ||||||
|  |         lHash = self._hashObj.new(self._label).digest() | ||||||
|  |         # Step 2b | ||||||
|  |         ps = b'\x00' * ps_len | ||||||
|  |         # Step 2c | ||||||
|  |         db = lHash + ps + b'\x01' + _copy_bytes(None, None, message) | ||||||
|  |         # Step 2d | ||||||
|  |         ros = self._randfunc(hLen) | ||||||
|  |         # Step 2e | ||||||
|  |         dbMask = self._mgf(ros, k-hLen-1) | ||||||
|  |         # Step 2f | ||||||
|  |         maskedDB = strxor(db, dbMask) | ||||||
|  |         # Step 2g | ||||||
|  |         seedMask = self._mgf(maskedDB, hLen) | ||||||
|  |         # Step 2h | ||||||
|  |         maskedSeed = strxor(ros, seedMask) | ||||||
|  |         # Step 2i | ||||||
|  |         em = b'\x00' + maskedSeed + maskedDB | ||||||
|  |         # Step 3a (OS2IP) | ||||||
|  |         em_int = bytes_to_long(em) | ||||||
|  |         # Step 3b (RSAEP) | ||||||
|  |         m_int = self._key._encrypt(em_int) | ||||||
|  |         # Step 3c (I2OSP) | ||||||
|  |         c = long_to_bytes(m_int, k) | ||||||
|  |         return c | ||||||
|  | 
 | ||||||
|  |     def decrypt(self, ciphertext): | ||||||
|  |         """Decrypt a message with PKCS#1 OAEP. | ||||||
|  | 
 | ||||||
|  |         :param ciphertext: The encrypted message. | ||||||
|  |         :type ciphertext: bytes/bytearray/memoryview | ||||||
|  | 
 | ||||||
|  |         :returns: The original message (plaintext). | ||||||
|  |         :rtype: bytes | ||||||
|  | 
 | ||||||
|  |         :raises ValueError: | ||||||
|  |             if the ciphertext has the wrong length, or if decryption | ||||||
|  |             fails the integrity check (in which case, the decryption | ||||||
|  |             key is probably wrong). | ||||||
|  |         :raises TypeError: | ||||||
|  |             if the RSA key has no private half (i.e. you are trying | ||||||
|  |             to decrypt using a public key). | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         # See 7.1.2 in RFC3447 | ||||||
|  |         modBits = Cryptodome.Util.number.size(self._key.n) | ||||||
|  |         k = ceil_div(modBits, 8)            # Convert from bits to bytes | ||||||
|  |         hLen = self._hashObj.digest_size | ||||||
|  | 
 | ||||||
|  |         # Step 1b and 1c | ||||||
|  |         if len(ciphertext) != k or k < hLen+2: | ||||||
|  |             raise ValueError("Ciphertext with incorrect length.") | ||||||
|  |         # Step 2a (O2SIP) | ||||||
|  |         ct_int = bytes_to_long(ciphertext) | ||||||
|  |         # Step 2b (RSADP) and step 2c (I2OSP) | ||||||
|  |         em = self._key._decrypt_to_bytes(ct_int) | ||||||
|  |         # Step 3a | ||||||
|  |         lHash = self._hashObj.new(self._label).digest() | ||||||
|  |         # y must be 0, but we MUST NOT check it here in order not to | ||||||
|  |         # allow attacks like Manger's (http://dl.acm.org/citation.cfm?id=704143) | ||||||
|  |         maskedSeed = em[1:hLen+1] | ||||||
|  |         maskedDB = em[hLen+1:] | ||||||
|  |         # Step 3c | ||||||
|  |         seedMask = self._mgf(maskedDB, hLen) | ||||||
|  |         # Step 3d | ||||||
|  |         seed = strxor(maskedSeed, seedMask) | ||||||
|  |         # Step 3e | ||||||
|  |         dbMask = self._mgf(seed, k-hLen-1) | ||||||
|  |         # Step 3f | ||||||
|  |         db = strxor(maskedDB, dbMask) | ||||||
|  |         # Step 3b + 3g | ||||||
|  |         res = oaep_decode(em, lHash, db) | ||||||
|  |         if res <= 0: | ||||||
|  |             raise ValueError("Incorrect decryption.") | ||||||
|  |         # Step 4 | ||||||
|  |         return db[res:] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(key, hashAlgo=None, mgfunc=None, label=b'', randfunc=None): | ||||||
|  |     """Return a cipher object :class:`PKCS1OAEP_Cipher` | ||||||
|  |        that can be used to perform PKCS#1 OAEP encryption or decryption. | ||||||
|  | 
 | ||||||
|  |     :param key: | ||||||
|  |       The key object to use to encrypt or decrypt the message. | ||||||
|  |       Decryption is only possible with a private RSA key. | ||||||
|  |     :type key: RSA key object | ||||||
|  | 
 | ||||||
|  |     :param hashAlgo: | ||||||
|  |       The hash function to use. This can be a module under `Cryptodome.Hash` | ||||||
|  |       or an existing hash object created from any of such modules. | ||||||
|  |       If not specified, `Cryptodome.Hash.SHA1` is used. | ||||||
|  |     :type hashAlgo: hash object | ||||||
|  | 
 | ||||||
|  |     :param mgfunc: | ||||||
|  |       A mask generation function that accepts two parameters: a string to | ||||||
|  |       use as seed, and the lenth of the mask to generate, in bytes. | ||||||
|  |       If not specified, the standard MGF1 consistent with ``hashAlgo`` is used (a safe choice). | ||||||
|  |     :type mgfunc: callable | ||||||
|  | 
 | ||||||
|  |     :param label: | ||||||
|  |       A label to apply to this particular encryption. If not specified, | ||||||
|  |       an empty string is used. Specifying a label does not improve | ||||||
|  |       security. | ||||||
|  |     :type label: bytes/bytearray/memoryview | ||||||
|  | 
 | ||||||
|  |     :param randfunc: | ||||||
|  |       A function that returns random bytes. | ||||||
|  |       The default is `Random.get_random_bytes`. | ||||||
|  |     :type randfunc: callable | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     if randfunc is None: | ||||||
|  |         randfunc = Random.get_random_bytes | ||||||
|  |     return PKCS1OAEP_Cipher(key, hashAlgo, mgfunc, label, randfunc) | ||||||
							
								
								
									
										35
									
								
								resources/lib/deps/Cryptodome/Cipher/PKCS1_OAEP.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								resources/lib/deps/Cryptodome/Cipher/PKCS1_OAEP.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,35 @@ | ||||||
|  | from typing import Optional, Union, Callable, Any, overload | ||||||
|  | from typing_extensions import Protocol | ||||||
|  | 
 | ||||||
|  | from Cryptodome.PublicKey.RSA import RsaKey | ||||||
|  | 
 | ||||||
|  | class HashLikeClass(Protocol): | ||||||
|  |     digest_size : int | ||||||
|  |     def new(self, data: Optional[bytes] = ...) -> Any: ... | ||||||
|  | 
 | ||||||
|  | class HashLikeModule(Protocol): | ||||||
|  |     digest_size : int | ||||||
|  |     @staticmethod | ||||||
|  |     def new(data: Optional[bytes] = ...) -> Any: ... | ||||||
|  | 
 | ||||||
|  | HashLike = Union[HashLikeClass, HashLikeModule] | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | class PKCS1OAEP_Cipher: | ||||||
|  |     def __init__(self, | ||||||
|  |                  key: RsaKey, | ||||||
|  |                  hashAlgo: HashLike, | ||||||
|  |                  mgfunc: Callable[[bytes, int], bytes], | ||||||
|  |                  label: Buffer, | ||||||
|  |                  randfunc: Callable[[int], bytes]) -> None: ... | ||||||
|  |     def can_encrypt(self) -> bool: ... | ||||||
|  |     def can_decrypt(self) -> bool: ... | ||||||
|  |     def encrypt(self, message: Buffer) -> bytes: ... | ||||||
|  |     def decrypt(self, ciphertext: Buffer) -> bytes: ... | ||||||
|  | 
 | ||||||
|  | def new(key: RsaKey, | ||||||
|  |         hashAlgo: Optional[HashLike] = ..., | ||||||
|  |         mgfunc: Optional[Callable[[bytes, int], bytes]] = ..., | ||||||
|  |         label: Optional[Buffer] = ..., | ||||||
|  |         randfunc: Optional[Callable[[int], bytes]] = ...) -> PKCS1OAEP_Cipher: ... | ||||||
							
								
								
									
										189
									
								
								resources/lib/deps/Cryptodome/Cipher/PKCS1_v1_5.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										189
									
								
								resources/lib/deps/Cryptodome/Cipher/PKCS1_v1_5.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,189 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | #  Cipher/PKCS1-v1_5.py : PKCS#1 v1.5 | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | __all__ = ['new', 'PKCS115_Cipher'] | ||||||
|  | 
 | ||||||
|  | from Cryptodome import Random | ||||||
|  | from Cryptodome.Util.number import bytes_to_long, long_to_bytes | ||||||
|  | from Cryptodome.Util.py3compat import bord, is_bytes, _copy_bytes | ||||||
|  | from ._pkcs1_oaep_decode import pkcs1_decode | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class PKCS115_Cipher: | ||||||
|  |     """This cipher can perform PKCS#1 v1.5 RSA encryption or decryption. | ||||||
|  |     Do not instantiate directly. Use :func:`Cryptodome.Cipher.PKCS1_v1_5.new` instead.""" | ||||||
|  | 
 | ||||||
|  |     def __init__(self, key, randfunc): | ||||||
|  |         """Initialize this PKCS#1 v1.5 cipher object. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |          key : an RSA key object | ||||||
|  |           If a private half is given, both encryption and decryption are possible. | ||||||
|  |           If a public half is given, only encryption is possible. | ||||||
|  |          randfunc : callable | ||||||
|  |           Function that returns random bytes. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self._key = key | ||||||
|  |         self._randfunc = randfunc | ||||||
|  | 
 | ||||||
|  |     def can_encrypt(self): | ||||||
|  |         """Return True if this cipher object can be used for encryption.""" | ||||||
|  |         return self._key.can_encrypt() | ||||||
|  | 
 | ||||||
|  |     def can_decrypt(self): | ||||||
|  |         """Return True if this cipher object can be used for decryption.""" | ||||||
|  |         return self._key.can_decrypt() | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, message): | ||||||
|  |         """Produce the PKCS#1 v1.5 encryption of a message. | ||||||
|  | 
 | ||||||
|  |         This function is named ``RSAES-PKCS1-V1_5-ENCRYPT``, and it is specified in | ||||||
|  |         `section 7.2.1 of RFC8017 | ||||||
|  |         <https://tools.ietf.org/html/rfc8017#page-28>`_. | ||||||
|  | 
 | ||||||
|  |         :param message: | ||||||
|  |             The message to encrypt, also known as plaintext. It can be of | ||||||
|  |             variable length, but not longer than the RSA modulus (in bytes) minus 11. | ||||||
|  |         :type message: bytes/bytearray/memoryview | ||||||
|  | 
 | ||||||
|  |         :Returns: A byte string, the ciphertext in which the message is encrypted. | ||||||
|  |             It is as long as the RSA modulus (in bytes). | ||||||
|  | 
 | ||||||
|  |         :Raises ValueError: | ||||||
|  |             If the RSA key length is not sufficiently long to deal with the given | ||||||
|  |             message. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         # See 7.2.1 in RFC8017 | ||||||
|  |         k = self._key.size_in_bytes() | ||||||
|  |         mLen = len(message) | ||||||
|  | 
 | ||||||
|  |         # Step 1 | ||||||
|  |         if mLen > k - 11: | ||||||
|  |             raise ValueError("Plaintext is too long.") | ||||||
|  |         # Step 2a | ||||||
|  |         ps = [] | ||||||
|  |         while len(ps) != k - mLen - 3: | ||||||
|  |             new_byte = self._randfunc(1) | ||||||
|  |             if bord(new_byte[0]) == 0x00: | ||||||
|  |                 continue | ||||||
|  |             ps.append(new_byte) | ||||||
|  |         ps = b"".join(ps) | ||||||
|  |         # Step 2b | ||||||
|  |         em = b'\x00\x02' + ps + b'\x00' + _copy_bytes(None, None, message) | ||||||
|  |         # Step 3a (OS2IP) | ||||||
|  |         em_int = bytes_to_long(em) | ||||||
|  |         # Step 3b (RSAEP) | ||||||
|  |         m_int = self._key._encrypt(em_int) | ||||||
|  |         # Step 3c (I2OSP) | ||||||
|  |         c = long_to_bytes(m_int, k) | ||||||
|  |         return c | ||||||
|  | 
 | ||||||
|  |     def decrypt(self, ciphertext, sentinel, expected_pt_len=0): | ||||||
|  |         r"""Decrypt a PKCS#1 v1.5 ciphertext. | ||||||
|  | 
 | ||||||
|  |         This is the function ``RSAES-PKCS1-V1_5-DECRYPT`` specified in | ||||||
|  |         `section 7.2.2 of RFC8017 | ||||||
|  |         <https://tools.ietf.org/html/rfc8017#page-29>`_. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |           ciphertext (bytes/bytearray/memoryview): | ||||||
|  |             The ciphertext that contains the message to recover. | ||||||
|  |           sentinel (any type): | ||||||
|  |             The object to return whenever an error is detected. | ||||||
|  |           expected_pt_len (integer): | ||||||
|  |             The length the plaintext is known to have, or 0 if unknown. | ||||||
|  | 
 | ||||||
|  |         Returns (byte string): | ||||||
|  |             It is either the original message or the ``sentinel`` (in case of an error). | ||||||
|  | 
 | ||||||
|  |         .. warning:: | ||||||
|  |             PKCS#1 v1.5 decryption is intrinsically vulnerable to timing | ||||||
|  |             attacks (see `Bleichenbacher's`__ attack). | ||||||
|  |             **Use PKCS#1 OAEP instead**. | ||||||
|  | 
 | ||||||
|  |             This implementation attempts to mitigate the risk | ||||||
|  |             with some constant-time constructs. | ||||||
|  |             However, they are not sufficient by themselves: the type of protocol you | ||||||
|  |             implement and the way you handle errors make a big difference. | ||||||
|  | 
 | ||||||
|  |             Specifically, you should make it very hard for the (malicious) | ||||||
|  |             party that submitted the ciphertext to quickly understand if decryption | ||||||
|  |             succeeded or not. | ||||||
|  | 
 | ||||||
|  |             To this end, it is recommended that your protocol only encrypts | ||||||
|  |             plaintexts of fixed length (``expected_pt_len``), | ||||||
|  |             that ``sentinel`` is a random byte string of the same length, | ||||||
|  |             and that processing continues for as long | ||||||
|  |             as possible even if ``sentinel`` is returned (i.e. in case of | ||||||
|  |             incorrect decryption). | ||||||
|  | 
 | ||||||
|  |             .. __: https://dx.doi.org/10.1007/BFb0055716 | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         # See 7.2.2 in RFC8017 | ||||||
|  |         k = self._key.size_in_bytes() | ||||||
|  | 
 | ||||||
|  |         # Step 1 | ||||||
|  |         if len(ciphertext) != k: | ||||||
|  |             raise ValueError("Ciphertext with incorrect length (not %d bytes)" % k) | ||||||
|  | 
 | ||||||
|  |         # Step 2a (O2SIP) | ||||||
|  |         ct_int = bytes_to_long(ciphertext) | ||||||
|  | 
 | ||||||
|  |         # Step 2b (RSADP) and Step 2c (I2OSP) | ||||||
|  |         em = self._key._decrypt_to_bytes(ct_int) | ||||||
|  | 
 | ||||||
|  |         # Step 3 (not constant time when the sentinel is not a byte string) | ||||||
|  |         output = bytes(bytearray(k)) | ||||||
|  |         if not is_bytes(sentinel) or len(sentinel) > k: | ||||||
|  |             size = pkcs1_decode(em, b'', expected_pt_len, output) | ||||||
|  |             if size < 0: | ||||||
|  |                 return sentinel | ||||||
|  |             else: | ||||||
|  |                 return output[size:] | ||||||
|  | 
 | ||||||
|  |         # Step 3 (somewhat constant time) | ||||||
|  |         size = pkcs1_decode(em, sentinel, expected_pt_len, output) | ||||||
|  |         return output[size:] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(key, randfunc=None): | ||||||
|  |     """Create a cipher for performing PKCS#1 v1.5 encryption or decryption. | ||||||
|  | 
 | ||||||
|  |     :param key: | ||||||
|  |       The key to use to encrypt or decrypt the message. This is a `Cryptodome.PublicKey.RSA` object. | ||||||
|  |       Decryption is only possible if *key* is a private RSA key. | ||||||
|  |     :type key: RSA key object | ||||||
|  | 
 | ||||||
|  |     :param randfunc: | ||||||
|  |       Function that return random bytes. | ||||||
|  |       The default is :func:`Cryptodome.Random.get_random_bytes`. | ||||||
|  |     :type randfunc: callable | ||||||
|  | 
 | ||||||
|  |     :returns: A cipher object `PKCS115_Cipher`. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     if randfunc is None: | ||||||
|  |         randfunc = Random.get_random_bytes | ||||||
|  |     return PKCS115_Cipher(key, randfunc) | ||||||
							
								
								
									
										20
									
								
								resources/lib/deps/Cryptodome/Cipher/PKCS1_v1_5.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								resources/lib/deps/Cryptodome/Cipher/PKCS1_v1_5.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | ||||||
|  | from typing import Callable, Union, Any, Optional, TypeVar | ||||||
|  | 
 | ||||||
|  | from Cryptodome.PublicKey.RSA import RsaKey | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | T = TypeVar('T') | ||||||
|  | 
 | ||||||
|  | class PKCS115_Cipher: | ||||||
|  |     def __init__(self, | ||||||
|  |                  key: RsaKey, | ||||||
|  |                  randfunc: Callable[[int], bytes]) -> None: ... | ||||||
|  |     def can_encrypt(self) -> bool: ... | ||||||
|  |     def can_decrypt(self) -> bool: ... | ||||||
|  |     def encrypt(self, message: Buffer) -> bytes: ... | ||||||
|  |     def decrypt(self, ciphertext: Buffer, | ||||||
|  |                 sentinel: T, | ||||||
|  |                 expected_pt_len: Optional[int] = ...) -> Union[bytes, T]: ... | ||||||
|  | 
 | ||||||
|  | def new(key: RsaKey, | ||||||
|  |         randfunc: Optional[Callable[[int], bytes]] = ...) -> PKCS115_Cipher: ... | ||||||
							
								
								
									
										167
									
								
								resources/lib/deps/Cryptodome/Cipher/Salsa20.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								resources/lib/deps/Cryptodome/Cipher/Salsa20.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,167 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | # Cipher/Salsa20.py : Salsa20 stream cipher (http://cr.yp.to/snuffle.html) | ||||||
|  | # | ||||||
|  | # Contributed by Fabrizio Tarizzo <fabrizio@fabriziotarizzo.org>. | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import _copy_bytes | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   create_string_buffer, | ||||||
|  |                                   get_raw_buffer, VoidPointer, | ||||||
|  |                                   SmartPointer, c_size_t, | ||||||
|  |                                   c_uint8_ptr, is_writeable_buffer) | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | 
 | ||||||
|  | _raw_salsa20_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._Salsa20", | ||||||
|  |                     """ | ||||||
|  |                     int Salsa20_stream_init(uint8_t *key, size_t keylen, | ||||||
|  |                                             uint8_t *nonce, size_t nonce_len, | ||||||
|  |                                             void **pSalsaState); | ||||||
|  |                     int Salsa20_stream_destroy(void *salsaState); | ||||||
|  |                     int Salsa20_stream_encrypt(void *salsaState, | ||||||
|  |                                                const uint8_t in[], | ||||||
|  |                                                uint8_t out[], size_t len); | ||||||
|  |                     """) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Salsa20Cipher: | ||||||
|  |     """Salsa20 cipher object. Do not create it directly. Use :py:func:`new` | ||||||
|  |     instead. | ||||||
|  | 
 | ||||||
|  |     :var nonce: The nonce with length 8 | ||||||
|  |     :vartype nonce: byte string | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, key, nonce): | ||||||
|  |         """Initialize a Salsa20 cipher object | ||||||
|  | 
 | ||||||
|  |         See also `new()` at the module level.""" | ||||||
|  | 
 | ||||||
|  |         if len(key) not in key_size: | ||||||
|  |             raise ValueError("Incorrect key length for Salsa20 (%d bytes)" % len(key)) | ||||||
|  | 
 | ||||||
|  |         if len(nonce) != 8: | ||||||
|  |             raise ValueError("Incorrect nonce length for Salsa20 (%d bytes)" % | ||||||
|  |                              len(nonce)) | ||||||
|  | 
 | ||||||
|  |         self.nonce = _copy_bytes(None, None, nonce) | ||||||
|  | 
 | ||||||
|  |         self._state = VoidPointer() | ||||||
|  |         result = _raw_salsa20_lib.Salsa20_stream_init( | ||||||
|  |                         c_uint8_ptr(key), | ||||||
|  |                         c_size_t(len(key)), | ||||||
|  |                         c_uint8_ptr(nonce), | ||||||
|  |                         c_size_t(len(nonce)), | ||||||
|  |                         self._state.address_of()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d instantiating a Salsa20 cipher") | ||||||
|  |         self._state = SmartPointer(self._state.get(), | ||||||
|  |                                    _raw_salsa20_lib.Salsa20_stream_destroy) | ||||||
|  | 
 | ||||||
|  |         self.block_size = 1 | ||||||
|  |         self.key_size = len(key) | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, plaintext, output=None): | ||||||
|  |         """Encrypt a piece of data. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |           plaintext(bytes/bytearray/memoryview): The data to encrypt, of any size. | ||||||
|  |         Keyword Args: | ||||||
|  |           output(bytes/bytearray/memoryview): The location where the ciphertext | ||||||
|  |             is written to. If ``None``, the ciphertext is returned. | ||||||
|  |         Returns: | ||||||
|  |           If ``output`` is ``None``, the ciphertext is returned as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  |          | ||||||
|  |         if output is None: | ||||||
|  |             ciphertext = create_string_buffer(len(plaintext)) | ||||||
|  |         else: | ||||||
|  |             ciphertext = output | ||||||
|  |             | ||||||
|  |             if not is_writeable_buffer(output): | ||||||
|  |                 raise TypeError("output must be a bytearray or a writeable memoryview") | ||||||
|  |          | ||||||
|  |             if len(plaintext) != len(output): | ||||||
|  |                 raise ValueError("output must have the same length as the input" | ||||||
|  |                                  "  (%d bytes)" % len(plaintext)) | ||||||
|  | 
 | ||||||
|  |         result = _raw_salsa20_lib.Salsa20_stream_encrypt( | ||||||
|  |                                          self._state.get(), | ||||||
|  |                                          c_uint8_ptr(plaintext), | ||||||
|  |                                          c_uint8_ptr(ciphertext), | ||||||
|  |                                          c_size_t(len(plaintext))) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while encrypting with Salsa20" % result) | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             return get_raw_buffer(ciphertext) | ||||||
|  |         else: | ||||||
|  |             return None | ||||||
|  | 
 | ||||||
|  |     def decrypt(self, ciphertext, output=None): | ||||||
|  |         """Decrypt a piece of data. | ||||||
|  |          | ||||||
|  |         Args: | ||||||
|  |           ciphertext(bytes/bytearray/memoryview): The data to decrypt, of any size. | ||||||
|  |         Keyword Args: | ||||||
|  |           output(bytes/bytearray/memoryview): The location where the plaintext | ||||||
|  |             is written to. If ``None``, the plaintext is returned. | ||||||
|  |         Returns: | ||||||
|  |           If ``output`` is ``None``, the plaintext is returned as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         try: | ||||||
|  |             return self.encrypt(ciphertext, output=output) | ||||||
|  |         except ValueError as e: | ||||||
|  |             raise ValueError(str(e).replace("enc", "dec")) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(key, nonce=None): | ||||||
|  |     """Create a new Salsa20 cipher | ||||||
|  | 
 | ||||||
|  |     :keyword key: The secret key to use. It must be 16 or 32 bytes long. | ||||||
|  |     :type key: bytes/bytearray/memoryview | ||||||
|  | 
 | ||||||
|  |     :keyword nonce: | ||||||
|  |         A value that must never be reused for any other encryption | ||||||
|  |         done with this key. It must be 8 bytes long. | ||||||
|  | 
 | ||||||
|  |         If not provided, a random byte string will be generated (you can read | ||||||
|  |         it back via the ``nonce`` attribute of the returned object). | ||||||
|  |     :type nonce: bytes/bytearray/memoryview | ||||||
|  | 
 | ||||||
|  |     :Return: a :class:`Cryptodome.Cipher.Salsa20.Salsa20Cipher` object | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     if nonce is None: | ||||||
|  |         nonce = get_random_bytes(8) | ||||||
|  | 
 | ||||||
|  |     return Salsa20Cipher(key, nonce) | ||||||
|  | 
 | ||||||
|  | # Size of a data block (in bytes) | ||||||
|  | block_size = 1 | ||||||
|  | 
 | ||||||
|  | # Size of a key (in bytes) | ||||||
|  | key_size = (16, 32) | ||||||
|  | 
 | ||||||
							
								
								
									
										26
									
								
								resources/lib/deps/Cryptodome/Cipher/Salsa20.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								resources/lib/deps/Cryptodome/Cipher/Salsa20.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | ||||||
|  | from typing import Union, Tuple, Optional, overload, Optional | ||||||
|  | 
 | ||||||
|  | Buffer = bytes|bytearray|memoryview | ||||||
|  | 
 | ||||||
|  | class Salsa20Cipher: | ||||||
|  |     nonce: bytes | ||||||
|  |     block_size: int | ||||||
|  |     key_size: int | ||||||
|  | 
 | ||||||
|  |     def __init__(self, | ||||||
|  |                  key: Buffer, | ||||||
|  |                  nonce: Buffer) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  | 
 | ||||||
|  | def new(key: Buffer, nonce: Optional[Buffer] = ...) -> Salsa20Cipher: ... | ||||||
|  | 
 | ||||||
|  | block_size: int | ||||||
|  | key_size: Tuple[int, int] | ||||||
|  | 
 | ||||||
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_ARC4.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_ARC4.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										131
									
								
								resources/lib/deps/Cryptodome/Cipher/_EKSBlowfish.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								resources/lib/deps/Cryptodome/Cipher/_EKSBlowfish.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,131 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2019, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | import sys | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Cipher import _create_cipher | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   VoidPointer, SmartPointer, c_size_t, | ||||||
|  |                                   c_uint8_ptr, c_uint) | ||||||
|  | 
 | ||||||
|  | _raw_blowfish_lib = load_pycryptodome_raw_lib( | ||||||
|  |         "Cryptodome.Cipher._raw_eksblowfish", | ||||||
|  |         """ | ||||||
|  |         int EKSBlowfish_start_operation(const uint8_t key[], | ||||||
|  |                                         size_t key_len, | ||||||
|  |                                         const uint8_t salt[16], | ||||||
|  |                                         size_t salt_len, | ||||||
|  |                                         unsigned cost, | ||||||
|  |                                         unsigned invert, | ||||||
|  |                                         void **pResult); | ||||||
|  |         int EKSBlowfish_encrypt(const void *state, | ||||||
|  |                                 const uint8_t *in, | ||||||
|  |                                 uint8_t *out, | ||||||
|  |                                 size_t data_len); | ||||||
|  |         int EKSBlowfish_decrypt(const void *state, | ||||||
|  |                                 const uint8_t *in, | ||||||
|  |                                 uint8_t *out, | ||||||
|  |                                 size_t data_len); | ||||||
|  |         int EKSBlowfish_stop_operation(void *state); | ||||||
|  |         """ | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_base_cipher(dict_parameters): | ||||||
|  |     """This method instantiates and returns a smart pointer to | ||||||
|  |     a low-level base cipher. It will absorb named parameters in | ||||||
|  |     the process.""" | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         key = dict_parameters.pop("key") | ||||||
|  |         salt = dict_parameters.pop("salt") | ||||||
|  |         cost = dict_parameters.pop("cost") | ||||||
|  |     except KeyError as e: | ||||||
|  |         raise TypeError("Missing EKSBlowfish parameter: " + str(e)) | ||||||
|  |     invert = dict_parameters.pop("invert", True) | ||||||
|  | 
 | ||||||
|  |     if len(key) not in key_size: | ||||||
|  |         raise ValueError("Incorrect EKSBlowfish key length (%d bytes)" % len(key)) | ||||||
|  | 
 | ||||||
|  |     start_operation = _raw_blowfish_lib.EKSBlowfish_start_operation | ||||||
|  |     stop_operation = _raw_blowfish_lib.EKSBlowfish_stop_operation | ||||||
|  | 
 | ||||||
|  |     void_p = VoidPointer() | ||||||
|  |     result = start_operation(c_uint8_ptr(key), | ||||||
|  |                              c_size_t(len(key)), | ||||||
|  |                              c_uint8_ptr(salt), | ||||||
|  |                              c_size_t(len(salt)), | ||||||
|  |                              c_uint(cost), | ||||||
|  |                              c_uint(int(invert)), | ||||||
|  |                              void_p.address_of()) | ||||||
|  |     if result: | ||||||
|  |         raise ValueError("Error %X while instantiating the EKSBlowfish cipher" | ||||||
|  |                          % result) | ||||||
|  |     return SmartPointer(void_p.get(), stop_operation) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(key, mode, salt, cost, invert): | ||||||
|  |     """Create a new EKSBlowfish cipher | ||||||
|  |      | ||||||
|  |     Args: | ||||||
|  | 
 | ||||||
|  |       key (bytes, bytearray, memoryview): | ||||||
|  |         The secret key to use in the symmetric cipher. | ||||||
|  |         Its length can vary from 0 to 72 bytes. | ||||||
|  | 
 | ||||||
|  |       mode (one of the supported ``MODE_*`` constants): | ||||||
|  |         The chaining mode to use for encryption or decryption. | ||||||
|  | 
 | ||||||
|  |       salt (bytes, bytearray, memoryview): | ||||||
|  |         The salt that bcrypt uses to thwart rainbow table attacks | ||||||
|  | 
 | ||||||
|  |       cost (integer): | ||||||
|  |         The complexity factor in bcrypt | ||||||
|  | 
 | ||||||
|  |       invert (bool): | ||||||
|  |         If ``False``, in the inner loop use ``ExpandKey`` first over the salt | ||||||
|  |         and then over the key, as defined in | ||||||
|  |         the `original bcrypt specification <https://www.usenix.org/legacy/events/usenix99/provos/provos_html/node4.html>`_. | ||||||
|  |         If ``True``, reverse the order, as in the first implementation of | ||||||
|  |         `bcrypt` in OpenBSD. | ||||||
|  | 
 | ||||||
|  |     :Return: an EKSBlowfish object | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     kwargs = { 'salt':salt, 'cost':cost, 'invert':invert } | ||||||
|  |     return _create_cipher(sys.modules[__name__], key, mode, **kwargs) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | MODE_ECB = 1 | ||||||
|  | 
 | ||||||
|  | # Size of a data block (in bytes) | ||||||
|  | block_size = 8 | ||||||
|  | # Size of a key (in bytes) | ||||||
|  | key_size = range(0, 72 + 1) | ||||||
							
								
								
									
										15
									
								
								resources/lib/deps/Cryptodome/Cipher/_EKSBlowfish.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								resources/lib/deps/Cryptodome/Cipher/_EKSBlowfish.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | ||||||
|  | from typing import Union, Iterable | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Cipher._mode_ecb import EcbMode | ||||||
|  | 
 | ||||||
|  | MODE_ECB: int | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | def new(key: Buffer, | ||||||
|  |         mode: int, | ||||||
|  | 	salt: Buffer, | ||||||
|  | 	cost: int) -> EcbMode: ... | ||||||
|  | 
 | ||||||
|  | block_size: int | ||||||
|  | key_size: Iterable[int] | ||||||
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_Salsa20.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_Salsa20.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										79
									
								
								resources/lib/deps/Cryptodome/Cipher/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								resources/lib/deps/Cryptodome/Cipher/__init__.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,79 @@ | ||||||
|  | # | ||||||
|  | # A block cipher is instantiated as a combination of: | ||||||
|  | # 1. A base cipher (such as AES) | ||||||
|  | # 2. A mode of operation (such as CBC) | ||||||
|  | # | ||||||
|  | # Both items are implemented as C modules. | ||||||
|  | # | ||||||
|  | # The API of #1 is (replace "AES" with the name of the actual cipher): | ||||||
|  | # - AES_start_operaion(key) --> base_cipher_state | ||||||
|  | # - AES_encrypt(base_cipher_state, in, out, length) | ||||||
|  | # - AES_decrypt(base_cipher_state, in, out, length) | ||||||
|  | # - AES_stop_operation(base_cipher_state) | ||||||
|  | # | ||||||
|  | # Where base_cipher_state is AES_State, a struct with BlockBase (set of | ||||||
|  | # pointers to encrypt/decrypt/stop) followed by cipher-specific data. | ||||||
|  | # | ||||||
|  | # The API of #2 is (replace "CBC" with the name of the actual mode): | ||||||
|  | # - CBC_start_operation(base_cipher_state) --> mode_state | ||||||
|  | # - CBC_encrypt(mode_state, in, out, length) | ||||||
|  | # - CBC_decrypt(mode_state, in, out, length) | ||||||
|  | # - CBC_stop_operation(mode_state) | ||||||
|  | # | ||||||
|  | # where mode_state is a a pointer to base_cipher_state plus mode-specific data. | ||||||
|  | 
 | ||||||
|  | import os | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Cipher._mode_ecb import _create_ecb_cipher | ||||||
|  | from Cryptodome.Cipher._mode_cbc import _create_cbc_cipher | ||||||
|  | from Cryptodome.Cipher._mode_cfb import _create_cfb_cipher | ||||||
|  | from Cryptodome.Cipher._mode_ofb import _create_ofb_cipher | ||||||
|  | from Cryptodome.Cipher._mode_ctr import _create_ctr_cipher | ||||||
|  | from Cryptodome.Cipher._mode_openpgp import _create_openpgp_cipher | ||||||
|  | from Cryptodome.Cipher._mode_ccm import _create_ccm_cipher | ||||||
|  | from Cryptodome.Cipher._mode_eax import _create_eax_cipher | ||||||
|  | from Cryptodome.Cipher._mode_siv import _create_siv_cipher | ||||||
|  | from Cryptodome.Cipher._mode_gcm import _create_gcm_cipher | ||||||
|  | from Cryptodome.Cipher._mode_ocb import _create_ocb_cipher | ||||||
|  | 
 | ||||||
|  | _modes = { 1:_create_ecb_cipher, | ||||||
|  |            2:_create_cbc_cipher, | ||||||
|  |            3:_create_cfb_cipher, | ||||||
|  |            5:_create_ofb_cipher, | ||||||
|  |            6:_create_ctr_cipher, | ||||||
|  |            7:_create_openpgp_cipher, | ||||||
|  |            9:_create_eax_cipher | ||||||
|  |            } | ||||||
|  | 
 | ||||||
|  | _extra_modes = { 8:_create_ccm_cipher, | ||||||
|  |                 10:_create_siv_cipher, | ||||||
|  |                 11:_create_gcm_cipher, | ||||||
|  |                 12:_create_ocb_cipher | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  | def _create_cipher(factory, key, mode, *args, **kwargs): | ||||||
|  | 
 | ||||||
|  |     kwargs["key"] = key | ||||||
|  | 
 | ||||||
|  |     modes = dict(_modes) | ||||||
|  |     if kwargs.pop("add_aes_modes", False): | ||||||
|  |         modes.update(_extra_modes) | ||||||
|  |     if not mode in modes: | ||||||
|  |         raise ValueError("Mode not supported") | ||||||
|  | 
 | ||||||
|  |     if args: | ||||||
|  |         if mode in (8, 9, 10, 11, 12): | ||||||
|  |             if len(args) > 1: | ||||||
|  |                 raise TypeError("Too many arguments for this mode") | ||||||
|  |             kwargs["nonce"] = args[0] | ||||||
|  |         elif mode in (2, 3, 5, 7): | ||||||
|  |             if len(args) > 1: | ||||||
|  |                 raise TypeError("Too many arguments for this mode") | ||||||
|  |             kwargs["IV"] = args[0] | ||||||
|  |         elif mode == 6: | ||||||
|  |             if len(args) > 0: | ||||||
|  |                 raise TypeError("Too many arguments for this mode") | ||||||
|  |         elif mode == 1: | ||||||
|  |             raise TypeError("IV is not meaningful for the ECB mode") | ||||||
|  | 
 | ||||||
|  |     return modes[mode](factory, **kwargs) | ||||||
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_chacha20.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_chacha20.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										293
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_cbc.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										293
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_cbc.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,293 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2014, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Ciphertext Block Chaining (CBC) mode. | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | __all__ = ['CbcMode'] | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import _copy_bytes | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, | ||||||
|  |                                   create_string_buffer, get_raw_buffer, | ||||||
|  |                                   SmartPointer, c_size_t, c_uint8_ptr, | ||||||
|  |                                   is_writeable_buffer) | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | 
 | ||||||
|  | raw_cbc_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_cbc", """ | ||||||
|  |                 int CBC_start_operation(void *cipher, | ||||||
|  |                                         const uint8_t iv[], | ||||||
|  |                                         size_t iv_len, | ||||||
|  |                                         void **pResult); | ||||||
|  |                 int CBC_encrypt(void *cbcState, | ||||||
|  |                                 const uint8_t *in, | ||||||
|  |                                 uint8_t *out, | ||||||
|  |                                 size_t data_len); | ||||||
|  |                 int CBC_decrypt(void *cbcState, | ||||||
|  |                                 const uint8_t *in, | ||||||
|  |                                 uint8_t *out, | ||||||
|  |                                 size_t data_len); | ||||||
|  |                 int CBC_stop_operation(void *state); | ||||||
|  |                 """ | ||||||
|  |                 ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class CbcMode(object): | ||||||
|  |     """*Cipher-Block Chaining (CBC)*. | ||||||
|  | 
 | ||||||
|  |     Each of the ciphertext blocks depends on the current | ||||||
|  |     and all previous plaintext blocks. | ||||||
|  | 
 | ||||||
|  |     An Initialization Vector (*IV*) is required. | ||||||
|  | 
 | ||||||
|  |     See `NIST SP800-38A`_ , Section 6.2 . | ||||||
|  | 
 | ||||||
|  |     .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf | ||||||
|  | 
 | ||||||
|  |     :undocumented: __init__ | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, block_cipher, iv): | ||||||
|  |         """Create a new block cipher, configured in CBC mode. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           block_cipher : C pointer | ||||||
|  |             A smart pointer to the low-level block cipher instance. | ||||||
|  | 
 | ||||||
|  |           iv : bytes/bytearray/memoryview | ||||||
|  |             The initialization vector to use for encryption or decryption. | ||||||
|  |             It is as long as the cipher block. | ||||||
|  | 
 | ||||||
|  |             **The IV must be unpredictable**. Ideally it is picked randomly. | ||||||
|  | 
 | ||||||
|  |             Reusing the *IV* for encryptions performed with the same key | ||||||
|  |             compromises confidentiality. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self._state = VoidPointer() | ||||||
|  |         result = raw_cbc_lib.CBC_start_operation(block_cipher.get(), | ||||||
|  |                                                  c_uint8_ptr(iv), | ||||||
|  |                                                  c_size_t(len(iv)), | ||||||
|  |                                                  self._state.address_of()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating the CBC mode" | ||||||
|  |                              % result) | ||||||
|  | 
 | ||||||
|  |         # Ensure that object disposal of this Python object will (eventually) | ||||||
|  |         # free the memory allocated by the raw library for the cipher mode | ||||||
|  |         self._state = SmartPointer(self._state.get(), | ||||||
|  |                                    raw_cbc_lib.CBC_stop_operation) | ||||||
|  | 
 | ||||||
|  |         # Memory allocated for the underlying block cipher is now owed | ||||||
|  |         # by the cipher mode | ||||||
|  |         block_cipher.release() | ||||||
|  | 
 | ||||||
|  |         self.block_size = len(iv) | ||||||
|  |         """The block size of the underlying cipher, in bytes.""" | ||||||
|  | 
 | ||||||
|  |         self.iv = _copy_bytes(None, None, iv) | ||||||
|  |         """The Initialization Vector originally used to create the object. | ||||||
|  |         The value does not change.""" | ||||||
|  | 
 | ||||||
|  |         self.IV = self.iv | ||||||
|  |         """Alias for `iv`""" | ||||||
|  | 
 | ||||||
|  |         self._next = ["encrypt", "decrypt"] | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, plaintext, output=None): | ||||||
|  |         """Encrypt data with the key and the parameters set at initialization. | ||||||
|  | 
 | ||||||
|  |         A cipher object is stateful: once you have encrypted a message | ||||||
|  |         you cannot encrypt (or decrypt) another message using the same | ||||||
|  |         object. | ||||||
|  | 
 | ||||||
|  |         The data to encrypt can be broken up in two or | ||||||
|  |         more pieces and `encrypt` can be called multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.encrypt(a) + c.encrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.encrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         That also means that you cannot reuse an object for encrypting | ||||||
|  |         or decrypting other data with the same key. | ||||||
|  | 
 | ||||||
|  |         This function does not add any padding to the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           plaintext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to encrypt. | ||||||
|  |             Its lenght must be multiple of the cipher block size. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the ciphertext must be written to. | ||||||
|  |             If ``None``, the ciphertext is returned. | ||||||
|  |         :Return: | ||||||
|  |           If ``output`` is ``None``, the ciphertext is returned as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "encrypt" not in self._next: | ||||||
|  |             raise TypeError("encrypt() cannot be called after decrypt()") | ||||||
|  |         self._next = ["encrypt"] | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             ciphertext = create_string_buffer(len(plaintext)) | ||||||
|  |         else: | ||||||
|  |             ciphertext = output | ||||||
|  | 
 | ||||||
|  |             if not is_writeable_buffer(output): | ||||||
|  |                 raise TypeError("output must be a bytearray or a writeable memoryview") | ||||||
|  | 
 | ||||||
|  |             if len(plaintext) != len(output): | ||||||
|  |                 raise ValueError("output must have the same length as the input" | ||||||
|  |                                  "  (%d bytes)" % len(plaintext)) | ||||||
|  | 
 | ||||||
|  |         result = raw_cbc_lib.CBC_encrypt(self._state.get(), | ||||||
|  |                                          c_uint8_ptr(plaintext), | ||||||
|  |                                          c_uint8_ptr(ciphertext), | ||||||
|  |                                          c_size_t(len(plaintext))) | ||||||
|  |         if result: | ||||||
|  |             if result == 3: | ||||||
|  |                 raise ValueError("Data must be padded to %d byte boundary in CBC mode" % self.block_size) | ||||||
|  |             raise ValueError("Error %d while encrypting in CBC mode" % result) | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             return get_raw_buffer(ciphertext) | ||||||
|  |         else: | ||||||
|  |             return None | ||||||
|  | 
 | ||||||
|  |     def decrypt(self, ciphertext, output=None): | ||||||
|  |         """Decrypt data with the key and the parameters set at initialization. | ||||||
|  | 
 | ||||||
|  |         A cipher object is stateful: once you have decrypted a message | ||||||
|  |         you cannot decrypt (or encrypt) another message with the same | ||||||
|  |         object. | ||||||
|  | 
 | ||||||
|  |         The data to decrypt can be broken up in two or | ||||||
|  |         more pieces and `decrypt` can be called multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.decrypt(a) + c.decrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.decrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         This function does not remove any padding from the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           ciphertext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to decrypt. | ||||||
|  |             Its length must be multiple of the cipher block size. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the plaintext must be written to. | ||||||
|  |             If ``None``, the plaintext is returned. | ||||||
|  |         :Return: | ||||||
|  |           If ``output`` is ``None``, the plaintext is returned as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "decrypt" not in self._next: | ||||||
|  |             raise TypeError("decrypt() cannot be called after encrypt()") | ||||||
|  |         self._next = ["decrypt"] | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             plaintext = create_string_buffer(len(ciphertext)) | ||||||
|  |         else: | ||||||
|  |             plaintext = output | ||||||
|  | 
 | ||||||
|  |             if not is_writeable_buffer(output): | ||||||
|  |                 raise TypeError("output must be a bytearray or a writeable memoryview") | ||||||
|  | 
 | ||||||
|  |             if len(ciphertext) != len(output): | ||||||
|  |                 raise ValueError("output must have the same length as the input" | ||||||
|  |                                  "  (%d bytes)" % len(plaintext)) | ||||||
|  | 
 | ||||||
|  |         result = raw_cbc_lib.CBC_decrypt(self._state.get(), | ||||||
|  |                                          c_uint8_ptr(ciphertext), | ||||||
|  |                                          c_uint8_ptr(plaintext), | ||||||
|  |                                          c_size_t(len(ciphertext))) | ||||||
|  |         if result: | ||||||
|  |             if result == 3: | ||||||
|  |                 raise ValueError("Data must be padded to %d byte boundary in CBC mode" % self.block_size) | ||||||
|  |             raise ValueError("Error %d while decrypting in CBC mode" % result) | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             return get_raw_buffer(plaintext) | ||||||
|  |         else: | ||||||
|  |             return None | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_cbc_cipher(factory, **kwargs): | ||||||
|  |     """Instantiate a cipher object that performs CBC encryption/decryption. | ||||||
|  | 
 | ||||||
|  |     :Parameters: | ||||||
|  |       factory : module | ||||||
|  |         The underlying block cipher, a module from ``Cryptodome.Cipher``. | ||||||
|  | 
 | ||||||
|  |     :Keywords: | ||||||
|  |       iv : bytes/bytearray/memoryview | ||||||
|  |         The IV to use for CBC. | ||||||
|  | 
 | ||||||
|  |       IV : bytes/bytearray/memoryview | ||||||
|  |         Alias for ``iv``. | ||||||
|  | 
 | ||||||
|  |     Any other keyword will be passed to the underlying block cipher. | ||||||
|  |     See the relevant documentation for details (at least ``key`` will need | ||||||
|  |     to be present). | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     cipher_state = factory._create_base_cipher(kwargs) | ||||||
|  |     iv = kwargs.pop("IV", None) | ||||||
|  |     IV = kwargs.pop("iv", None) | ||||||
|  | 
 | ||||||
|  |     if (None, None) == (iv, IV): | ||||||
|  |         iv = get_random_bytes(factory.block_size) | ||||||
|  |     if iv is not None: | ||||||
|  |         if IV is not None: | ||||||
|  |             raise TypeError("You must either use 'iv' or 'IV', not both") | ||||||
|  |     else: | ||||||
|  |         iv = IV | ||||||
|  | 
 | ||||||
|  |     if len(iv) != factory.block_size: | ||||||
|  |         raise ValueError("Incorrect IV length (it must be %d bytes long)" % | ||||||
|  |                          factory.block_size) | ||||||
|  | 
 | ||||||
|  |     if kwargs: | ||||||
|  |         raise TypeError("Unknown parameters for CBC: %s" % str(kwargs)) | ||||||
|  | 
 | ||||||
|  |     return CbcMode(cipher_state, iv) | ||||||
							
								
								
									
										25
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_cbc.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_cbc.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | ||||||
|  | from typing import Union, overload | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import SmartPointer | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | __all__ = ['CbcMode'] | ||||||
|  | 
 | ||||||
|  | class CbcMode(object): | ||||||
|  |     block_size: int | ||||||
|  |     iv: Buffer | ||||||
|  |     IV: Buffer | ||||||
|  | 
 | ||||||
|  |     def __init__(self, | ||||||
|  |                  block_cipher: SmartPointer, | ||||||
|  |                  iv: Buffer) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  | 
 | ||||||
							
								
								
									
										650
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ccm.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										650
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ccm.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,650 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2014, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Counter with CBC-MAC (CCM) mode. | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | __all__ = ['CcmMode'] | ||||||
|  | 
 | ||||||
|  | import struct | ||||||
|  | from binascii import unhexlify | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import (byte_string, bord, | ||||||
|  |                                    _copy_bytes) | ||||||
|  | from Cryptodome.Util._raw_api import is_writeable_buffer | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.strxor import strxor | ||||||
|  | from Cryptodome.Util.number import long_to_bytes | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Hash import BLAKE2s | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def enum(**enums): | ||||||
|  |     return type('Enum', (), enums) | ||||||
|  | 
 | ||||||
|  | MacStatus = enum(NOT_STARTED=0, PROCESSING_AUTH_DATA=1, PROCESSING_PLAINTEXT=2) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class CcmMode(object): | ||||||
|  |     """Counter with CBC-MAC (CCM). | ||||||
|  | 
 | ||||||
|  |     This is an Authenticated Encryption with Associated Data (`AEAD`_) mode. | ||||||
|  |     It provides both confidentiality and authenticity. | ||||||
|  | 
 | ||||||
|  |     The header of the message may be left in the clear, if needed, and it will | ||||||
|  |     still be subject to authentication. The decryption step tells the receiver | ||||||
|  |     if the message comes from a source that really knowns the secret key. | ||||||
|  |     Additionally, decryption detects if any part of the message - including the | ||||||
|  |     header - has been modified or corrupted. | ||||||
|  | 
 | ||||||
|  |     This mode requires a nonce. The nonce shall never repeat for two | ||||||
|  |     different messages encrypted with the same key, but it does not need | ||||||
|  |     to be random. | ||||||
|  |     Note that there is a trade-off between the size of the nonce and the | ||||||
|  |     maximum size of a single message you can encrypt. | ||||||
|  | 
 | ||||||
|  |     It is important to use a large nonce if the key is reused across several | ||||||
|  |     messages and the nonce is chosen randomly. | ||||||
|  | 
 | ||||||
|  |     It is acceptable to us a short nonce if the key is only used a few times or | ||||||
|  |     if the nonce is taken from a counter. | ||||||
|  | 
 | ||||||
|  |     The following table shows the trade-off when the nonce is chosen at | ||||||
|  |     random. The column on the left shows how many messages it takes | ||||||
|  |     for the keystream to repeat **on average**. In practice, you will want to | ||||||
|  |     stop using the key way before that. | ||||||
|  | 
 | ||||||
|  |     +--------------------+---------------+-------------------+ | ||||||
|  |     | Avg. # of messages |    nonce      |     Max. message  | | ||||||
|  |     | before keystream   |    size       |     size          | | ||||||
|  |     | repeats            |    (bytes)    |     (bytes)       | | ||||||
|  |     +====================+===============+===================+ | ||||||
|  |     |       2^52         |      13       |        64K        | | ||||||
|  |     +--------------------+---------------+-------------------+ | ||||||
|  |     |       2^48         |      12       |        16M        | | ||||||
|  |     +--------------------+---------------+-------------------+ | ||||||
|  |     |       2^44         |      11       |         4G        | | ||||||
|  |     +--------------------+---------------+-------------------+ | ||||||
|  |     |       2^40         |      10       |         1T        | | ||||||
|  |     +--------------------+---------------+-------------------+ | ||||||
|  |     |       2^36         |       9       |        64P        | | ||||||
|  |     +--------------------+---------------+-------------------+ | ||||||
|  |     |       2^32         |       8       |        16E        | | ||||||
|  |     +--------------------+---------------+-------------------+ | ||||||
|  | 
 | ||||||
|  |     This mode is only available for ciphers that operate on 128 bits blocks | ||||||
|  |     (e.g. AES but not TDES). | ||||||
|  | 
 | ||||||
|  |     See `NIST SP800-38C`_ or RFC3610_. | ||||||
|  | 
 | ||||||
|  |     .. _`NIST SP800-38C`: http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C.pdf | ||||||
|  |     .. _RFC3610: https://tools.ietf.org/html/rfc3610 | ||||||
|  |     .. _AEAD: http://blog.cryptographyengineering.com/2012/05/how-to-choose-authenticated-encryption.html | ||||||
|  | 
 | ||||||
|  |     :undocumented: __init__ | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, factory, key, nonce, mac_len, msg_len, assoc_len, | ||||||
|  |                  cipher_params): | ||||||
|  | 
 | ||||||
|  |         self.block_size = factory.block_size | ||||||
|  |         """The block size of the underlying cipher, in bytes.""" | ||||||
|  | 
 | ||||||
|  |         self.nonce = _copy_bytes(None, None, nonce) | ||||||
|  |         """The nonce used for this cipher instance""" | ||||||
|  | 
 | ||||||
|  |         self._factory = factory | ||||||
|  |         self._key = _copy_bytes(None, None, key) | ||||||
|  |         self._mac_len = mac_len | ||||||
|  |         self._msg_len = msg_len | ||||||
|  |         self._assoc_len = assoc_len | ||||||
|  |         self._cipher_params = cipher_params | ||||||
|  | 
 | ||||||
|  |         self._mac_tag = None  # Cache for MAC tag | ||||||
|  | 
 | ||||||
|  |         if self.block_size != 16: | ||||||
|  |             raise ValueError("CCM mode is only available for ciphers" | ||||||
|  |                              " that operate on 128 bits blocks") | ||||||
|  | 
 | ||||||
|  |         # MAC tag length (Tlen) | ||||||
|  |         if mac_len not in (4, 6, 8, 10, 12, 14, 16): | ||||||
|  |             raise ValueError("Parameter 'mac_len' must be even" | ||||||
|  |                              " and in the range 4..16 (not %d)" % mac_len) | ||||||
|  | 
 | ||||||
|  |         # Nonce value | ||||||
|  |         if not (nonce and 7 <= len(nonce) <= 13): | ||||||
|  |             raise ValueError("Length of parameter 'nonce' must be" | ||||||
|  |                              " in the range 7..13 bytes") | ||||||
|  | 
 | ||||||
|  |         # Create MAC object (the tag will be the last block | ||||||
|  |         # bytes worth of ciphertext) | ||||||
|  |         self._mac = self._factory.new(key, | ||||||
|  |                                       factory.MODE_CBC, | ||||||
|  |                                       iv=b'\x00' * 16, | ||||||
|  |                                       **cipher_params) | ||||||
|  |         self._mac_status = MacStatus.NOT_STARTED | ||||||
|  |         self._t = None | ||||||
|  | 
 | ||||||
|  |         # Allowed transitions after initialization | ||||||
|  |         self._next = ["update", "encrypt", "decrypt", | ||||||
|  |                       "digest", "verify"] | ||||||
|  | 
 | ||||||
|  |         # Cumulative lengths | ||||||
|  |         self._cumul_assoc_len = 0 | ||||||
|  |         self._cumul_msg_len = 0 | ||||||
|  | 
 | ||||||
|  |         # Cache for unaligned associated data/plaintext. | ||||||
|  |         # This is a list with byte strings, but when the MAC starts, | ||||||
|  |         # it will become a binary string no longer than the block size. | ||||||
|  |         self._cache = [] | ||||||
|  | 
 | ||||||
|  |         # Start CTR cipher, by formatting the counter (A.3) | ||||||
|  |         q = 15 - len(nonce)  # length of Q, the encoded message length | ||||||
|  |         self._cipher = self._factory.new(key, | ||||||
|  |                                          self._factory.MODE_CTR, | ||||||
|  |                                          nonce=struct.pack("B", q - 1) + self.nonce, | ||||||
|  |                                          **cipher_params) | ||||||
|  | 
 | ||||||
|  |         # S_0, step 6 in 6.1 for j=0 | ||||||
|  |         self._s_0 = self._cipher.encrypt(b'\x00' * 16) | ||||||
|  | 
 | ||||||
|  |         # Try to start the MAC | ||||||
|  |         if None not in (assoc_len, msg_len): | ||||||
|  |             self._start_mac() | ||||||
|  | 
 | ||||||
|  |     def _start_mac(self): | ||||||
|  | 
 | ||||||
|  |         assert(self._mac_status == MacStatus.NOT_STARTED) | ||||||
|  |         assert(None not in (self._assoc_len, self._msg_len)) | ||||||
|  |         assert(isinstance(self._cache, list)) | ||||||
|  | 
 | ||||||
|  |         # Formatting control information and nonce (A.2.1) | ||||||
|  |         q = 15 - len(self.nonce)  # length of Q, the encoded message length | ||||||
|  |         flags = (64 * (self._assoc_len > 0) + 8 * ((self._mac_len - 2) // 2) + | ||||||
|  |                  (q - 1)) | ||||||
|  |         b_0 = struct.pack("B", flags) + self.nonce + long_to_bytes(self._msg_len, q) | ||||||
|  | 
 | ||||||
|  |         # Formatting associated data (A.2.2) | ||||||
|  |         # Encoded 'a' is concatenated with the associated data 'A' | ||||||
|  |         assoc_len_encoded = b'' | ||||||
|  |         if self._assoc_len > 0: | ||||||
|  |             if self._assoc_len < (2 ** 16 - 2 ** 8): | ||||||
|  |                 enc_size = 2 | ||||||
|  |             elif self._assoc_len < (2 ** 32): | ||||||
|  |                 assoc_len_encoded = b'\xFF\xFE' | ||||||
|  |                 enc_size = 4 | ||||||
|  |             else: | ||||||
|  |                 assoc_len_encoded = b'\xFF\xFF' | ||||||
|  |                 enc_size = 8 | ||||||
|  |             assoc_len_encoded += long_to_bytes(self._assoc_len, enc_size) | ||||||
|  | 
 | ||||||
|  |         # b_0 and assoc_len_encoded must be processed first | ||||||
|  |         self._cache.insert(0, b_0) | ||||||
|  |         self._cache.insert(1, assoc_len_encoded) | ||||||
|  | 
 | ||||||
|  |         # Process all the data cached so far | ||||||
|  |         first_data_to_mac = b"".join(self._cache) | ||||||
|  |         self._cache = b"" | ||||||
|  |         self._mac_status = MacStatus.PROCESSING_AUTH_DATA | ||||||
|  |         self._update(first_data_to_mac) | ||||||
|  | 
 | ||||||
|  |     def _pad_cache_and_update(self): | ||||||
|  | 
 | ||||||
|  |         assert(self._mac_status != MacStatus.NOT_STARTED) | ||||||
|  |         assert(len(self._cache) < self.block_size) | ||||||
|  | 
 | ||||||
|  |         # Associated data is concatenated with the least number | ||||||
|  |         # of zero bytes (possibly none) to reach alignment to | ||||||
|  |         # the 16 byte boundary (A.2.3) | ||||||
|  |         len_cache = len(self._cache) | ||||||
|  |         if len_cache > 0: | ||||||
|  |             self._update(b'\x00' * (self.block_size - len_cache)) | ||||||
|  | 
 | ||||||
|  |     def update(self, assoc_data): | ||||||
|  |         """Protect associated data | ||||||
|  | 
 | ||||||
|  |         If there is any associated data, the caller has to invoke | ||||||
|  |         this function one or more times, before using | ||||||
|  |         ``decrypt`` or ``encrypt``. | ||||||
|  | 
 | ||||||
|  |         By *associated data* it is meant any data (e.g. packet headers) that | ||||||
|  |         will not be encrypted and will be transmitted in the clear. | ||||||
|  |         However, the receiver is still able to detect any modification to it. | ||||||
|  |         In CCM, the *associated data* is also called | ||||||
|  |         *additional authenticated data* (AAD). | ||||||
|  | 
 | ||||||
|  |         If there is no associated data, this method must not be called. | ||||||
|  | 
 | ||||||
|  |         The caller may split associated data in segments of any size, and | ||||||
|  |         invoke this method multiple times, each time with the next segment. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           assoc_data : bytes/bytearray/memoryview | ||||||
|  |             A piece of associated data. There are no restrictions on its size. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "update" not in self._next: | ||||||
|  |             raise TypeError("update() can only be called" | ||||||
|  |                             " immediately after initialization") | ||||||
|  | 
 | ||||||
|  |         self._next = ["update", "encrypt", "decrypt", | ||||||
|  |                       "digest", "verify"] | ||||||
|  | 
 | ||||||
|  |         self._cumul_assoc_len += len(assoc_data) | ||||||
|  |         if self._assoc_len is not None and \ | ||||||
|  |            self._cumul_assoc_len > self._assoc_len: | ||||||
|  |             raise ValueError("Associated data is too long") | ||||||
|  | 
 | ||||||
|  |         self._update(assoc_data) | ||||||
|  |         return self | ||||||
|  | 
 | ||||||
|  |     def _update(self, assoc_data_pt=b""): | ||||||
|  |         """Update the MAC with associated data or plaintext | ||||||
|  |            (without FSM checks)""" | ||||||
|  | 
 | ||||||
|  |         # If MAC has not started yet, we just park the data into a list. | ||||||
|  |         # If the data is mutable, we create a copy and store that instead. | ||||||
|  |         if self._mac_status == MacStatus.NOT_STARTED: | ||||||
|  |             if is_writeable_buffer(assoc_data_pt): | ||||||
|  |                 assoc_data_pt = _copy_bytes(None, None, assoc_data_pt) | ||||||
|  |             self._cache.append(assoc_data_pt) | ||||||
|  |             return | ||||||
|  | 
 | ||||||
|  |         assert(len(self._cache) < self.block_size) | ||||||
|  | 
 | ||||||
|  |         if len(self._cache) > 0: | ||||||
|  |             filler = min(self.block_size - len(self._cache), | ||||||
|  |                          len(assoc_data_pt)) | ||||||
|  |             self._cache += _copy_bytes(None, filler, assoc_data_pt) | ||||||
|  |             assoc_data_pt = _copy_bytes(filler, None, assoc_data_pt) | ||||||
|  | 
 | ||||||
|  |             if len(self._cache) < self.block_size: | ||||||
|  |                 return | ||||||
|  | 
 | ||||||
|  |             # The cache is exactly one block | ||||||
|  |             self._t = self._mac.encrypt(self._cache) | ||||||
|  |             self._cache = b"" | ||||||
|  | 
 | ||||||
|  |         update_len = len(assoc_data_pt) // self.block_size * self.block_size | ||||||
|  |         self._cache = _copy_bytes(update_len, None, assoc_data_pt) | ||||||
|  |         if update_len > 0: | ||||||
|  |             self._t = self._mac.encrypt(assoc_data_pt[:update_len])[-16:] | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, plaintext, output=None): | ||||||
|  |         """Encrypt data with the key set at initialization. | ||||||
|  | 
 | ||||||
|  |         A cipher object is stateful: once you have encrypted a message | ||||||
|  |         you cannot encrypt (or decrypt) another message using the same | ||||||
|  |         object. | ||||||
|  | 
 | ||||||
|  |         This method can be called only **once** if ``msg_len`` was | ||||||
|  |         not passed at initialization. | ||||||
|  | 
 | ||||||
|  |         If ``msg_len`` was given, the data to encrypt can be broken | ||||||
|  |         up in two or more pieces and `encrypt` can be called | ||||||
|  |         multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.encrypt(a) + c.encrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.encrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         This function does not add any padding to the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           plaintext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to encrypt. | ||||||
|  |             It can be of any length. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the ciphertext must be written to. | ||||||
|  |             If ``None``, the ciphertext is returned. | ||||||
|  |         :Return: | ||||||
|  |           If ``output`` is ``None``, the ciphertext as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "encrypt" not in self._next: | ||||||
|  |             raise TypeError("encrypt() can only be called after" | ||||||
|  |                             " initialization or an update()") | ||||||
|  |         self._next = ["encrypt", "digest"] | ||||||
|  | 
 | ||||||
|  |         # No more associated data allowed from now | ||||||
|  |         if self._assoc_len is None: | ||||||
|  |             assert(isinstance(self._cache, list)) | ||||||
|  |             self._assoc_len = sum([len(x) for x in self._cache]) | ||||||
|  |             if self._msg_len is not None: | ||||||
|  |                 self._start_mac() | ||||||
|  |         else: | ||||||
|  |             if self._cumul_assoc_len < self._assoc_len: | ||||||
|  |                 raise ValueError("Associated data is too short") | ||||||
|  | 
 | ||||||
|  |         # Only once piece of plaintext accepted if message length was | ||||||
|  |         # not declared in advance | ||||||
|  |         if self._msg_len is None: | ||||||
|  |             self._msg_len = len(plaintext) | ||||||
|  |             self._start_mac() | ||||||
|  |             self._next = ["digest"] | ||||||
|  | 
 | ||||||
|  |         self._cumul_msg_len += len(plaintext) | ||||||
|  |         if self._cumul_msg_len > self._msg_len: | ||||||
|  |             raise ValueError("Message is too long") | ||||||
|  | 
 | ||||||
|  |         if self._mac_status == MacStatus.PROCESSING_AUTH_DATA: | ||||||
|  |             # Associated data is concatenated with the least number | ||||||
|  |             # of zero bytes (possibly none) to reach alignment to | ||||||
|  |             # the 16 byte boundary (A.2.3) | ||||||
|  |             self._pad_cache_and_update() | ||||||
|  |             self._mac_status = MacStatus.PROCESSING_PLAINTEXT | ||||||
|  | 
 | ||||||
|  |         self._update(plaintext) | ||||||
|  |         return self._cipher.encrypt(plaintext, output=output) | ||||||
|  | 
 | ||||||
|  |     def decrypt(self, ciphertext, output=None): | ||||||
|  |         """Decrypt data with the key set at initialization. | ||||||
|  | 
 | ||||||
|  |         A cipher object is stateful: once you have decrypted a message | ||||||
|  |         you cannot decrypt (or encrypt) another message with the same | ||||||
|  |         object. | ||||||
|  | 
 | ||||||
|  |         This method can be called only **once** if ``msg_len`` was | ||||||
|  |         not passed at initialization. | ||||||
|  | 
 | ||||||
|  |         If ``msg_len`` was given, the data to decrypt can be | ||||||
|  |         broken up in two or more pieces and `decrypt` can be | ||||||
|  |         called multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.decrypt(a) + c.decrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.decrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         This function does not remove any padding from the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           ciphertext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to decrypt. | ||||||
|  |             It can be of any length. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the plaintext must be written to. | ||||||
|  |             If ``None``, the plaintext is returned. | ||||||
|  |         :Return: | ||||||
|  |           If ``output`` is ``None``, the plaintext as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "decrypt" not in self._next: | ||||||
|  |             raise TypeError("decrypt() can only be called" | ||||||
|  |                             " after initialization or an update()") | ||||||
|  |         self._next = ["decrypt", "verify"] | ||||||
|  | 
 | ||||||
|  |         # No more associated data allowed from now | ||||||
|  |         if self._assoc_len is None: | ||||||
|  |             assert(isinstance(self._cache, list)) | ||||||
|  |             self._assoc_len = sum([len(x) for x in self._cache]) | ||||||
|  |             if self._msg_len is not None: | ||||||
|  |                 self._start_mac() | ||||||
|  |         else: | ||||||
|  |             if self._cumul_assoc_len < self._assoc_len: | ||||||
|  |                 raise ValueError("Associated data is too short") | ||||||
|  | 
 | ||||||
|  |         # Only once piece of ciphertext accepted if message length was | ||||||
|  |         # not declared in advance | ||||||
|  |         if self._msg_len is None: | ||||||
|  |             self._msg_len = len(ciphertext) | ||||||
|  |             self._start_mac() | ||||||
|  |             self._next = ["verify"] | ||||||
|  | 
 | ||||||
|  |         self._cumul_msg_len += len(ciphertext) | ||||||
|  |         if self._cumul_msg_len > self._msg_len: | ||||||
|  |             raise ValueError("Message is too long") | ||||||
|  | 
 | ||||||
|  |         if self._mac_status == MacStatus.PROCESSING_AUTH_DATA: | ||||||
|  |             # Associated data is concatenated with the least number | ||||||
|  |             # of zero bytes (possibly none) to reach alignment to | ||||||
|  |             # the 16 byte boundary (A.2.3) | ||||||
|  |             self._pad_cache_and_update() | ||||||
|  |             self._mac_status = MacStatus.PROCESSING_PLAINTEXT | ||||||
|  | 
 | ||||||
|  |         # Encrypt is equivalent to decrypt with the CTR mode | ||||||
|  |         plaintext = self._cipher.encrypt(ciphertext, output=output) | ||||||
|  |         if output is None: | ||||||
|  |             self._update(plaintext) | ||||||
|  |         else: | ||||||
|  |             self._update(output) | ||||||
|  |         return plaintext | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         """Compute the *binary* MAC tag. | ||||||
|  | 
 | ||||||
|  |         The caller invokes this function at the very end. | ||||||
|  | 
 | ||||||
|  |         This method returns the MAC that shall be sent to the receiver, | ||||||
|  |         together with the ciphertext. | ||||||
|  | 
 | ||||||
|  |         :Return: the MAC, as a byte string. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "digest" not in self._next: | ||||||
|  |             raise TypeError("digest() cannot be called when decrypting" | ||||||
|  |                             " or validating a message") | ||||||
|  |         self._next = ["digest"] | ||||||
|  |         return self._digest() | ||||||
|  | 
 | ||||||
|  |     def _digest(self): | ||||||
|  |         if self._mac_tag: | ||||||
|  |             return self._mac_tag | ||||||
|  | 
 | ||||||
|  |         if self._assoc_len is None: | ||||||
|  |             assert(isinstance(self._cache, list)) | ||||||
|  |             self._assoc_len = sum([len(x) for x in self._cache]) | ||||||
|  |             if self._msg_len is not None: | ||||||
|  |                 self._start_mac() | ||||||
|  |         else: | ||||||
|  |             if self._cumul_assoc_len < self._assoc_len: | ||||||
|  |                 raise ValueError("Associated data is too short") | ||||||
|  | 
 | ||||||
|  |         if self._msg_len is None: | ||||||
|  |             self._msg_len = 0 | ||||||
|  |             self._start_mac() | ||||||
|  | 
 | ||||||
|  |         if self._cumul_msg_len != self._msg_len: | ||||||
|  |             raise ValueError("Message is too short") | ||||||
|  | 
 | ||||||
|  |         # Both associated data and payload are concatenated with the least | ||||||
|  |         # number of zero bytes (possibly none) that align it to the | ||||||
|  |         # 16 byte boundary (A.2.2 and A.2.3) | ||||||
|  |         self._pad_cache_and_update() | ||||||
|  | 
 | ||||||
|  |         # Step 8 in 6.1 (T xor MSB_Tlen(S_0)) | ||||||
|  |         self._mac_tag = strxor(self._t, self._s_0)[:self._mac_len] | ||||||
|  | 
 | ||||||
|  |         return self._mac_tag | ||||||
|  | 
 | ||||||
|  |     def hexdigest(self): | ||||||
|  |         """Compute the *printable* MAC tag. | ||||||
|  | 
 | ||||||
|  |         This method is like `digest`. | ||||||
|  | 
 | ||||||
|  |         :Return: the MAC, as a hexadecimal string. | ||||||
|  |         """ | ||||||
|  |         return "".join(["%02x" % bord(x) for x in self.digest()]) | ||||||
|  | 
 | ||||||
|  |     def verify(self, received_mac_tag): | ||||||
|  |         """Validate the *binary* MAC tag. | ||||||
|  | 
 | ||||||
|  |         The caller invokes this function at the very end. | ||||||
|  | 
 | ||||||
|  |         This method checks if the decrypted message is indeed valid | ||||||
|  |         (that is, if the key is correct) and it has not been | ||||||
|  |         tampered with while in transit. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           received_mac_tag : bytes/bytearray/memoryview | ||||||
|  |             This is the *binary* MAC, as received from the sender. | ||||||
|  |         :Raises ValueError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "verify" not in self._next: | ||||||
|  |             raise TypeError("verify() cannot be called" | ||||||
|  |                             " when encrypting a message") | ||||||
|  |         self._next = ["verify"] | ||||||
|  | 
 | ||||||
|  |         self._digest() | ||||||
|  |         secret = get_random_bytes(16) | ||||||
|  | 
 | ||||||
|  |         mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=self._mac_tag) | ||||||
|  |         mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=received_mac_tag) | ||||||
|  | 
 | ||||||
|  |         if mac1.digest() != mac2.digest(): | ||||||
|  |             raise ValueError("MAC check failed") | ||||||
|  | 
 | ||||||
|  |     def hexverify(self, hex_mac_tag): | ||||||
|  |         """Validate the *printable* MAC tag. | ||||||
|  | 
 | ||||||
|  |         This method is like `verify`. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           hex_mac_tag : string | ||||||
|  |             This is the *printable* MAC, as received from the sender. | ||||||
|  |         :Raises ValueError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self.verify(unhexlify(hex_mac_tag)) | ||||||
|  | 
 | ||||||
|  |     def encrypt_and_digest(self, plaintext, output=None): | ||||||
|  |         """Perform encrypt() and digest() in one step. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           plaintext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to encrypt. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the ciphertext must be written to. | ||||||
|  |             If ``None``, the ciphertext is returned. | ||||||
|  |         :Return: | ||||||
|  |             a tuple with two items: | ||||||
|  | 
 | ||||||
|  |             - the ciphertext, as ``bytes`` | ||||||
|  |             - the MAC tag, as ``bytes`` | ||||||
|  | 
 | ||||||
|  |             The first item becomes ``None`` when the ``output`` parameter | ||||||
|  |             specified a location for the result. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         return self.encrypt(plaintext, output=output), self.digest() | ||||||
|  | 
 | ||||||
|  |     def decrypt_and_verify(self, ciphertext, received_mac_tag, output=None): | ||||||
|  |         """Perform decrypt() and verify() in one step. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           ciphertext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to decrypt. | ||||||
|  |           received_mac_tag : bytes/bytearray/memoryview | ||||||
|  |             This is the *binary* MAC, as received from the sender. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the plaintext must be written to. | ||||||
|  |             If ``None``, the plaintext is returned. | ||||||
|  |         :Return: the plaintext as ``bytes`` or ``None`` when the ``output`` | ||||||
|  |             parameter specified a location for the result. | ||||||
|  |         :Raises ValueError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         plaintext = self.decrypt(ciphertext, output=output) | ||||||
|  |         self.verify(received_mac_tag) | ||||||
|  |         return plaintext | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_ccm_cipher(factory, **kwargs): | ||||||
|  |     """Create a new block cipher, configured in CCM mode. | ||||||
|  | 
 | ||||||
|  |     :Parameters: | ||||||
|  |       factory : module | ||||||
|  |         A symmetric cipher module from `Cryptodome.Cipher` (like | ||||||
|  |         `Cryptodome.Cipher.AES`). | ||||||
|  | 
 | ||||||
|  |     :Keywords: | ||||||
|  |       key : bytes/bytearray/memoryview | ||||||
|  |         The secret key to use in the symmetric cipher. | ||||||
|  | 
 | ||||||
|  |       nonce : bytes/bytearray/memoryview | ||||||
|  |         A value that must never be reused for any other encryption. | ||||||
|  | 
 | ||||||
|  |         Its length must be in the range ``[7..13]``. | ||||||
|  |         11 or 12 bytes are reasonable values in general. Bear in | ||||||
|  |         mind that with CCM there is a trade-off between nonce length and | ||||||
|  |         maximum message size. | ||||||
|  | 
 | ||||||
|  |         If not specified, a 11 byte long random string is used. | ||||||
|  | 
 | ||||||
|  |       mac_len : integer | ||||||
|  |         Length of the MAC, in bytes. It must be even and in | ||||||
|  |         the range ``[4..16]``. The default is 16. | ||||||
|  | 
 | ||||||
|  |       msg_len : integer | ||||||
|  |         Length of the message to (de)cipher. | ||||||
|  |         If not specified, ``encrypt`` or ``decrypt`` may only be called once. | ||||||
|  | 
 | ||||||
|  |       assoc_len : integer | ||||||
|  |         Length of the associated data. | ||||||
|  |         If not specified, all data is internally buffered. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         key = key = kwargs.pop("key") | ||||||
|  |     except KeyError as e: | ||||||
|  |         raise TypeError("Missing parameter: " + str(e)) | ||||||
|  | 
 | ||||||
|  |     nonce = kwargs.pop("nonce", None)  # N | ||||||
|  |     if nonce is None: | ||||||
|  |         nonce = get_random_bytes(11) | ||||||
|  |     mac_len = kwargs.pop("mac_len", factory.block_size) | ||||||
|  |     msg_len = kwargs.pop("msg_len", None)      # p | ||||||
|  |     assoc_len = kwargs.pop("assoc_len", None)  # a | ||||||
|  |     cipher_params = dict(kwargs) | ||||||
|  | 
 | ||||||
|  |     return CcmMode(factory, key, nonce, mac_len, msg_len, | ||||||
|  |                    assoc_len, cipher_params) | ||||||
							
								
								
									
										47
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ccm.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ccm.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,47 @@ | ||||||
|  | from types import ModuleType | ||||||
|  | from typing import Union, overload, Dict, Tuple, Optional | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | __all__ = ['CcmMode'] | ||||||
|  | 
 | ||||||
|  | class CcmMode(object): | ||||||
|  |     block_size: int | ||||||
|  |     nonce: bytes | ||||||
|  | 
 | ||||||
|  |     def __init__(self, | ||||||
|  |                  factory: ModuleType, | ||||||
|  |                  key: Buffer, | ||||||
|  |                  nonce: Buffer, | ||||||
|  |                  mac_len: int, | ||||||
|  |                  msg_len: int, | ||||||
|  |                  assoc_len: int, | ||||||
|  |                  cipher_params: Dict) -> None: ... | ||||||
|  |      | ||||||
|  |     def update(self, assoc_data: Buffer) -> CcmMode: ... | ||||||
|  | 
 | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  | 
 | ||||||
|  |     def digest(self) -> bytes: ... | ||||||
|  |     def hexdigest(self) -> str: ... | ||||||
|  |     def verify(self, received_mac_tag: Buffer) -> None: ... | ||||||
|  |     def hexverify(self, hex_mac_tag: str) -> None: ... | ||||||
|  | 
 | ||||||
|  |     @overload | ||||||
|  |     def encrypt_and_digest(self, | ||||||
|  |                            plaintext: Buffer) -> Tuple[bytes, bytes]: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt_and_digest(self, | ||||||
|  |                            plaintext: Buffer, | ||||||
|  |                            output: Buffer) -> Tuple[None, bytes]: ... | ||||||
|  |     def decrypt_and_verify(self, | ||||||
|  |                            ciphertext: Buffer, | ||||||
|  |                            received_mac_tag: Buffer, | ||||||
|  |                            output: Optional[Union[bytearray, memoryview]] = ...) -> bytes: ... | ||||||
							
								
								
									
										293
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_cfb.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										293
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_cfb.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,293 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | #  Cipher/mode_cfb.py : CFB mode | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Counter Feedback (CFB) mode. | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | __all__ = ['CfbMode'] | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import _copy_bytes | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, | ||||||
|  |                                   create_string_buffer, get_raw_buffer, | ||||||
|  |                                   SmartPointer, c_size_t, c_uint8_ptr, | ||||||
|  |                                   is_writeable_buffer) | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | 
 | ||||||
|  | raw_cfb_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_cfb",""" | ||||||
|  |                     int CFB_start_operation(void *cipher, | ||||||
|  |                                             const uint8_t iv[], | ||||||
|  |                                             size_t iv_len, | ||||||
|  |                                             size_t segment_len, /* In bytes */ | ||||||
|  |                                             void **pResult); | ||||||
|  |                     int CFB_encrypt(void *cfbState, | ||||||
|  |                                     const uint8_t *in, | ||||||
|  |                                     uint8_t *out, | ||||||
|  |                                     size_t data_len); | ||||||
|  |                     int CFB_decrypt(void *cfbState, | ||||||
|  |                                     const uint8_t *in, | ||||||
|  |                                     uint8_t *out, | ||||||
|  |                                     size_t data_len); | ||||||
|  |                     int CFB_stop_operation(void *state);""" | ||||||
|  |                     ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class CfbMode(object): | ||||||
|  |     """*Cipher FeedBack (CFB)*. | ||||||
|  | 
 | ||||||
|  |     This mode is similar to CFB, but it transforms | ||||||
|  |     the underlying block cipher into a stream cipher. | ||||||
|  | 
 | ||||||
|  |     Plaintext and ciphertext are processed in *segments* | ||||||
|  |     of **s** bits. The mode is therefore sometimes | ||||||
|  |     labelled **s**-bit CFB. | ||||||
|  | 
 | ||||||
|  |     An Initialization Vector (*IV*) is required. | ||||||
|  | 
 | ||||||
|  |     See `NIST SP800-38A`_ , Section 6.3. | ||||||
|  | 
 | ||||||
|  |     .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf | ||||||
|  | 
 | ||||||
|  |     :undocumented: __init__ | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, block_cipher, iv, segment_size): | ||||||
|  |         """Create a new block cipher, configured in CFB mode. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           block_cipher : C pointer | ||||||
|  |             A smart pointer to the low-level block cipher instance. | ||||||
|  | 
 | ||||||
|  |           iv : bytes/bytearray/memoryview | ||||||
|  |             The initialization vector to use for encryption or decryption. | ||||||
|  |             It is as long as the cipher block. | ||||||
|  | 
 | ||||||
|  |             **The IV must be unpredictable**. Ideally it is picked randomly. | ||||||
|  | 
 | ||||||
|  |             Reusing the *IV* for encryptions performed with the same key | ||||||
|  |             compromises confidentiality. | ||||||
|  | 
 | ||||||
|  |           segment_size : integer | ||||||
|  |             The number of bytes the plaintext and ciphertext are segmented in. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self._state = VoidPointer() | ||||||
|  |         result = raw_cfb_lib.CFB_start_operation(block_cipher.get(), | ||||||
|  |                                                  c_uint8_ptr(iv), | ||||||
|  |                                                  c_size_t(len(iv)), | ||||||
|  |                                                  c_size_t(segment_size), | ||||||
|  |                                                  self._state.address_of()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating the CFB mode" % result) | ||||||
|  | 
 | ||||||
|  |         # Ensure that object disposal of this Python object will (eventually) | ||||||
|  |         # free the memory allocated by the raw library for the cipher mode | ||||||
|  |         self._state = SmartPointer(self._state.get(), | ||||||
|  |                                    raw_cfb_lib.CFB_stop_operation) | ||||||
|  | 
 | ||||||
|  |         # Memory allocated for the underlying block cipher is now owed | ||||||
|  |         # by the cipher mode | ||||||
|  |         block_cipher.release() | ||||||
|  | 
 | ||||||
|  |         self.block_size = len(iv) | ||||||
|  |         """The block size of the underlying cipher, in bytes.""" | ||||||
|  | 
 | ||||||
|  |         self.iv = _copy_bytes(None, None, iv) | ||||||
|  |         """The Initialization Vector originally used to create the object. | ||||||
|  |         The value does not change.""" | ||||||
|  | 
 | ||||||
|  |         self.IV = self.iv | ||||||
|  |         """Alias for `iv`""" | ||||||
|  | 
 | ||||||
|  |         self._next = ["encrypt", "decrypt"] | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, plaintext, output=None): | ||||||
|  |         """Encrypt data with the key and the parameters set at initialization. | ||||||
|  | 
 | ||||||
|  |         A cipher object is stateful: once you have encrypted a message | ||||||
|  |         you cannot encrypt (or decrypt) another message using the same | ||||||
|  |         object. | ||||||
|  | 
 | ||||||
|  |         The data to encrypt can be broken up in two or | ||||||
|  |         more pieces and `encrypt` can be called multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.encrypt(a) + c.encrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.encrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         This function does not add any padding to the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           plaintext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to encrypt. | ||||||
|  |             It can be of any length. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the ciphertext must be written to. | ||||||
|  |             If ``None``, the ciphertext is returned. | ||||||
|  |         :Return: | ||||||
|  |           If ``output`` is ``None``, the ciphertext is returned as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "encrypt" not in self._next: | ||||||
|  |             raise TypeError("encrypt() cannot be called after decrypt()") | ||||||
|  |         self._next = ["encrypt"] | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             ciphertext = create_string_buffer(len(plaintext)) | ||||||
|  |         else: | ||||||
|  |             ciphertext = output | ||||||
|  | 
 | ||||||
|  |             if not is_writeable_buffer(output): | ||||||
|  |                 raise TypeError("output must be a bytearray or a writeable memoryview") | ||||||
|  | 
 | ||||||
|  |             if len(plaintext) != len(output): | ||||||
|  |                 raise ValueError("output must have the same length as the input" | ||||||
|  |                                  "  (%d bytes)" % len(plaintext)) | ||||||
|  | 
 | ||||||
|  |         result = raw_cfb_lib.CFB_encrypt(self._state.get(), | ||||||
|  |                                          c_uint8_ptr(plaintext), | ||||||
|  |                                          c_uint8_ptr(ciphertext), | ||||||
|  |                                          c_size_t(len(plaintext))) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while encrypting in CFB mode" % result) | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             return get_raw_buffer(ciphertext) | ||||||
|  |         else: | ||||||
|  |             return None | ||||||
|  | 
 | ||||||
|  |     def decrypt(self, ciphertext,  output=None): | ||||||
|  |         """Decrypt data with the key and the parameters set at initialization. | ||||||
|  | 
 | ||||||
|  |         A cipher object is stateful: once you have decrypted a message | ||||||
|  |         you cannot decrypt (or encrypt) another message with the same | ||||||
|  |         object. | ||||||
|  | 
 | ||||||
|  |         The data to decrypt can be broken up in two or | ||||||
|  |         more pieces and `decrypt` can be called multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.decrypt(a) + c.decrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.decrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         This function does not remove any padding from the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           ciphertext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to decrypt. | ||||||
|  |             It can be of any length. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the plaintext must be written to. | ||||||
|  |             If ``None``, the plaintext is returned. | ||||||
|  |         :Return: | ||||||
|  |           If ``output`` is ``None``, the plaintext is returned as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "decrypt" not in self._next: | ||||||
|  |             raise TypeError("decrypt() cannot be called after encrypt()") | ||||||
|  |         self._next = ["decrypt"] | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             plaintext = create_string_buffer(len(ciphertext)) | ||||||
|  |         else: | ||||||
|  |             plaintext = output | ||||||
|  | 
 | ||||||
|  |             if not is_writeable_buffer(output): | ||||||
|  |                 raise TypeError("output must be a bytearray or a writeable memoryview") | ||||||
|  | 
 | ||||||
|  |             if len(ciphertext) != len(output): | ||||||
|  |                 raise ValueError("output must have the same length as the input" | ||||||
|  |                                  "  (%d bytes)" % len(plaintext)) | ||||||
|  | 
 | ||||||
|  |         result = raw_cfb_lib.CFB_decrypt(self._state.get(), | ||||||
|  |                                          c_uint8_ptr(ciphertext), | ||||||
|  |                                          c_uint8_ptr(plaintext), | ||||||
|  |                                          c_size_t(len(ciphertext))) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while decrypting in CFB mode" % result) | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             return get_raw_buffer(plaintext) | ||||||
|  |         else: | ||||||
|  |             return None | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_cfb_cipher(factory, **kwargs): | ||||||
|  |     """Instantiate a cipher object that performs CFB encryption/decryption. | ||||||
|  | 
 | ||||||
|  |     :Parameters: | ||||||
|  |       factory : module | ||||||
|  |         The underlying block cipher, a module from ``Cryptodome.Cipher``. | ||||||
|  | 
 | ||||||
|  |     :Keywords: | ||||||
|  |       iv : bytes/bytearray/memoryview | ||||||
|  |         The IV to use for CFB. | ||||||
|  | 
 | ||||||
|  |       IV : bytes/bytearray/memoryview | ||||||
|  |         Alias for ``iv``. | ||||||
|  | 
 | ||||||
|  |       segment_size : integer | ||||||
|  |         The number of bit the plaintext and ciphertext are segmented in. | ||||||
|  |         If not present, the default is 8. | ||||||
|  | 
 | ||||||
|  |     Any other keyword will be passed to the underlying block cipher. | ||||||
|  |     See the relevant documentation for details (at least ``key`` will need | ||||||
|  |     to be present). | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     cipher_state = factory._create_base_cipher(kwargs) | ||||||
|  | 
 | ||||||
|  |     iv = kwargs.pop("IV", None) | ||||||
|  |     IV = kwargs.pop("iv", None) | ||||||
|  | 
 | ||||||
|  |     if (None, None) == (iv, IV): | ||||||
|  |         iv = get_random_bytes(factory.block_size) | ||||||
|  |     if iv is not None: | ||||||
|  |         if IV is not None: | ||||||
|  |             raise TypeError("You must either use 'iv' or 'IV', not both") | ||||||
|  |     else: | ||||||
|  |         iv = IV | ||||||
|  | 
 | ||||||
|  |     if len(iv) != factory.block_size: | ||||||
|  |         raise ValueError("Incorrect IV length (it must be %d bytes long)" % | ||||||
|  |                 factory.block_size) | ||||||
|  | 
 | ||||||
|  |     segment_size_bytes, rem = divmod(kwargs.pop("segment_size", 8), 8) | ||||||
|  |     if segment_size_bytes == 0 or rem != 0: | ||||||
|  |         raise ValueError("'segment_size' must be positive and multiple of 8 bits") | ||||||
|  | 
 | ||||||
|  |     if kwargs: | ||||||
|  |         raise TypeError("Unknown parameters for CFB: %s" % str(kwargs)) | ||||||
|  |     return CfbMode(cipher_state, iv, segment_size_bytes) | ||||||
							
								
								
									
										26
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_cfb.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_cfb.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | ||||||
|  | from typing import Union, overload | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import SmartPointer | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | __all__ = ['CfbMode'] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class CfbMode(object): | ||||||
|  |     block_size: int | ||||||
|  |     iv: Buffer | ||||||
|  |     IV: Buffer | ||||||
|  |      | ||||||
|  |     def __init__(self, | ||||||
|  |                  block_cipher: SmartPointer, | ||||||
|  |                  iv: Buffer, | ||||||
|  |                  segment_size: int) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
							
								
								
									
										393
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ctr.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										393
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ctr.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,393 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | #  Cipher/mode_ctr.py : CTR mode | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Counter (CTR) mode. | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | __all__ = ['CtrMode'] | ||||||
|  | 
 | ||||||
|  | import struct | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, | ||||||
|  |                                   create_string_buffer, get_raw_buffer, | ||||||
|  |                                   SmartPointer, c_size_t, c_uint8_ptr, | ||||||
|  |                                   is_writeable_buffer) | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | from Cryptodome.Util.py3compat import _copy_bytes, is_native_int | ||||||
|  | from Cryptodome.Util.number import long_to_bytes | ||||||
|  | 
 | ||||||
|  | raw_ctr_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_ctr", """ | ||||||
|  |                     int CTR_start_operation(void *cipher, | ||||||
|  |                                             uint8_t   initialCounterBlock[], | ||||||
|  |                                             size_t    initialCounterBlock_len, | ||||||
|  |                                             size_t    prefix_len, | ||||||
|  |                                             unsigned  counter_len, | ||||||
|  |                                             unsigned  littleEndian, | ||||||
|  |                                             void **pResult); | ||||||
|  |                     int CTR_encrypt(void *ctrState, | ||||||
|  |                                     const uint8_t *in, | ||||||
|  |                                     uint8_t *out, | ||||||
|  |                                     size_t data_len); | ||||||
|  |                     int CTR_decrypt(void *ctrState, | ||||||
|  |                                     const uint8_t *in, | ||||||
|  |                                     uint8_t *out, | ||||||
|  |                                     size_t data_len); | ||||||
|  |                     int CTR_stop_operation(void *ctrState);""" | ||||||
|  |                                         ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class CtrMode(object): | ||||||
|  |     """*CounTeR (CTR)* mode. | ||||||
|  | 
 | ||||||
|  |     This mode is very similar to ECB, in that | ||||||
|  |     encryption of one block is done independently of all other blocks. | ||||||
|  | 
 | ||||||
|  |     Unlike ECB, the block *position* contributes to the encryption | ||||||
|  |     and no information leaks about symbol frequency. | ||||||
|  | 
 | ||||||
|  |     Each message block is associated to a *counter* which | ||||||
|  |     must be unique across all messages that get encrypted | ||||||
|  |     with the same key (not just within the same message). | ||||||
|  |     The counter is as big as the block size. | ||||||
|  | 
 | ||||||
|  |     Counters can be generated in several ways. The most | ||||||
|  |     straightword one is to choose an *initial counter block* | ||||||
|  |     (which can be made public, similarly to the *IV* for the | ||||||
|  |     other modes) and increment its lowest **m** bits by one | ||||||
|  |     (modulo *2^m*) for each block. In most cases, **m** is | ||||||
|  |     chosen to be half the block size. | ||||||
|  | 
 | ||||||
|  |     See `NIST SP800-38A`_, Section 6.5 (for the mode) and | ||||||
|  |     Appendix B (for how to manage the *initial counter block*). | ||||||
|  | 
 | ||||||
|  |     .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf | ||||||
|  | 
 | ||||||
|  |     :undocumented: __init__ | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, block_cipher, initial_counter_block, | ||||||
|  |                  prefix_len, counter_len, little_endian): | ||||||
|  |         """Create a new block cipher, configured in CTR mode. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           block_cipher : C pointer | ||||||
|  |             A smart pointer to the low-level block cipher instance. | ||||||
|  | 
 | ||||||
|  |           initial_counter_block : bytes/bytearray/memoryview | ||||||
|  |             The initial plaintext to use to generate the key stream. | ||||||
|  | 
 | ||||||
|  |             It is as large as the cipher block, and it embeds | ||||||
|  |             the initial value of the counter. | ||||||
|  | 
 | ||||||
|  |             This value must not be reused. | ||||||
|  |             It shall contain a nonce or a random component. | ||||||
|  |             Reusing the *initial counter block* for encryptions | ||||||
|  |             performed with the same key compromises confidentiality. | ||||||
|  | 
 | ||||||
|  |           prefix_len : integer | ||||||
|  |             The amount of bytes at the beginning of the counter block | ||||||
|  |             that never change. | ||||||
|  | 
 | ||||||
|  |           counter_len : integer | ||||||
|  |             The length in bytes of the counter embedded in the counter | ||||||
|  |             block. | ||||||
|  | 
 | ||||||
|  |           little_endian : boolean | ||||||
|  |             True if the counter in the counter block is an integer encoded | ||||||
|  |             in little endian mode. If False, it is big endian. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if len(initial_counter_block) == prefix_len + counter_len: | ||||||
|  |             self.nonce = _copy_bytes(None, prefix_len, initial_counter_block) | ||||||
|  |             """Nonce; not available if there is a fixed suffix""" | ||||||
|  | 
 | ||||||
|  |         self._state = VoidPointer() | ||||||
|  |         result = raw_ctr_lib.CTR_start_operation(block_cipher.get(), | ||||||
|  |                                                  c_uint8_ptr(initial_counter_block), | ||||||
|  |                                                  c_size_t(len(initial_counter_block)), | ||||||
|  |                                                  c_size_t(prefix_len), | ||||||
|  |                                                  counter_len, | ||||||
|  |                                                  little_endian, | ||||||
|  |                                                  self._state.address_of()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %X while instantiating the CTR mode" | ||||||
|  |                              % result) | ||||||
|  | 
 | ||||||
|  |         # Ensure that object disposal of this Python object will (eventually) | ||||||
|  |         # free the memory allocated by the raw library for the cipher mode | ||||||
|  |         self._state = SmartPointer(self._state.get(), | ||||||
|  |                                    raw_ctr_lib.CTR_stop_operation) | ||||||
|  | 
 | ||||||
|  |         # Memory allocated for the underlying block cipher is now owed | ||||||
|  |         # by the cipher mode | ||||||
|  |         block_cipher.release() | ||||||
|  | 
 | ||||||
|  |         self.block_size = len(initial_counter_block) | ||||||
|  |         """The block size of the underlying cipher, in bytes.""" | ||||||
|  | 
 | ||||||
|  |         self._next = ["encrypt", "decrypt"] | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, plaintext, output=None): | ||||||
|  |         """Encrypt data with the key and the parameters set at initialization. | ||||||
|  | 
 | ||||||
|  |         A cipher object is stateful: once you have encrypted a message | ||||||
|  |         you cannot encrypt (or decrypt) another message using the same | ||||||
|  |         object. | ||||||
|  | 
 | ||||||
|  |         The data to encrypt can be broken up in two or | ||||||
|  |         more pieces and `encrypt` can be called multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.encrypt(a) + c.encrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.encrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         This function does not add any padding to the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           plaintext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to encrypt. | ||||||
|  |             It can be of any length. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the ciphertext must be written to. | ||||||
|  |             If ``None``, the ciphertext is returned. | ||||||
|  |         :Return: | ||||||
|  |           If ``output`` is ``None``, the ciphertext is returned as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "encrypt" not in self._next: | ||||||
|  |             raise TypeError("encrypt() cannot be called after decrypt()") | ||||||
|  |         self._next = ["encrypt"] | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             ciphertext = create_string_buffer(len(plaintext)) | ||||||
|  |         else: | ||||||
|  |             ciphertext = output | ||||||
|  | 
 | ||||||
|  |             if not is_writeable_buffer(output): | ||||||
|  |                 raise TypeError("output must be a bytearray or a writeable memoryview") | ||||||
|  | 
 | ||||||
|  |             if len(plaintext) != len(output): | ||||||
|  |                 raise ValueError("output must have the same length as the input" | ||||||
|  |                                  "  (%d bytes)" % len(plaintext)) | ||||||
|  | 
 | ||||||
|  |         result = raw_ctr_lib.CTR_encrypt(self._state.get(), | ||||||
|  |                                          c_uint8_ptr(plaintext), | ||||||
|  |                                          c_uint8_ptr(ciphertext), | ||||||
|  |                                          c_size_t(len(plaintext))) | ||||||
|  |         if result: | ||||||
|  |             if result == 0x60002: | ||||||
|  |                 raise OverflowError("The counter has wrapped around in" | ||||||
|  |                                     " CTR mode") | ||||||
|  |             raise ValueError("Error %X while encrypting in CTR mode" % result) | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             return get_raw_buffer(ciphertext) | ||||||
|  |         else: | ||||||
|  |             return None | ||||||
|  | 
 | ||||||
|  |     def decrypt(self, ciphertext, output=None): | ||||||
|  |         """Decrypt data with the key and the parameters set at initialization. | ||||||
|  | 
 | ||||||
|  |         A cipher object is stateful: once you have decrypted a message | ||||||
|  |         you cannot decrypt (or encrypt) another message with the same | ||||||
|  |         object. | ||||||
|  | 
 | ||||||
|  |         The data to decrypt can be broken up in two or | ||||||
|  |         more pieces and `decrypt` can be called multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.decrypt(a) + c.decrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.decrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         This function does not remove any padding from the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           ciphertext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to decrypt. | ||||||
|  |             It can be of any length. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the plaintext must be written to. | ||||||
|  |             If ``None``, the plaintext is returned. | ||||||
|  |         :Return: | ||||||
|  |           If ``output`` is ``None``, the plaintext is returned as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "decrypt" not in self._next: | ||||||
|  |             raise TypeError("decrypt() cannot be called after encrypt()") | ||||||
|  |         self._next = ["decrypt"] | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             plaintext = create_string_buffer(len(ciphertext)) | ||||||
|  |         else: | ||||||
|  |             plaintext = output | ||||||
|  | 
 | ||||||
|  |             if not is_writeable_buffer(output): | ||||||
|  |                 raise TypeError("output must be a bytearray or a writeable memoryview") | ||||||
|  | 
 | ||||||
|  |             if len(ciphertext) != len(output): | ||||||
|  |                 raise ValueError("output must have the same length as the input" | ||||||
|  |                                  "  (%d bytes)" % len(plaintext)) | ||||||
|  | 
 | ||||||
|  |         result = raw_ctr_lib.CTR_decrypt(self._state.get(), | ||||||
|  |                                          c_uint8_ptr(ciphertext), | ||||||
|  |                                          c_uint8_ptr(plaintext), | ||||||
|  |                                          c_size_t(len(ciphertext))) | ||||||
|  |         if result: | ||||||
|  |             if result == 0x60002: | ||||||
|  |                 raise OverflowError("The counter has wrapped around in" | ||||||
|  |                                     " CTR mode") | ||||||
|  |             raise ValueError("Error %X while decrypting in CTR mode" % result) | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             return get_raw_buffer(plaintext) | ||||||
|  |         else: | ||||||
|  |             return None | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_ctr_cipher(factory, **kwargs): | ||||||
|  |     """Instantiate a cipher object that performs CTR encryption/decryption. | ||||||
|  | 
 | ||||||
|  |     :Parameters: | ||||||
|  |       factory : module | ||||||
|  |         The underlying block cipher, a module from ``Cryptodome.Cipher``. | ||||||
|  | 
 | ||||||
|  |     :Keywords: | ||||||
|  |       nonce : bytes/bytearray/memoryview | ||||||
|  |         The fixed part at the beginning of the counter block - the rest is | ||||||
|  |         the counter number that gets increased when processing the next block. | ||||||
|  |         The nonce must be such that no two messages are encrypted under the | ||||||
|  |         same key and the same nonce. | ||||||
|  | 
 | ||||||
|  |         The nonce must be shorter than the block size (it can have | ||||||
|  |         zero length; the counter is then as long as the block). | ||||||
|  | 
 | ||||||
|  |         If this parameter is not present, a random nonce will be created with | ||||||
|  |         length equal to half the block size. No random nonce shorter than | ||||||
|  |         64 bits will be created though - you must really think through all | ||||||
|  |         security consequences of using such a short block size. | ||||||
|  | 
 | ||||||
|  |       initial_value : posive integer or bytes/bytearray/memoryview | ||||||
|  |         The initial value for the counter. If not present, the cipher will | ||||||
|  |         start counting from 0. The value is incremented by one for each block. | ||||||
|  |         The counter number is encoded in big endian mode. | ||||||
|  | 
 | ||||||
|  |       counter : object | ||||||
|  |         Instance of ``Cryptodome.Util.Counter``, which allows full customization | ||||||
|  |         of the counter block. This parameter is incompatible to both ``nonce`` | ||||||
|  |         and ``initial_value``. | ||||||
|  | 
 | ||||||
|  |     Any other keyword will be passed to the underlying block cipher. | ||||||
|  |     See the relevant documentation for details (at least ``key`` will need | ||||||
|  |     to be present). | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     cipher_state = factory._create_base_cipher(kwargs) | ||||||
|  | 
 | ||||||
|  |     counter = kwargs.pop("counter", None) | ||||||
|  |     nonce = kwargs.pop("nonce", None) | ||||||
|  |     initial_value = kwargs.pop("initial_value", None) | ||||||
|  |     if kwargs: | ||||||
|  |         raise TypeError("Invalid parameters for CTR mode: %s" % str(kwargs)) | ||||||
|  | 
 | ||||||
|  |     if counter is not None and (nonce, initial_value) != (None, None): | ||||||
|  |         raise TypeError("'counter' and 'nonce'/'initial_value'" | ||||||
|  |                         " are mutually exclusive") | ||||||
|  | 
 | ||||||
|  |     if counter is None: | ||||||
|  |         # Cryptodome.Util.Counter is not used | ||||||
|  |         if nonce is None: | ||||||
|  |             if factory.block_size < 16: | ||||||
|  |                 raise TypeError("Impossible to create a safe nonce for short" | ||||||
|  |                                 " block sizes") | ||||||
|  |             nonce = get_random_bytes(factory.block_size // 2) | ||||||
|  |         else: | ||||||
|  |             if len(nonce) >= factory.block_size: | ||||||
|  |                 raise ValueError("Nonce is too long") | ||||||
|  | 
 | ||||||
|  |         # What is not nonce is counter | ||||||
|  |         counter_len = factory.block_size - len(nonce) | ||||||
|  | 
 | ||||||
|  |         if initial_value is None: | ||||||
|  |             initial_value = 0 | ||||||
|  | 
 | ||||||
|  |         if is_native_int(initial_value): | ||||||
|  |             if (1 << (counter_len * 8)) - 1 < initial_value: | ||||||
|  |                 raise ValueError("Initial counter value is too large") | ||||||
|  |             initial_counter_block = nonce + long_to_bytes(initial_value, counter_len) | ||||||
|  |         else: | ||||||
|  |             if len(initial_value) != counter_len: | ||||||
|  |                 raise ValueError("Incorrect length for counter byte string (%d bytes, expected %d)" % | ||||||
|  |                                  (len(initial_value), counter_len)) | ||||||
|  |             initial_counter_block = nonce + initial_value | ||||||
|  | 
 | ||||||
|  |         return CtrMode(cipher_state, | ||||||
|  |                        initial_counter_block, | ||||||
|  |                        len(nonce),                     # prefix | ||||||
|  |                        counter_len, | ||||||
|  |                        False)                          # little_endian | ||||||
|  | 
 | ||||||
|  |     # Cryptodome.Util.Counter is used | ||||||
|  | 
 | ||||||
|  |     # 'counter' used to be a callable object, but now it is | ||||||
|  |     # just a dictionary for backward compatibility. | ||||||
|  |     _counter = dict(counter) | ||||||
|  |     try: | ||||||
|  |         counter_len = _counter.pop("counter_len") | ||||||
|  |         prefix = _counter.pop("prefix") | ||||||
|  |         suffix = _counter.pop("suffix") | ||||||
|  |         initial_value = _counter.pop("initial_value") | ||||||
|  |         little_endian = _counter.pop("little_endian") | ||||||
|  |     except KeyError: | ||||||
|  |         raise TypeError("Incorrect counter object" | ||||||
|  |                         " (use Cryptodome.Util.Counter.new)") | ||||||
|  | 
 | ||||||
|  |     # Compute initial counter block | ||||||
|  |     words = [] | ||||||
|  |     while initial_value > 0: | ||||||
|  |         words.append(struct.pack('B', initial_value & 255)) | ||||||
|  |         initial_value >>= 8 | ||||||
|  |     words += [b'\x00'] * max(0, counter_len - len(words)) | ||||||
|  |     if not little_endian: | ||||||
|  |         words.reverse() | ||||||
|  |     initial_counter_block = prefix + b"".join(words) + suffix | ||||||
|  | 
 | ||||||
|  |     if len(initial_counter_block) != factory.block_size: | ||||||
|  |         raise ValueError("Size of the counter block (%d bytes) must match" | ||||||
|  |                          " block size (%d)" % (len(initial_counter_block), | ||||||
|  |                                                factory.block_size)) | ||||||
|  | 
 | ||||||
|  |     return CtrMode(cipher_state, initial_counter_block, | ||||||
|  |                    len(prefix), counter_len, little_endian) | ||||||
							
								
								
									
										27
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ctr.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ctr.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,27 @@ | ||||||
|  | from typing import Union, overload | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import SmartPointer | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | __all__ = ['CtrMode'] | ||||||
|  | 
 | ||||||
|  | class CtrMode(object): | ||||||
|  |     block_size: int | ||||||
|  |     nonce: bytes | ||||||
|  | 
 | ||||||
|  |     def __init__(self, | ||||||
|  |                  block_cipher: SmartPointer, | ||||||
|  |                  initial_counter_block: Buffer, | ||||||
|  |                  prefix_len: int, | ||||||
|  |                  counter_len: int, | ||||||
|  |                  little_endian: bool) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  | 
 | ||||||
							
								
								
									
										408
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_eax.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										408
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_eax.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,408 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2014, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | EAX mode. | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | __all__ = ['EaxMode'] | ||||||
|  | 
 | ||||||
|  | import struct | ||||||
|  | from binascii import unhexlify | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import byte_string, bord, _copy_bytes | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import is_buffer | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.strxor import strxor | ||||||
|  | from Cryptodome.Util.number import long_to_bytes, bytes_to_long | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Hash import CMAC, BLAKE2s | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class EaxMode(object): | ||||||
|  |     """*EAX* mode. | ||||||
|  | 
 | ||||||
|  |     This is an Authenticated Encryption with Associated Data | ||||||
|  |     (`AEAD`_) mode. It provides both confidentiality and authenticity. | ||||||
|  | 
 | ||||||
|  |     The header of the message may be left in the clear, if needed, | ||||||
|  |     and it will still be subject to authentication. | ||||||
|  | 
 | ||||||
|  |     The decryption step tells the receiver if the message comes | ||||||
|  |     from a source that really knowns the secret key. | ||||||
|  |     Additionally, decryption detects if any part of the message - | ||||||
|  |     including the header - has been modified or corrupted. | ||||||
|  | 
 | ||||||
|  |     This mode requires a *nonce*. | ||||||
|  | 
 | ||||||
|  |     This mode is only available for ciphers that operate on 64 or | ||||||
|  |     128 bits blocks. | ||||||
|  | 
 | ||||||
|  |     There are no official standards defining EAX. | ||||||
|  |     The implementation is based on `a proposal`__ that | ||||||
|  |     was presented to NIST. | ||||||
|  | 
 | ||||||
|  |     .. _AEAD: http://blog.cryptographyengineering.com/2012/05/how-to-choose-authenticated-encryption.html | ||||||
|  |     .. __: http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/eax/eax-spec.pdf | ||||||
|  | 
 | ||||||
|  |     :undocumented: __init__ | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, factory, key, nonce, mac_len, cipher_params): | ||||||
|  |         """EAX cipher mode""" | ||||||
|  | 
 | ||||||
|  |         self.block_size = factory.block_size | ||||||
|  |         """The block size of the underlying cipher, in bytes.""" | ||||||
|  | 
 | ||||||
|  |         self.nonce = _copy_bytes(None, None, nonce) | ||||||
|  |         """The nonce originally used to create the object.""" | ||||||
|  | 
 | ||||||
|  |         self._mac_len = mac_len | ||||||
|  |         self._mac_tag = None  # Cache for MAC tag | ||||||
|  | 
 | ||||||
|  |         # Allowed transitions after initialization | ||||||
|  |         self._next = ["update", "encrypt", "decrypt", | ||||||
|  |                       "digest", "verify"] | ||||||
|  | 
 | ||||||
|  |         # MAC tag length | ||||||
|  |         if not (2 <= self._mac_len <= self.block_size): | ||||||
|  |             raise ValueError("'mac_len' must be at least 2 and not larger than %d" | ||||||
|  |                              % self.block_size) | ||||||
|  | 
 | ||||||
|  |         # Nonce cannot be empty and must be a byte string | ||||||
|  |         if len(self.nonce) == 0: | ||||||
|  |             raise ValueError("Nonce cannot be empty in EAX mode") | ||||||
|  |         if not is_buffer(nonce): | ||||||
|  |             raise TypeError("nonce must be bytes, bytearray or memoryview") | ||||||
|  | 
 | ||||||
|  |         self._omac = [ | ||||||
|  |                 CMAC.new(key, | ||||||
|  |                          b'\x00' * (self.block_size - 1) + struct.pack('B', i), | ||||||
|  |                          ciphermod=factory, | ||||||
|  |                          cipher_params=cipher_params) | ||||||
|  |                 for i in range(0, 3) | ||||||
|  |                 ] | ||||||
|  | 
 | ||||||
|  |         # Compute MAC of nonce | ||||||
|  |         self._omac[0].update(self.nonce) | ||||||
|  |         self._signer = self._omac[1] | ||||||
|  | 
 | ||||||
|  |         # MAC of the nonce is also the initial counter for CTR encryption | ||||||
|  |         counter_int = bytes_to_long(self._omac[0].digest()) | ||||||
|  |         self._cipher = factory.new(key, | ||||||
|  |                                    factory.MODE_CTR, | ||||||
|  |                                    initial_value=counter_int, | ||||||
|  |                                    nonce=b"", | ||||||
|  |                                    **cipher_params) | ||||||
|  | 
 | ||||||
|  |     def update(self, assoc_data): | ||||||
|  |         """Protect associated data | ||||||
|  | 
 | ||||||
|  |         If there is any associated data, the caller has to invoke | ||||||
|  |         this function one or more times, before using | ||||||
|  |         ``decrypt`` or ``encrypt``. | ||||||
|  | 
 | ||||||
|  |         By *associated data* it is meant any data (e.g. packet headers) that | ||||||
|  |         will not be encrypted and will be transmitted in the clear. | ||||||
|  |         However, the receiver is still able to detect any modification to it. | ||||||
|  | 
 | ||||||
|  |         If there is no associated data, this method must not be called. | ||||||
|  | 
 | ||||||
|  |         The caller may split associated data in segments of any size, and | ||||||
|  |         invoke this method multiple times, each time with the next segment. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           assoc_data : bytes/bytearray/memoryview | ||||||
|  |             A piece of associated data. There are no restrictions on its size. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "update" not in self._next: | ||||||
|  |             raise TypeError("update() can only be called" | ||||||
|  |                                 " immediately after initialization") | ||||||
|  | 
 | ||||||
|  |         self._next = ["update", "encrypt", "decrypt", | ||||||
|  |                       "digest", "verify"] | ||||||
|  | 
 | ||||||
|  |         self._signer.update(assoc_data) | ||||||
|  |         return self | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, plaintext, output=None): | ||||||
|  |         """Encrypt data with the key and the parameters set at initialization. | ||||||
|  | 
 | ||||||
|  |         A cipher object is stateful: once you have encrypted a message | ||||||
|  |         you cannot encrypt (or decrypt) another message using the same | ||||||
|  |         object. | ||||||
|  | 
 | ||||||
|  |         The data to encrypt can be broken up in two or | ||||||
|  |         more pieces and `encrypt` can be called multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.encrypt(a) + c.encrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.encrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         This function does not add any padding to the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           plaintext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to encrypt. | ||||||
|  |             It can be of any length. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the ciphertext must be written to. | ||||||
|  |             If ``None``, the ciphertext is returned. | ||||||
|  |         :Return: | ||||||
|  |           If ``output`` is ``None``, the ciphertext as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "encrypt" not in self._next: | ||||||
|  |             raise TypeError("encrypt() can only be called after" | ||||||
|  |                             " initialization or an update()") | ||||||
|  |         self._next = ["encrypt", "digest"] | ||||||
|  |         ct = self._cipher.encrypt(plaintext, output=output) | ||||||
|  |         if output is None: | ||||||
|  |             self._omac[2].update(ct) | ||||||
|  |         else: | ||||||
|  |             self._omac[2].update(output) | ||||||
|  |         return ct | ||||||
|  | 
 | ||||||
|  |     def decrypt(self, ciphertext, output=None): | ||||||
|  |         """Decrypt data with the key and the parameters set at initialization. | ||||||
|  | 
 | ||||||
|  |         A cipher object is stateful: once you have decrypted a message | ||||||
|  |         you cannot decrypt (or encrypt) another message with the same | ||||||
|  |         object. | ||||||
|  | 
 | ||||||
|  |         The data to decrypt can be broken up in two or | ||||||
|  |         more pieces and `decrypt` can be called multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.decrypt(a) + c.decrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.decrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         This function does not remove any padding from the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           ciphertext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to decrypt. | ||||||
|  |             It can be of any length. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the plaintext must be written to. | ||||||
|  |             If ``None``, the plaintext is returned. | ||||||
|  |         :Return: | ||||||
|  |           If ``output`` is ``None``, the plaintext as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "decrypt" not in self._next: | ||||||
|  |             raise TypeError("decrypt() can only be called" | ||||||
|  |                             " after initialization or an update()") | ||||||
|  |         self._next = ["decrypt", "verify"] | ||||||
|  |         self._omac[2].update(ciphertext) | ||||||
|  |         return self._cipher.decrypt(ciphertext, output=output) | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         """Compute the *binary* MAC tag. | ||||||
|  | 
 | ||||||
|  |         The caller invokes this function at the very end. | ||||||
|  | 
 | ||||||
|  |         This method returns the MAC that shall be sent to the receiver, | ||||||
|  |         together with the ciphertext. | ||||||
|  | 
 | ||||||
|  |         :Return: the MAC, as a byte string. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "digest" not in self._next: | ||||||
|  |             raise TypeError("digest() cannot be called when decrypting" | ||||||
|  |                                 " or validating a message") | ||||||
|  |         self._next = ["digest"] | ||||||
|  | 
 | ||||||
|  |         if not self._mac_tag: | ||||||
|  |             tag = b'\x00' * self.block_size | ||||||
|  |             for i in range(3): | ||||||
|  |                 tag = strxor(tag, self._omac[i].digest()) | ||||||
|  |             self._mac_tag = tag[:self._mac_len] | ||||||
|  | 
 | ||||||
|  |         return self._mac_tag | ||||||
|  | 
 | ||||||
|  |     def hexdigest(self): | ||||||
|  |         """Compute the *printable* MAC tag. | ||||||
|  | 
 | ||||||
|  |         This method is like `digest`. | ||||||
|  | 
 | ||||||
|  |         :Return: the MAC, as a hexadecimal string. | ||||||
|  |         """ | ||||||
|  |         return "".join(["%02x" % bord(x) for x in self.digest()]) | ||||||
|  | 
 | ||||||
|  |     def verify(self, received_mac_tag): | ||||||
|  |         """Validate the *binary* MAC tag. | ||||||
|  | 
 | ||||||
|  |         The caller invokes this function at the very end. | ||||||
|  | 
 | ||||||
|  |         This method checks if the decrypted message is indeed valid | ||||||
|  |         (that is, if the key is correct) and it has not been | ||||||
|  |         tampered with while in transit. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           received_mac_tag : bytes/bytearray/memoryview | ||||||
|  |             This is the *binary* MAC, as received from the sender. | ||||||
|  |         :Raises MacMismatchError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "verify" not in self._next: | ||||||
|  |             raise TypeError("verify() cannot be called" | ||||||
|  |                                 " when encrypting a message") | ||||||
|  |         self._next = ["verify"] | ||||||
|  | 
 | ||||||
|  |         if not self._mac_tag: | ||||||
|  |             tag = b'\x00' * self.block_size | ||||||
|  |             for i in range(3): | ||||||
|  |                 tag = strxor(tag, self._omac[i].digest()) | ||||||
|  |             self._mac_tag = tag[:self._mac_len] | ||||||
|  | 
 | ||||||
|  |         secret = get_random_bytes(16) | ||||||
|  | 
 | ||||||
|  |         mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=self._mac_tag) | ||||||
|  |         mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=received_mac_tag) | ||||||
|  | 
 | ||||||
|  |         if mac1.digest() != mac2.digest(): | ||||||
|  |             raise ValueError("MAC check failed") | ||||||
|  | 
 | ||||||
|  |     def hexverify(self, hex_mac_tag): | ||||||
|  |         """Validate the *printable* MAC tag. | ||||||
|  | 
 | ||||||
|  |         This method is like `verify`. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           hex_mac_tag : string | ||||||
|  |             This is the *printable* MAC, as received from the sender. | ||||||
|  |         :Raises MacMismatchError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self.verify(unhexlify(hex_mac_tag)) | ||||||
|  | 
 | ||||||
|  |     def encrypt_and_digest(self, plaintext, output=None): | ||||||
|  |         """Perform encrypt() and digest() in one step. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           plaintext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to encrypt. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the ciphertext must be written to. | ||||||
|  |             If ``None``, the ciphertext is returned. | ||||||
|  |         :Return: | ||||||
|  |             a tuple with two items: | ||||||
|  | 
 | ||||||
|  |             - the ciphertext, as ``bytes`` | ||||||
|  |             - the MAC tag, as ``bytes`` | ||||||
|  | 
 | ||||||
|  |             The first item becomes ``None`` when the ``output`` parameter | ||||||
|  |             specified a location for the result. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         return self.encrypt(plaintext, output=output), self.digest() | ||||||
|  | 
 | ||||||
|  |     def decrypt_and_verify(self, ciphertext, received_mac_tag, output=None): | ||||||
|  |         """Perform decrypt() and verify() in one step. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           ciphertext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to decrypt. | ||||||
|  |           received_mac_tag : bytes/bytearray/memoryview | ||||||
|  |             This is the *binary* MAC, as received from the sender. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the plaintext must be written to. | ||||||
|  |             If ``None``, the plaintext is returned. | ||||||
|  |         :Return: the plaintext as ``bytes`` or ``None`` when the ``output`` | ||||||
|  |             parameter specified a location for the result. | ||||||
|  |         :Raises MacMismatchError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         pt = self.decrypt(ciphertext, output=output) | ||||||
|  |         self.verify(received_mac_tag) | ||||||
|  |         return pt | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_eax_cipher(factory, **kwargs): | ||||||
|  |     """Create a new block cipher, configured in EAX mode. | ||||||
|  | 
 | ||||||
|  |     :Parameters: | ||||||
|  |       factory : module | ||||||
|  |         A symmetric cipher module from `Cryptodome.Cipher` (like | ||||||
|  |         `Cryptodome.Cipher.AES`). | ||||||
|  | 
 | ||||||
|  |     :Keywords: | ||||||
|  |       key : bytes/bytearray/memoryview | ||||||
|  |         The secret key to use in the symmetric cipher. | ||||||
|  | 
 | ||||||
|  |       nonce : bytes/bytearray/memoryview | ||||||
|  |         A value that must never be reused for any other encryption. | ||||||
|  |         There are no restrictions on its length, but it is recommended to use | ||||||
|  |         at least 16 bytes. | ||||||
|  | 
 | ||||||
|  |         The nonce shall never repeat for two different messages encrypted with | ||||||
|  |         the same key, but it does not need to be random. | ||||||
|  | 
 | ||||||
|  |         If not specified, a 16 byte long random string is used. | ||||||
|  | 
 | ||||||
|  |       mac_len : integer | ||||||
|  |         Length of the MAC, in bytes. It must be no larger than the cipher | ||||||
|  |         block bytes (which is the default). | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         key = kwargs.pop("key") | ||||||
|  |         nonce = kwargs.pop("nonce", None) | ||||||
|  |         if nonce is None: | ||||||
|  |             nonce = get_random_bytes(16) | ||||||
|  |         mac_len = kwargs.pop("mac_len", factory.block_size) | ||||||
|  |     except KeyError as e: | ||||||
|  |         raise TypeError("Missing parameter: " + str(e)) | ||||||
|  | 
 | ||||||
|  |     return EaxMode(factory, key, nonce, mac_len, kwargs) | ||||||
							
								
								
									
										45
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_eax.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_eax.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,45 @@ | ||||||
|  | from types import ModuleType | ||||||
|  | from typing import Any, Union, Tuple, Dict, overload, Optional | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | __all__ = ['EaxMode'] | ||||||
|  | 
 | ||||||
|  | class EaxMode(object): | ||||||
|  |     block_size: int | ||||||
|  |     nonce: bytes | ||||||
|  |      | ||||||
|  |     def __init__(self, | ||||||
|  |                  factory: ModuleType, | ||||||
|  |                  key: Buffer, | ||||||
|  |                  nonce: Buffer, | ||||||
|  |                  mac_len: int, | ||||||
|  |                  cipher_params: Dict) -> None: ... | ||||||
|  |      | ||||||
|  |     def update(self, assoc_data: Buffer) -> EaxMode: ... | ||||||
|  | 
 | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  | 
 | ||||||
|  |     def digest(self) -> bytes: ... | ||||||
|  |     def hexdigest(self) -> str: ... | ||||||
|  |     def verify(self, received_mac_tag: Buffer) -> None: ... | ||||||
|  |     def hexverify(self, hex_mac_tag: str) -> None: ... | ||||||
|  | 
 | ||||||
|  |     @overload | ||||||
|  |     def encrypt_and_digest(self, | ||||||
|  |                            plaintext: Buffer) -> Tuple[bytes, bytes]: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt_and_digest(self, | ||||||
|  |                            plaintext: Buffer, | ||||||
|  |                            output: Buffer) -> Tuple[None, bytes]: ... | ||||||
|  |     def decrypt_and_verify(self, | ||||||
|  |                            ciphertext: Buffer, | ||||||
|  |                            received_mac_tag: Buffer, | ||||||
|  |                            output: Optional[Union[bytearray, memoryview]] = ...) -> bytes: ... | ||||||
							
								
								
									
										220
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ecb.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										220
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ecb.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,220 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | #  Cipher/mode_ecb.py : ECB mode | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Electronic Code Book (ECB) mode. | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | __all__ = [ 'EcbMode' ] | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   VoidPointer, create_string_buffer, | ||||||
|  |                                   get_raw_buffer, SmartPointer, | ||||||
|  |                                   c_size_t, c_uint8_ptr, | ||||||
|  |                                   is_writeable_buffer) | ||||||
|  | 
 | ||||||
|  | raw_ecb_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_ecb", """ | ||||||
|  |                     int ECB_start_operation(void *cipher, | ||||||
|  |                                             void **pResult); | ||||||
|  |                     int ECB_encrypt(void *ecbState, | ||||||
|  |                                     const uint8_t *in, | ||||||
|  |                                     uint8_t *out, | ||||||
|  |                                     size_t data_len); | ||||||
|  |                     int ECB_decrypt(void *ecbState, | ||||||
|  |                                     const uint8_t *in, | ||||||
|  |                                     uint8_t *out, | ||||||
|  |                                     size_t data_len); | ||||||
|  |                     int ECB_stop_operation(void *state); | ||||||
|  |                     """ | ||||||
|  |                                         ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class EcbMode(object): | ||||||
|  |     """*Electronic Code Book (ECB)*. | ||||||
|  | 
 | ||||||
|  |     This is the simplest encryption mode. Each of the plaintext blocks | ||||||
|  |     is directly encrypted into a ciphertext block, independently of | ||||||
|  |     any other block. | ||||||
|  | 
 | ||||||
|  |     This mode is dangerous because it exposes frequency of symbols | ||||||
|  |     in your plaintext. Other modes (e.g. *CBC*) should be used instead. | ||||||
|  | 
 | ||||||
|  |     See `NIST SP800-38A`_ , Section 6.1. | ||||||
|  | 
 | ||||||
|  |     .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf | ||||||
|  | 
 | ||||||
|  |     :undocumented: __init__ | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, block_cipher): | ||||||
|  |         """Create a new block cipher, configured in ECB mode. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           block_cipher : C pointer | ||||||
|  |             A smart pointer to the low-level block cipher instance. | ||||||
|  |         """ | ||||||
|  |         self.block_size = block_cipher.block_size | ||||||
|  | 
 | ||||||
|  |         self._state = VoidPointer() | ||||||
|  |         result = raw_ecb_lib.ECB_start_operation(block_cipher.get(), | ||||||
|  |                                                  self._state.address_of()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating the ECB mode" | ||||||
|  |                              % result) | ||||||
|  | 
 | ||||||
|  |         # Ensure that object disposal of this Python object will (eventually) | ||||||
|  |         # free the memory allocated by the raw library for the cipher | ||||||
|  |         # mode | ||||||
|  |         self._state = SmartPointer(self._state.get(), | ||||||
|  |                                    raw_ecb_lib.ECB_stop_operation) | ||||||
|  | 
 | ||||||
|  |         # Memory allocated for the underlying block cipher is now owned | ||||||
|  |         # by the cipher mode | ||||||
|  |         block_cipher.release() | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, plaintext, output=None): | ||||||
|  |         """Encrypt data with the key set at initialization. | ||||||
|  | 
 | ||||||
|  |         The data to encrypt can be broken up in two or | ||||||
|  |         more pieces and `encrypt` can be called multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.encrypt(a) + c.encrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.encrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         This function does not add any padding to the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           plaintext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to encrypt. | ||||||
|  |             The length must be multiple of the cipher block length. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the ciphertext must be written to. | ||||||
|  |             If ``None``, the ciphertext is returned. | ||||||
|  |         :Return: | ||||||
|  |           If ``output`` is ``None``, the ciphertext is returned as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             ciphertext = create_string_buffer(len(plaintext)) | ||||||
|  |         else: | ||||||
|  |             ciphertext = output | ||||||
|  |              | ||||||
|  |             if not is_writeable_buffer(output): | ||||||
|  |                 raise TypeError("output must be a bytearray or a writeable memoryview") | ||||||
|  |          | ||||||
|  |             if len(plaintext) != len(output): | ||||||
|  |                 raise ValueError("output must have the same length as the input" | ||||||
|  |                                  "  (%d bytes)" % len(plaintext)) | ||||||
|  | 
 | ||||||
|  |         result = raw_ecb_lib.ECB_encrypt(self._state.get(), | ||||||
|  |                                          c_uint8_ptr(plaintext), | ||||||
|  |                                          c_uint8_ptr(ciphertext), | ||||||
|  |                                          c_size_t(len(plaintext))) | ||||||
|  |         if result: | ||||||
|  |             if result == 3: | ||||||
|  |                 raise ValueError("Data must be aligned to block boundary in ECB mode") | ||||||
|  |             raise ValueError("Error %d while encrypting in ECB mode" % result) | ||||||
|  |          | ||||||
|  |         if output is None: | ||||||
|  |             return get_raw_buffer(ciphertext) | ||||||
|  |         else: | ||||||
|  |             return None | ||||||
|  | 
 | ||||||
|  |     def decrypt(self, ciphertext, output=None): | ||||||
|  |         """Decrypt data with the key set at initialization. | ||||||
|  | 
 | ||||||
|  |         The data to decrypt can be broken up in two or | ||||||
|  |         more pieces and `decrypt` can be called multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.decrypt(a) + c.decrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.decrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         This function does not remove any padding from the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           ciphertext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to decrypt. | ||||||
|  |             The length must be multiple of the cipher block length. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the plaintext must be written to. | ||||||
|  |             If ``None``, the plaintext is returned. | ||||||
|  |         :Return: | ||||||
|  |           If ``output`` is ``None``, the plaintext is returned as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  |          | ||||||
|  |         if output is None: | ||||||
|  |             plaintext = create_string_buffer(len(ciphertext)) | ||||||
|  |         else: | ||||||
|  |             plaintext = output | ||||||
|  | 
 | ||||||
|  |             if not is_writeable_buffer(output): | ||||||
|  |                 raise TypeError("output must be a bytearray or a writeable memoryview") | ||||||
|  |              | ||||||
|  |             if len(ciphertext) != len(output): | ||||||
|  |                 raise ValueError("output must have the same length as the input" | ||||||
|  |                                  "  (%d bytes)" % len(plaintext)) | ||||||
|  | 
 | ||||||
|  |         result = raw_ecb_lib.ECB_decrypt(self._state.get(), | ||||||
|  |                                          c_uint8_ptr(ciphertext), | ||||||
|  |                                          c_uint8_ptr(plaintext), | ||||||
|  |                                          c_size_t(len(ciphertext))) | ||||||
|  |         if result: | ||||||
|  |             if result == 3: | ||||||
|  |                 raise ValueError("Data must be aligned to block boundary in ECB mode") | ||||||
|  |             raise ValueError("Error %d while decrypting in ECB mode" % result) | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             return get_raw_buffer(plaintext) | ||||||
|  |         else: | ||||||
|  |             return None | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_ecb_cipher(factory, **kwargs): | ||||||
|  |     """Instantiate a cipher object that performs ECB encryption/decryption. | ||||||
|  | 
 | ||||||
|  |     :Parameters: | ||||||
|  |       factory : module | ||||||
|  |         The underlying block cipher, a module from ``Cryptodome.Cipher``. | ||||||
|  | 
 | ||||||
|  |     All keywords are passed to the underlying block cipher. | ||||||
|  |     See the relevant documentation for details (at least ``key`` will need | ||||||
|  |     to be present""" | ||||||
|  | 
 | ||||||
|  |     cipher_state = factory._create_base_cipher(kwargs) | ||||||
|  |     cipher_state.block_size = factory.block_size | ||||||
|  |     if kwargs: | ||||||
|  |         raise TypeError("Unknown parameters for ECB: %s" % str(kwargs)) | ||||||
|  |     return EcbMode(cipher_state) | ||||||
							
								
								
									
										19
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ecb.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ecb.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | ||||||
|  | from typing import Union, overload | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import SmartPointer | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | __all__ = [ 'EcbMode' ] | ||||||
|  | 
 | ||||||
|  | class EcbMode(object): | ||||||
|  |     def __init__(self, block_cipher: SmartPointer) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  | 
 | ||||||
							
								
								
									
										620
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_gcm.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										620
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_gcm.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,620 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2014, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Galois/Counter Mode (GCM). | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | __all__ = ['GcmMode'] | ||||||
|  | 
 | ||||||
|  | from binascii import unhexlify | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import bord, _copy_bytes | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import is_buffer | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.number import long_to_bytes, bytes_to_long | ||||||
|  | from Cryptodome.Hash import BLAKE2s | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, | ||||||
|  |                                   create_string_buffer, get_raw_buffer, | ||||||
|  |                                   SmartPointer, c_size_t, c_uint8_ptr) | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util import _cpu_features | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # C API by module implementing GHASH | ||||||
|  | _ghash_api_template = """ | ||||||
|  |     int ghash_%imp%(uint8_t y_out[16], | ||||||
|  |                     const uint8_t block_data[], | ||||||
|  |                     size_t len, | ||||||
|  |                     const uint8_t y_in[16], | ||||||
|  |                     const void *exp_key); | ||||||
|  |     int ghash_expand_%imp%(const uint8_t h[16], | ||||||
|  |                            void **ghash_tables); | ||||||
|  |     int ghash_destroy_%imp%(void *ghash_tables); | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | def _build_impl(lib, postfix): | ||||||
|  |     from collections import namedtuple | ||||||
|  | 
 | ||||||
|  |     funcs = ( "ghash", "ghash_expand", "ghash_destroy" ) | ||||||
|  |     GHASH_Imp = namedtuple('_GHash_Imp', funcs) | ||||||
|  |     try: | ||||||
|  |         imp_funcs = [ getattr(lib, x + "_" + postfix) for x in funcs ] | ||||||
|  |     except AttributeError:      # Make sphinx stop complaining with its mocklib | ||||||
|  |         imp_funcs = [ None ] * 3 | ||||||
|  |     params = dict(zip(funcs, imp_funcs)) | ||||||
|  |     return GHASH_Imp(**params) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _get_ghash_portable(): | ||||||
|  |     api = _ghash_api_template.replace("%imp%", "portable") | ||||||
|  |     lib = load_pycryptodome_raw_lib("Cryptodome.Hash._ghash_portable", api) | ||||||
|  |     result = _build_impl(lib, "portable") | ||||||
|  |     return result | ||||||
|  | _ghash_portable = _get_ghash_portable() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _get_ghash_clmul(): | ||||||
|  |     """Return None if CLMUL implementation is not available""" | ||||||
|  | 
 | ||||||
|  |     if not _cpu_features.have_clmul(): | ||||||
|  |         return None | ||||||
|  |     try: | ||||||
|  |         api = _ghash_api_template.replace("%imp%", "clmul") | ||||||
|  |         lib = load_pycryptodome_raw_lib("Cryptodome.Hash._ghash_clmul", api) | ||||||
|  |         result = _build_impl(lib, "clmul") | ||||||
|  |     except OSError: | ||||||
|  |         result = None | ||||||
|  |     return result | ||||||
|  | _ghash_clmul = _get_ghash_clmul() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class _GHASH(object): | ||||||
|  |     """GHASH function defined in NIST SP 800-38D, Algorithm 2. | ||||||
|  | 
 | ||||||
|  |     If X_1, X_2, .. X_m are the blocks of input data, the function | ||||||
|  |     computes: | ||||||
|  | 
 | ||||||
|  |        X_1*H^{m} + X_2*H^{m-1} + ... + X_m*H | ||||||
|  | 
 | ||||||
|  |     in the Galois field GF(2^256) using the reducing polynomial | ||||||
|  |     (x^128 + x^7 + x^2 + x + 1). | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, subkey, ghash_c): | ||||||
|  |         assert len(subkey) == 16 | ||||||
|  | 
 | ||||||
|  |         self.ghash_c = ghash_c | ||||||
|  | 
 | ||||||
|  |         self._exp_key = VoidPointer() | ||||||
|  |         result = ghash_c.ghash_expand(c_uint8_ptr(subkey), | ||||||
|  |                                       self._exp_key.address_of()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while expanding the GHASH key" % result) | ||||||
|  | 
 | ||||||
|  |         self._exp_key = SmartPointer(self._exp_key.get(), | ||||||
|  |                                      ghash_c.ghash_destroy) | ||||||
|  | 
 | ||||||
|  |         # create_string_buffer always returns a string of zeroes | ||||||
|  |         self._last_y = create_string_buffer(16) | ||||||
|  | 
 | ||||||
|  |     def update(self, block_data): | ||||||
|  |         assert len(block_data) % 16 == 0 | ||||||
|  | 
 | ||||||
|  |         result = self.ghash_c.ghash(self._last_y, | ||||||
|  |                                     c_uint8_ptr(block_data), | ||||||
|  |                                     c_size_t(len(block_data)), | ||||||
|  |                                     self._last_y, | ||||||
|  |                                     self._exp_key.get()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while updating GHASH" % result) | ||||||
|  | 
 | ||||||
|  |         return self | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         return get_raw_buffer(self._last_y) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def enum(**enums): | ||||||
|  |     return type('Enum', (), enums) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | MacStatus = enum(PROCESSING_AUTH_DATA=1, PROCESSING_CIPHERTEXT=2) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class GcmMode(object): | ||||||
|  |     """Galois Counter Mode (GCM). | ||||||
|  | 
 | ||||||
|  |     This is an Authenticated Encryption with Associated Data (`AEAD`_) mode. | ||||||
|  |     It provides both confidentiality and authenticity. | ||||||
|  | 
 | ||||||
|  |     The header of the message may be left in the clear, if needed, and it will | ||||||
|  |     still be subject to authentication. The decryption step tells the receiver | ||||||
|  |     if the message comes from a source that really knowns the secret key. | ||||||
|  |     Additionally, decryption detects if any part of the message - including the | ||||||
|  |     header - has been modified or corrupted. | ||||||
|  | 
 | ||||||
|  |     This mode requires a *nonce*. | ||||||
|  | 
 | ||||||
|  |     This mode is only available for ciphers that operate on 128 bits blocks | ||||||
|  |     (e.g. AES but not TDES). | ||||||
|  | 
 | ||||||
|  |     See `NIST SP800-38D`_. | ||||||
|  | 
 | ||||||
|  |     .. _`NIST SP800-38D`: http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf | ||||||
|  |     .. _AEAD: http://blog.cryptographyengineering.com/2012/05/how-to-choose-authenticated-encryption.html | ||||||
|  | 
 | ||||||
|  |     :undocumented: __init__ | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, factory, key, nonce, mac_len, cipher_params, ghash_c): | ||||||
|  | 
 | ||||||
|  |         self.block_size = factory.block_size | ||||||
|  |         if self.block_size != 16: | ||||||
|  |             raise ValueError("GCM mode is only available for ciphers" | ||||||
|  |                              " that operate on 128 bits blocks") | ||||||
|  | 
 | ||||||
|  |         if len(nonce) == 0: | ||||||
|  |             raise ValueError("Nonce cannot be empty") | ||||||
|  | 
 | ||||||
|  |         if not is_buffer(nonce): | ||||||
|  |             raise TypeError("Nonce must be bytes, bytearray or memoryview") | ||||||
|  | 
 | ||||||
|  |         # See NIST SP 800 38D, 5.2.1.1 | ||||||
|  |         if len(nonce) > 2**64 - 1: | ||||||
|  |             raise ValueError("Nonce exceeds maximum length") | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         self.nonce = _copy_bytes(None, None, nonce) | ||||||
|  |         """Nonce""" | ||||||
|  | 
 | ||||||
|  |         self._factory = factory | ||||||
|  |         self._key = _copy_bytes(None, None, key) | ||||||
|  |         self._tag = None  # Cache for MAC tag | ||||||
|  | 
 | ||||||
|  |         self._mac_len = mac_len | ||||||
|  |         if not (4 <= mac_len <= 16): | ||||||
|  |             raise ValueError("Parameter 'mac_len' must be in the range 4..16") | ||||||
|  | 
 | ||||||
|  |         # Allowed transitions after initialization | ||||||
|  |         self._next = ["update", "encrypt", "decrypt", | ||||||
|  |                       "digest", "verify"] | ||||||
|  | 
 | ||||||
|  |         self._no_more_assoc_data = False | ||||||
|  | 
 | ||||||
|  |         # Length of associated data | ||||||
|  |         self._auth_len = 0 | ||||||
|  | 
 | ||||||
|  |         # Length of the ciphertext or plaintext | ||||||
|  |         self._msg_len = 0 | ||||||
|  | 
 | ||||||
|  |         # Step 1 in SP800-38D, Algorithm 4 (encryption) - Compute H | ||||||
|  |         # See also Algorithm 5 (decryption) | ||||||
|  |         hash_subkey = factory.new(key, | ||||||
|  |                                   self._factory.MODE_ECB, | ||||||
|  |                                   **cipher_params | ||||||
|  |                                   ).encrypt(b'\x00' * 16) | ||||||
|  | 
 | ||||||
|  |         # Step 2 - Compute J0 | ||||||
|  |         if len(self.nonce) == 12: | ||||||
|  |             j0 = self.nonce + b"\x00\x00\x00\x01" | ||||||
|  |         else: | ||||||
|  |             fill = (16 - (len(self.nonce) % 16)) % 16 + 8 | ||||||
|  |             ghash_in = (self.nonce + | ||||||
|  |                         b'\x00' * fill + | ||||||
|  |                         long_to_bytes(8 * len(self.nonce), 8)) | ||||||
|  |             j0 = _GHASH(hash_subkey, ghash_c).update(ghash_in).digest() | ||||||
|  | 
 | ||||||
|  |         # Step 3 - Prepare GCTR cipher for encryption/decryption | ||||||
|  |         nonce_ctr = j0[:12] | ||||||
|  |         iv_ctr = (bytes_to_long(j0) + 1) & 0xFFFFFFFF | ||||||
|  |         self._cipher = factory.new(key, | ||||||
|  |                                    self._factory.MODE_CTR, | ||||||
|  |                                    initial_value=iv_ctr, | ||||||
|  |                                    nonce=nonce_ctr, | ||||||
|  |                                    **cipher_params) | ||||||
|  | 
 | ||||||
|  |         # Step 5 - Bootstrat GHASH | ||||||
|  |         self._signer = _GHASH(hash_subkey, ghash_c) | ||||||
|  | 
 | ||||||
|  |         # Step 6 - Prepare GCTR cipher for GMAC | ||||||
|  |         self._tag_cipher = factory.new(key, | ||||||
|  |                                        self._factory.MODE_CTR, | ||||||
|  |                                        initial_value=j0, | ||||||
|  |                                        nonce=b"", | ||||||
|  |                                        **cipher_params) | ||||||
|  | 
 | ||||||
|  |         # Cache for data to authenticate | ||||||
|  |         self._cache = b"" | ||||||
|  | 
 | ||||||
|  |         self._status = MacStatus.PROCESSING_AUTH_DATA | ||||||
|  | 
 | ||||||
|  |     def update(self, assoc_data): | ||||||
|  |         """Protect associated data | ||||||
|  | 
 | ||||||
|  |         If there is any associated data, the caller has to invoke | ||||||
|  |         this function one or more times, before using | ||||||
|  |         ``decrypt`` or ``encrypt``. | ||||||
|  | 
 | ||||||
|  |         By *associated data* it is meant any data (e.g. packet headers) that | ||||||
|  |         will not be encrypted and will be transmitted in the clear. | ||||||
|  |         However, the receiver is still able to detect any modification to it. | ||||||
|  |         In GCM, the *associated data* is also called | ||||||
|  |         *additional authenticated data* (AAD). | ||||||
|  | 
 | ||||||
|  |         If there is no associated data, this method must not be called. | ||||||
|  | 
 | ||||||
|  |         The caller may split associated data in segments of any size, and | ||||||
|  |         invoke this method multiple times, each time with the next segment. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           assoc_data : bytes/bytearray/memoryview | ||||||
|  |             A piece of associated data. There are no restrictions on its size. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "update" not in self._next: | ||||||
|  |             raise TypeError("update() can only be called" | ||||||
|  |                             " immediately after initialization") | ||||||
|  | 
 | ||||||
|  |         self._next = ["update", "encrypt", "decrypt", | ||||||
|  |                       "digest", "verify"] | ||||||
|  | 
 | ||||||
|  |         self._update(assoc_data) | ||||||
|  |         self._auth_len += len(assoc_data) | ||||||
|  | 
 | ||||||
|  |         # See NIST SP 800 38D, 5.2.1.1 | ||||||
|  |         if self._auth_len > 2**64 - 1: | ||||||
|  |             raise ValueError("Additional Authenticated Data exceeds maximum length") | ||||||
|  | 
 | ||||||
|  |         return self | ||||||
|  | 
 | ||||||
|  |     def _update(self, data): | ||||||
|  |         assert(len(self._cache) < 16) | ||||||
|  | 
 | ||||||
|  |         if len(self._cache) > 0: | ||||||
|  |             filler = min(16 - len(self._cache), len(data)) | ||||||
|  |             self._cache += _copy_bytes(None, filler, data) | ||||||
|  |             data = data[filler:] | ||||||
|  | 
 | ||||||
|  |             if len(self._cache) < 16: | ||||||
|  |                 return | ||||||
|  | 
 | ||||||
|  |             # The cache is exactly one block | ||||||
|  |             self._signer.update(self._cache) | ||||||
|  |             self._cache = b"" | ||||||
|  | 
 | ||||||
|  |         update_len = len(data) // 16 * 16 | ||||||
|  |         self._cache = _copy_bytes(update_len, None, data) | ||||||
|  |         if update_len > 0: | ||||||
|  |             self._signer.update(data[:update_len]) | ||||||
|  | 
 | ||||||
|  |     def _pad_cache_and_update(self): | ||||||
|  |         assert(len(self._cache) < 16) | ||||||
|  | 
 | ||||||
|  |         # The authenticated data A is concatenated to the minimum | ||||||
|  |         # number of zero bytes (possibly none) such that the | ||||||
|  |         # - ciphertext C is aligned to the 16 byte boundary. | ||||||
|  |         #   See step 5 in section 7.1 | ||||||
|  |         # - ciphertext C is aligned to the 16 byte boundary. | ||||||
|  |         #   See step 6 in section 7.2 | ||||||
|  |         len_cache = len(self._cache) | ||||||
|  |         if len_cache > 0: | ||||||
|  |             self._update(b'\x00' * (16 - len_cache)) | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, plaintext, output=None): | ||||||
|  |         """Encrypt data with the key and the parameters set at initialization. | ||||||
|  | 
 | ||||||
|  |         A cipher object is stateful: once you have encrypted a message | ||||||
|  |         you cannot encrypt (or decrypt) another message using the same | ||||||
|  |         object. | ||||||
|  | 
 | ||||||
|  |         The data to encrypt can be broken up in two or | ||||||
|  |         more pieces and `encrypt` can be called multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.encrypt(a) + c.encrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.encrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         This function does not add any padding to the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           plaintext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to encrypt. | ||||||
|  |             It can be of any length. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the ciphertext must be written to. | ||||||
|  |             If ``None``, the ciphertext is returned. | ||||||
|  |         :Return: | ||||||
|  |           If ``output`` is ``None``, the ciphertext as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "encrypt" not in self._next: | ||||||
|  |             raise TypeError("encrypt() can only be called after" | ||||||
|  |                             " initialization or an update()") | ||||||
|  |         self._next = ["encrypt", "digest"] | ||||||
|  | 
 | ||||||
|  |         ciphertext = self._cipher.encrypt(plaintext, output=output) | ||||||
|  | 
 | ||||||
|  |         if self._status == MacStatus.PROCESSING_AUTH_DATA: | ||||||
|  |             self._pad_cache_and_update() | ||||||
|  |             self._status = MacStatus.PROCESSING_CIPHERTEXT | ||||||
|  | 
 | ||||||
|  |         self._update(ciphertext if output is None else output) | ||||||
|  |         self._msg_len += len(plaintext) | ||||||
|  | 
 | ||||||
|  |         # See NIST SP 800 38D, 5.2.1.1 | ||||||
|  |         if self._msg_len > 2**39 - 256: | ||||||
|  |             raise ValueError("Plaintext exceeds maximum length") | ||||||
|  | 
 | ||||||
|  |         return ciphertext | ||||||
|  | 
 | ||||||
|  |     def decrypt(self, ciphertext, output=None): | ||||||
|  |         """Decrypt data with the key and the parameters set at initialization. | ||||||
|  | 
 | ||||||
|  |         A cipher object is stateful: once you have decrypted a message | ||||||
|  |         you cannot decrypt (or encrypt) another message with the same | ||||||
|  |         object. | ||||||
|  | 
 | ||||||
|  |         The data to decrypt can be broken up in two or | ||||||
|  |         more pieces and `decrypt` can be called multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.decrypt(a) + c.decrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.decrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         This function does not remove any padding from the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           ciphertext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to decrypt. | ||||||
|  |             It can be of any length. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the plaintext must be written to. | ||||||
|  |             If ``None``, the plaintext is returned. | ||||||
|  |         :Return: | ||||||
|  |           If ``output`` is ``None``, the plaintext as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "decrypt" not in self._next: | ||||||
|  |             raise TypeError("decrypt() can only be called" | ||||||
|  |                             " after initialization or an update()") | ||||||
|  |         self._next = ["decrypt", "verify"] | ||||||
|  | 
 | ||||||
|  |         if self._status == MacStatus.PROCESSING_AUTH_DATA: | ||||||
|  |             self._pad_cache_and_update() | ||||||
|  |             self._status = MacStatus.PROCESSING_CIPHERTEXT | ||||||
|  | 
 | ||||||
|  |         self._update(ciphertext) | ||||||
|  |         self._msg_len += len(ciphertext) | ||||||
|  | 
 | ||||||
|  |         return self._cipher.decrypt(ciphertext, output=output) | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         """Compute the *binary* MAC tag in an AEAD mode. | ||||||
|  | 
 | ||||||
|  |         The caller invokes this function at the very end. | ||||||
|  | 
 | ||||||
|  |         This method returns the MAC that shall be sent to the receiver, | ||||||
|  |         together with the ciphertext. | ||||||
|  | 
 | ||||||
|  |         :Return: the MAC, as a byte string. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "digest" not in self._next: | ||||||
|  |             raise TypeError("digest() cannot be called when decrypting" | ||||||
|  |                             " or validating a message") | ||||||
|  |         self._next = ["digest"] | ||||||
|  | 
 | ||||||
|  |         return self._compute_mac() | ||||||
|  | 
 | ||||||
|  |     def _compute_mac(self): | ||||||
|  |         """Compute MAC without any FSM checks.""" | ||||||
|  | 
 | ||||||
|  |         if self._tag: | ||||||
|  |             return self._tag | ||||||
|  | 
 | ||||||
|  |         # Step 5 in NIST SP 800-38D, Algorithm 4 - Compute S | ||||||
|  |         self._pad_cache_and_update() | ||||||
|  |         self._update(long_to_bytes(8 * self._auth_len, 8)) | ||||||
|  |         self._update(long_to_bytes(8 * self._msg_len, 8)) | ||||||
|  |         s_tag = self._signer.digest() | ||||||
|  | 
 | ||||||
|  |         # Step 6 - Compute T | ||||||
|  |         self._tag = self._tag_cipher.encrypt(s_tag)[:self._mac_len] | ||||||
|  | 
 | ||||||
|  |         return self._tag | ||||||
|  | 
 | ||||||
|  |     def hexdigest(self): | ||||||
|  |         """Compute the *printable* MAC tag. | ||||||
|  | 
 | ||||||
|  |         This method is like `digest`. | ||||||
|  | 
 | ||||||
|  |         :Return: the MAC, as a hexadecimal string. | ||||||
|  |         """ | ||||||
|  |         return "".join(["%02x" % bord(x) for x in self.digest()]) | ||||||
|  | 
 | ||||||
|  |     def verify(self, received_mac_tag): | ||||||
|  |         """Validate the *binary* MAC tag. | ||||||
|  | 
 | ||||||
|  |         The caller invokes this function at the very end. | ||||||
|  | 
 | ||||||
|  |         This method checks if the decrypted message is indeed valid | ||||||
|  |         (that is, if the key is correct) and it has not been | ||||||
|  |         tampered with while in transit. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           received_mac_tag : bytes/bytearray/memoryview | ||||||
|  |             This is the *binary* MAC, as received from the sender. | ||||||
|  |         :Raises ValueError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "verify" not in self._next: | ||||||
|  |             raise TypeError("verify() cannot be called" | ||||||
|  |                             " when encrypting a message") | ||||||
|  |         self._next = ["verify"] | ||||||
|  | 
 | ||||||
|  |         secret = get_random_bytes(16) | ||||||
|  | 
 | ||||||
|  |         mac1 = BLAKE2s.new(digest_bits=160, key=secret, | ||||||
|  |                            data=self._compute_mac()) | ||||||
|  |         mac2 = BLAKE2s.new(digest_bits=160, key=secret, | ||||||
|  |                            data=received_mac_tag) | ||||||
|  | 
 | ||||||
|  |         if mac1.digest() != mac2.digest(): | ||||||
|  |             raise ValueError("MAC check failed") | ||||||
|  | 
 | ||||||
|  |     def hexverify(self, hex_mac_tag): | ||||||
|  |         """Validate the *printable* MAC tag. | ||||||
|  | 
 | ||||||
|  |         This method is like `verify`. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           hex_mac_tag : string | ||||||
|  |             This is the *printable* MAC, as received from the sender. | ||||||
|  |         :Raises ValueError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self.verify(unhexlify(hex_mac_tag)) | ||||||
|  | 
 | ||||||
|  |     def encrypt_and_digest(self, plaintext, output=None): | ||||||
|  |         """Perform encrypt() and digest() in one step. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           plaintext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to encrypt. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the ciphertext must be written to. | ||||||
|  |             If ``None``, the ciphertext is returned. | ||||||
|  |         :Return: | ||||||
|  |             a tuple with two items: | ||||||
|  | 
 | ||||||
|  |             - the ciphertext, as ``bytes`` | ||||||
|  |             - the MAC tag, as ``bytes`` | ||||||
|  | 
 | ||||||
|  |             The first item becomes ``None`` when the ``output`` parameter | ||||||
|  |             specified a location for the result. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         return self.encrypt(plaintext, output=output), self.digest() | ||||||
|  | 
 | ||||||
|  |     def decrypt_and_verify(self, ciphertext, received_mac_tag, output=None): | ||||||
|  |         """Perform decrypt() and verify() in one step. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           ciphertext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to decrypt. | ||||||
|  |           received_mac_tag : byte string | ||||||
|  |             This is the *binary* MAC, as received from the sender. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the plaintext must be written to. | ||||||
|  |             If ``None``, the plaintext is returned. | ||||||
|  |         :Return: the plaintext as ``bytes`` or ``None`` when the ``output`` | ||||||
|  |             parameter specified a location for the result. | ||||||
|  |         :Raises ValueError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         plaintext = self.decrypt(ciphertext, output=output) | ||||||
|  |         self.verify(received_mac_tag) | ||||||
|  |         return plaintext | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_gcm_cipher(factory, **kwargs): | ||||||
|  |     """Create a new block cipher, configured in Galois Counter Mode (GCM). | ||||||
|  | 
 | ||||||
|  |     :Parameters: | ||||||
|  |       factory : module | ||||||
|  |         A block cipher module, taken from `Cryptodome.Cipher`. | ||||||
|  |         The cipher must have block length of 16 bytes. | ||||||
|  |         GCM has been only defined for `Cryptodome.Cipher.AES`. | ||||||
|  | 
 | ||||||
|  |     :Keywords: | ||||||
|  |       key : bytes/bytearray/memoryview | ||||||
|  |         The secret key to use in the symmetric cipher. | ||||||
|  |         It must be 16 (e.g. *AES-128*), 24 (e.g. *AES-192*) | ||||||
|  |         or 32 (e.g. *AES-256*) bytes long. | ||||||
|  | 
 | ||||||
|  |       nonce : bytes/bytearray/memoryview | ||||||
|  |         A value that must never be reused for any other encryption. | ||||||
|  | 
 | ||||||
|  |         There are no restrictions on its length, | ||||||
|  |         but it is recommended to use at least 16 bytes. | ||||||
|  | 
 | ||||||
|  |         The nonce shall never repeat for two | ||||||
|  |         different messages encrypted with the same key, | ||||||
|  |         but it does not need to be random. | ||||||
|  | 
 | ||||||
|  |         If not provided, a 16 byte nonce will be randomly created. | ||||||
|  | 
 | ||||||
|  |       mac_len : integer | ||||||
|  |         Length of the MAC, in bytes. | ||||||
|  |         It must be no larger than 16 bytes (which is the default). | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         key = kwargs.pop("key") | ||||||
|  |     except KeyError as e: | ||||||
|  |         raise TypeError("Missing parameter:" + str(e)) | ||||||
|  | 
 | ||||||
|  |     nonce = kwargs.pop("nonce", None) | ||||||
|  |     if nonce is None: | ||||||
|  |         nonce = get_random_bytes(16) | ||||||
|  |     mac_len = kwargs.pop("mac_len", 16) | ||||||
|  | 
 | ||||||
|  |     # Not documented - only used for testing | ||||||
|  |     use_clmul = kwargs.pop("use_clmul", True) | ||||||
|  |     if use_clmul and _ghash_clmul: | ||||||
|  |         ghash_c = _ghash_clmul | ||||||
|  |     else: | ||||||
|  |         ghash_c = _ghash_portable | ||||||
|  | 
 | ||||||
|  |     return GcmMode(factory, key, nonce, mac_len, kwargs, ghash_c) | ||||||
							
								
								
									
										45
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_gcm.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_gcm.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,45 @@ | ||||||
|  | from types import ModuleType | ||||||
|  | from typing import Union, Tuple, Dict, overload, Optional | ||||||
|  | 
 | ||||||
|  | __all__ = ['GcmMode'] | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | class GcmMode(object): | ||||||
|  |     block_size: int | ||||||
|  |     nonce: Buffer | ||||||
|  |      | ||||||
|  |     def __init__(self, | ||||||
|  |                  factory: ModuleType, | ||||||
|  |                  key: Buffer, | ||||||
|  |                  nonce: Buffer, | ||||||
|  |                  mac_len: int, | ||||||
|  |                  cipher_params: Dict) -> None: ... | ||||||
|  |      | ||||||
|  |     def update(self, assoc_data: Buffer) -> GcmMode: ... | ||||||
|  | 
 | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  | 
 | ||||||
|  |     def digest(self) -> bytes: ... | ||||||
|  |     def hexdigest(self) -> str: ... | ||||||
|  |     def verify(self, received_mac_tag: Buffer) -> None: ... | ||||||
|  |     def hexverify(self, hex_mac_tag: str) -> None: ... | ||||||
|  | 
 | ||||||
|  |     @overload | ||||||
|  |     def encrypt_and_digest(self, | ||||||
|  |                            plaintext: Buffer) -> Tuple[bytes, bytes]: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt_and_digest(self, | ||||||
|  |                            plaintext: Buffer, | ||||||
|  |                            output: Buffer) -> Tuple[None, bytes]: ... | ||||||
|  |     def decrypt_and_verify(self, | ||||||
|  |                            ciphertext: Buffer, | ||||||
|  |                            received_mac_tag: Buffer, | ||||||
|  |                            output: Optional[Union[bytearray, memoryview]] = ...) -> bytes: ... | ||||||
							
								
								
									
										532
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ocb.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										532
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ocb.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,532 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2014, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Offset Codebook (OCB) mode. | ||||||
|  | 
 | ||||||
|  | OCB is Authenticated Encryption with Associated Data (AEAD) cipher mode | ||||||
|  | designed by Prof. Phillip Rogaway and specified in `RFC7253`_. | ||||||
|  | 
 | ||||||
|  | The algorithm provides both authenticity and privacy, it is very efficient, | ||||||
|  | it uses only one key and it can be used in online mode (so that encryption | ||||||
|  | or decryption can start before the end of the message is available). | ||||||
|  | 
 | ||||||
|  | This module implements the third and last variant of OCB (OCB3) and it only | ||||||
|  | works in combination with a 128-bit block symmetric cipher, like AES. | ||||||
|  | 
 | ||||||
|  | OCB is patented in US but `free licenses`_ exist for software implementations | ||||||
|  | meant for non-military purposes. | ||||||
|  | 
 | ||||||
|  | Example: | ||||||
|  |     >>> from Cryptodome.Cipher import AES | ||||||
|  |     >>> from Cryptodome.Random import get_random_bytes | ||||||
|  |     >>> | ||||||
|  |     >>> key = get_random_bytes(32) | ||||||
|  |     >>> cipher = AES.new(key, AES.MODE_OCB) | ||||||
|  |     >>> plaintext = b"Attack at dawn" | ||||||
|  |     >>> ciphertext, mac = cipher.encrypt_and_digest(plaintext) | ||||||
|  |     >>> # Deliver cipher.nonce, ciphertext and mac | ||||||
|  |     ... | ||||||
|  |     >>> cipher = AES.new(key, AES.MODE_OCB, nonce=nonce) | ||||||
|  |     >>> try: | ||||||
|  |     >>>     plaintext = cipher.decrypt_and_verify(ciphertext, mac) | ||||||
|  |     >>> except ValueError: | ||||||
|  |     >>>     print "Invalid message" | ||||||
|  |     >>> else: | ||||||
|  |     >>>     print plaintext | ||||||
|  | 
 | ||||||
|  | :undocumented: __package__ | ||||||
|  | 
 | ||||||
|  | .. _RFC7253: http://www.rfc-editor.org/info/rfc7253 | ||||||
|  | .. _free licenses: http://web.cs.ucdavis.edu/~rogaway/ocb/license.htm | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | import struct | ||||||
|  | from binascii import unhexlify | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import bord, _copy_bytes, bchr | ||||||
|  | from Cryptodome.Util.number import long_to_bytes, bytes_to_long | ||||||
|  | from Cryptodome.Util.strxor import strxor | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Hash import BLAKE2s | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, | ||||||
|  |                                   create_string_buffer, get_raw_buffer, | ||||||
|  |                                   SmartPointer, c_size_t, c_uint8_ptr, | ||||||
|  |                                   is_buffer) | ||||||
|  | 
 | ||||||
|  | _raw_ocb_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_ocb", """ | ||||||
|  |                                     int OCB_start_operation(void *cipher, | ||||||
|  |                                         const uint8_t *offset_0, | ||||||
|  |                                         size_t offset_0_len, | ||||||
|  |                                         void **pState); | ||||||
|  |                                     int OCB_encrypt(void *state, | ||||||
|  |                                         const uint8_t *in, | ||||||
|  |                                         uint8_t *out, | ||||||
|  |                                         size_t data_len); | ||||||
|  |                                     int OCB_decrypt(void *state, | ||||||
|  |                                         const uint8_t *in, | ||||||
|  |                                         uint8_t *out, | ||||||
|  |                                         size_t data_len); | ||||||
|  |                                     int OCB_update(void *state, | ||||||
|  |                                         const uint8_t *in, | ||||||
|  |                                         size_t data_len); | ||||||
|  |                                     int OCB_digest(void *state, | ||||||
|  |                                         uint8_t *tag, | ||||||
|  |                                         size_t tag_len); | ||||||
|  |                                     int OCB_stop_operation(void *state); | ||||||
|  |                                     """) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class OcbMode(object): | ||||||
|  |     """Offset Codebook (OCB) mode. | ||||||
|  | 
 | ||||||
|  |     :undocumented: __init__ | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, factory, nonce, mac_len, cipher_params): | ||||||
|  | 
 | ||||||
|  |         if factory.block_size != 16: | ||||||
|  |             raise ValueError("OCB mode is only available for ciphers" | ||||||
|  |                              " that operate on 128 bits blocks") | ||||||
|  | 
 | ||||||
|  |         self.block_size = 16 | ||||||
|  |         """The block size of the underlying cipher, in bytes.""" | ||||||
|  | 
 | ||||||
|  |         self.nonce = _copy_bytes(None, None, nonce) | ||||||
|  |         """Nonce used for this session.""" | ||||||
|  |         if len(nonce) not in range(1, 16): | ||||||
|  |             raise ValueError("Nonce must be at most 15 bytes long") | ||||||
|  |         if not is_buffer(nonce): | ||||||
|  |             raise TypeError("Nonce must be bytes, bytearray or memoryview") | ||||||
|  | 
 | ||||||
|  |         self._mac_len = mac_len | ||||||
|  |         if not 8 <= mac_len <= 16: | ||||||
|  |             raise ValueError("MAC tag must be between 8 and 16 bytes long") | ||||||
|  | 
 | ||||||
|  |         # Cache for MAC tag | ||||||
|  |         self._mac_tag = None | ||||||
|  | 
 | ||||||
|  |         # Cache for unaligned associated data | ||||||
|  |         self._cache_A = b"" | ||||||
|  | 
 | ||||||
|  |         # Cache for unaligned ciphertext/plaintext | ||||||
|  |         self._cache_P = b"" | ||||||
|  | 
 | ||||||
|  |         # Allowed transitions after initialization | ||||||
|  |         self._next = ["update", "encrypt", "decrypt", | ||||||
|  |                       "digest", "verify"] | ||||||
|  | 
 | ||||||
|  |         # Compute Offset_0 | ||||||
|  |         params_without_key = dict(cipher_params) | ||||||
|  |         key = params_without_key.pop("key") | ||||||
|  | 
 | ||||||
|  |         taglen_mod128 = (self._mac_len * 8) % 128 | ||||||
|  |         if len(self.nonce) < 15: | ||||||
|  |             nonce = bchr(taglen_mod128 << 1) +\ | ||||||
|  |                     b'\x00' * (14 - len(nonce)) +\ | ||||||
|  |                     b'\x01' +\ | ||||||
|  |                     self.nonce | ||||||
|  |         else: | ||||||
|  |             nonce = bchr((taglen_mod128 << 1) | 0x01) +\ | ||||||
|  |                     self.nonce | ||||||
|  | 
 | ||||||
|  |         bottom_bits = bord(nonce[15]) & 0x3F    # 6 bits, 0..63 | ||||||
|  |         top_bits = bord(nonce[15]) & 0xC0       # 2 bits | ||||||
|  | 
 | ||||||
|  |         ktop_cipher = factory.new(key, | ||||||
|  |                                   factory.MODE_ECB, | ||||||
|  |                                   **params_without_key) | ||||||
|  |         ktop = ktop_cipher.encrypt(struct.pack('15sB', | ||||||
|  |                                                nonce[:15], | ||||||
|  |                                                top_bits)) | ||||||
|  | 
 | ||||||
|  |         stretch = ktop + strxor(ktop[:8], ktop[1:9])    # 192 bits | ||||||
|  |         offset_0 = long_to_bytes(bytes_to_long(stretch) >> | ||||||
|  |                                  (64 - bottom_bits), 24)[8:] | ||||||
|  | 
 | ||||||
|  |         # Create low-level cipher instance | ||||||
|  |         raw_cipher = factory._create_base_cipher(cipher_params) | ||||||
|  |         if cipher_params: | ||||||
|  |             raise TypeError("Unknown keywords: " + str(cipher_params)) | ||||||
|  | 
 | ||||||
|  |         self._state = VoidPointer() | ||||||
|  |         result = _raw_ocb_lib.OCB_start_operation(raw_cipher.get(), | ||||||
|  |                                                   offset_0, | ||||||
|  |                                                   c_size_t(len(offset_0)), | ||||||
|  |                                                   self._state.address_of()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating the OCB mode" | ||||||
|  |                              % result) | ||||||
|  | 
 | ||||||
|  |         # Ensure that object disposal of this Python object will (eventually) | ||||||
|  |         # free the memory allocated by the raw library for the cipher mode | ||||||
|  |         self._state = SmartPointer(self._state.get(), | ||||||
|  |                                    _raw_ocb_lib.OCB_stop_operation) | ||||||
|  | 
 | ||||||
|  |         # Memory allocated for the underlying block cipher is now owed | ||||||
|  |         # by the cipher mode | ||||||
|  |         raw_cipher.release() | ||||||
|  | 
 | ||||||
|  |     def _update(self, assoc_data, assoc_data_len): | ||||||
|  |         result = _raw_ocb_lib.OCB_update(self._state.get(), | ||||||
|  |                                          c_uint8_ptr(assoc_data), | ||||||
|  |                                          c_size_t(assoc_data_len)) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while computing MAC in OCB mode" % result) | ||||||
|  | 
 | ||||||
|  |     def update(self, assoc_data): | ||||||
|  |         """Process the associated data. | ||||||
|  | 
 | ||||||
|  |         If there is any associated data, the caller has to invoke | ||||||
|  |         this method one or more times, before using | ||||||
|  |         ``decrypt`` or ``encrypt``. | ||||||
|  | 
 | ||||||
|  |         By *associated data* it is meant any data (e.g. packet headers) that | ||||||
|  |         will not be encrypted and will be transmitted in the clear. | ||||||
|  |         However, the receiver shall still able to detect modifications. | ||||||
|  | 
 | ||||||
|  |         If there is no associated data, this method must not be called. | ||||||
|  | 
 | ||||||
|  |         The caller may split associated data in segments of any size, and | ||||||
|  |         invoke this method multiple times, each time with the next segment. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           assoc_data : bytes/bytearray/memoryview | ||||||
|  |             A piece of associated data. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "update" not in self._next: | ||||||
|  |             raise TypeError("update() can only be called" | ||||||
|  |                             " immediately after initialization") | ||||||
|  | 
 | ||||||
|  |         self._next = ["encrypt", "decrypt", "digest", | ||||||
|  |                       "verify", "update"] | ||||||
|  | 
 | ||||||
|  |         if len(self._cache_A) > 0: | ||||||
|  |             filler = min(16 - len(self._cache_A), len(assoc_data)) | ||||||
|  |             self._cache_A += _copy_bytes(None, filler, assoc_data) | ||||||
|  |             assoc_data = assoc_data[filler:] | ||||||
|  | 
 | ||||||
|  |             if len(self._cache_A) < 16: | ||||||
|  |                 return self | ||||||
|  | 
 | ||||||
|  |             # Clear the cache, and proceeding with any other aligned data | ||||||
|  |             self._cache_A, seg = b"", self._cache_A | ||||||
|  |             self.update(seg) | ||||||
|  | 
 | ||||||
|  |         update_len = len(assoc_data) // 16 * 16 | ||||||
|  |         self._cache_A = _copy_bytes(update_len, None, assoc_data) | ||||||
|  |         self._update(assoc_data, update_len) | ||||||
|  |         return self | ||||||
|  | 
 | ||||||
|  |     def _transcrypt_aligned(self, in_data, in_data_len, | ||||||
|  |                             trans_func, trans_desc): | ||||||
|  | 
 | ||||||
|  |         out_data = create_string_buffer(in_data_len) | ||||||
|  |         result = trans_func(self._state.get(), | ||||||
|  |                             in_data, | ||||||
|  |                             out_data, | ||||||
|  |                             c_size_t(in_data_len)) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while %sing in OCB mode" | ||||||
|  |                              % (result, trans_desc)) | ||||||
|  |         return get_raw_buffer(out_data) | ||||||
|  | 
 | ||||||
|  |     def _transcrypt(self, in_data, trans_func, trans_desc): | ||||||
|  |         # Last piece to encrypt/decrypt | ||||||
|  |         if in_data is None: | ||||||
|  |             out_data = self._transcrypt_aligned(self._cache_P, | ||||||
|  |                                                 len(self._cache_P), | ||||||
|  |                                                 trans_func, | ||||||
|  |                                                 trans_desc) | ||||||
|  |             self._cache_P = b"" | ||||||
|  |             return out_data | ||||||
|  | 
 | ||||||
|  |         # Try to fill up the cache, if it already contains something | ||||||
|  |         prefix = b"" | ||||||
|  |         if len(self._cache_P) > 0: | ||||||
|  |             filler = min(16 - len(self._cache_P), len(in_data)) | ||||||
|  |             self._cache_P += _copy_bytes(None, filler, in_data) | ||||||
|  |             in_data = in_data[filler:] | ||||||
|  | 
 | ||||||
|  |             if len(self._cache_P) < 16: | ||||||
|  |                 # We could not manage to fill the cache, so there is certainly | ||||||
|  |                 # no output yet. | ||||||
|  |                 return b"" | ||||||
|  | 
 | ||||||
|  |             # Clear the cache, and proceeding with any other aligned data | ||||||
|  |             prefix = self._transcrypt_aligned(self._cache_P, | ||||||
|  |                                               len(self._cache_P), | ||||||
|  |                                               trans_func, | ||||||
|  |                                               trans_desc) | ||||||
|  |             self._cache_P = b"" | ||||||
|  | 
 | ||||||
|  |         # Process data in multiples of the block size | ||||||
|  |         trans_len = len(in_data) // 16 * 16 | ||||||
|  |         result = self._transcrypt_aligned(c_uint8_ptr(in_data), | ||||||
|  |                                           trans_len, | ||||||
|  |                                           trans_func, | ||||||
|  |                                           trans_desc) | ||||||
|  |         if prefix: | ||||||
|  |             result = prefix + result | ||||||
|  | 
 | ||||||
|  |         # Left-over | ||||||
|  |         self._cache_P = _copy_bytes(trans_len, None, in_data) | ||||||
|  | 
 | ||||||
|  |         return result | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, plaintext=None): | ||||||
|  |         """Encrypt the next piece of plaintext. | ||||||
|  | 
 | ||||||
|  |         After the entire plaintext has been passed (but before `digest`), | ||||||
|  |         you **must** call this method one last time with no arguments to collect | ||||||
|  |         the final piece of ciphertext. | ||||||
|  | 
 | ||||||
|  |         If possible, use the method `encrypt_and_digest` instead. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           plaintext : bytes/bytearray/memoryview | ||||||
|  |             The next piece of data to encrypt or ``None`` to signify | ||||||
|  |             that encryption has finished and that any remaining ciphertext | ||||||
|  |             has to be produced. | ||||||
|  |         :Return: | ||||||
|  |             the ciphertext, as a byte string. | ||||||
|  |             Its length may not match the length of the *plaintext*. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "encrypt" not in self._next: | ||||||
|  |             raise TypeError("encrypt() can only be called after" | ||||||
|  |                             " initialization or an update()") | ||||||
|  | 
 | ||||||
|  |         if plaintext is None: | ||||||
|  |             self._next = ["digest"] | ||||||
|  |         else: | ||||||
|  |             self._next = ["encrypt"] | ||||||
|  |         return self._transcrypt(plaintext, _raw_ocb_lib.OCB_encrypt, "encrypt") | ||||||
|  | 
 | ||||||
|  |     def decrypt(self, ciphertext=None): | ||||||
|  |         """Decrypt the next piece of ciphertext. | ||||||
|  | 
 | ||||||
|  |         After the entire ciphertext has been passed (but before `verify`), | ||||||
|  |         you **must** call this method one last time with no arguments to collect | ||||||
|  |         the remaining piece of plaintext. | ||||||
|  | 
 | ||||||
|  |         If possible, use the method `decrypt_and_verify` instead. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           ciphertext : bytes/bytearray/memoryview | ||||||
|  |             The next piece of data to decrypt or ``None`` to signify | ||||||
|  |             that decryption has finished and that any remaining plaintext | ||||||
|  |             has to be produced. | ||||||
|  |         :Return: | ||||||
|  |             the plaintext, as a byte string. | ||||||
|  |             Its length may not match the length of the *ciphertext*. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "decrypt" not in self._next: | ||||||
|  |             raise TypeError("decrypt() can only be called after" | ||||||
|  |                             " initialization or an update()") | ||||||
|  | 
 | ||||||
|  |         if ciphertext is None: | ||||||
|  |             self._next = ["verify"] | ||||||
|  |         else: | ||||||
|  |             self._next = ["decrypt"] | ||||||
|  |         return self._transcrypt(ciphertext, | ||||||
|  |                                 _raw_ocb_lib.OCB_decrypt, | ||||||
|  |                                 "decrypt") | ||||||
|  | 
 | ||||||
|  |     def _compute_mac_tag(self): | ||||||
|  | 
 | ||||||
|  |         if self._mac_tag is not None: | ||||||
|  |             return | ||||||
|  | 
 | ||||||
|  |         if self._cache_A: | ||||||
|  |             self._update(self._cache_A, len(self._cache_A)) | ||||||
|  |             self._cache_A = b"" | ||||||
|  | 
 | ||||||
|  |         mac_tag = create_string_buffer(16) | ||||||
|  |         result = _raw_ocb_lib.OCB_digest(self._state.get(), | ||||||
|  |                                          mac_tag, | ||||||
|  |                                          c_size_t(len(mac_tag)) | ||||||
|  |                                          ) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while computing digest in OCB mode" | ||||||
|  |                              % result) | ||||||
|  |         self._mac_tag = get_raw_buffer(mac_tag)[:self._mac_len] | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         """Compute the *binary* MAC tag. | ||||||
|  | 
 | ||||||
|  |         Call this method after the final `encrypt` (the one with no arguments) | ||||||
|  |         to obtain the MAC tag. | ||||||
|  | 
 | ||||||
|  |         The MAC tag is needed by the receiver to determine authenticity | ||||||
|  |         of the message. | ||||||
|  | 
 | ||||||
|  |         :Return: the MAC, as a byte string. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "digest" not in self._next: | ||||||
|  |             raise TypeError("digest() cannot be called now for this cipher") | ||||||
|  | 
 | ||||||
|  |         assert(len(self._cache_P) == 0) | ||||||
|  | 
 | ||||||
|  |         self._next = ["digest"] | ||||||
|  | 
 | ||||||
|  |         if self._mac_tag is None: | ||||||
|  |             self._compute_mac_tag() | ||||||
|  | 
 | ||||||
|  |         return self._mac_tag | ||||||
|  | 
 | ||||||
|  |     def hexdigest(self): | ||||||
|  |         """Compute the *printable* MAC tag. | ||||||
|  | 
 | ||||||
|  |         This method is like `digest`. | ||||||
|  | 
 | ||||||
|  |         :Return: the MAC, as a hexadecimal string. | ||||||
|  |         """ | ||||||
|  |         return "".join(["%02x" % bord(x) for x in self.digest()]) | ||||||
|  | 
 | ||||||
|  |     def verify(self, received_mac_tag): | ||||||
|  |         """Validate the *binary* MAC tag. | ||||||
|  | 
 | ||||||
|  |         Call this method after the final `decrypt` (the one with no arguments) | ||||||
|  |         to check if the message is authentic and valid. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           received_mac_tag : bytes/bytearray/memoryview | ||||||
|  |             This is the *binary* MAC, as received from the sender. | ||||||
|  |         :Raises ValueError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "verify" not in self._next: | ||||||
|  |             raise TypeError("verify() cannot be called now for this cipher") | ||||||
|  | 
 | ||||||
|  |         assert(len(self._cache_P) == 0) | ||||||
|  | 
 | ||||||
|  |         self._next = ["verify"] | ||||||
|  | 
 | ||||||
|  |         if self._mac_tag is None: | ||||||
|  |             self._compute_mac_tag() | ||||||
|  | 
 | ||||||
|  |         secret = get_random_bytes(16) | ||||||
|  |         mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=self._mac_tag) | ||||||
|  |         mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=received_mac_tag) | ||||||
|  | 
 | ||||||
|  |         if mac1.digest() != mac2.digest(): | ||||||
|  |             raise ValueError("MAC check failed") | ||||||
|  | 
 | ||||||
|  |     def hexverify(self, hex_mac_tag): | ||||||
|  |         """Validate the *printable* MAC tag. | ||||||
|  | 
 | ||||||
|  |         This method is like `verify`. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           hex_mac_tag : string | ||||||
|  |             This is the *printable* MAC, as received from the sender. | ||||||
|  |         :Raises ValueError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self.verify(unhexlify(hex_mac_tag)) | ||||||
|  | 
 | ||||||
|  |     def encrypt_and_digest(self, plaintext): | ||||||
|  |         """Encrypt the message and create the MAC tag in one step. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           plaintext : bytes/bytearray/memoryview | ||||||
|  |             The entire message to encrypt. | ||||||
|  |         :Return: | ||||||
|  |             a tuple with two byte strings: | ||||||
|  | 
 | ||||||
|  |             - the encrypted data | ||||||
|  |             - the MAC | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         return self.encrypt(plaintext) + self.encrypt(), self.digest() | ||||||
|  | 
 | ||||||
|  |     def decrypt_and_verify(self, ciphertext, received_mac_tag): | ||||||
|  |         """Decrypted the message and verify its authenticity in one step. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           ciphertext : bytes/bytearray/memoryview | ||||||
|  |             The entire message to decrypt. | ||||||
|  |           received_mac_tag : byte string | ||||||
|  |             This is the *binary* MAC, as received from the sender. | ||||||
|  | 
 | ||||||
|  |         :Return: the decrypted data (byte string). | ||||||
|  |         :Raises ValueError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         plaintext = self.decrypt(ciphertext) + self.decrypt() | ||||||
|  |         self.verify(received_mac_tag) | ||||||
|  |         return plaintext | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_ocb_cipher(factory, **kwargs): | ||||||
|  |     """Create a new block cipher, configured in OCB mode. | ||||||
|  | 
 | ||||||
|  |     :Parameters: | ||||||
|  |       factory : module | ||||||
|  |         A symmetric cipher module from `Cryptodome.Cipher` | ||||||
|  |         (like `Cryptodome.Cipher.AES`). | ||||||
|  | 
 | ||||||
|  |     :Keywords: | ||||||
|  |       nonce : bytes/bytearray/memoryview | ||||||
|  |         A  value that must never be reused for any other encryption. | ||||||
|  |         Its length can vary from 1 to 15 bytes. | ||||||
|  |         If not specified, a random 15 bytes long nonce is generated. | ||||||
|  | 
 | ||||||
|  |       mac_len : integer | ||||||
|  |         Length of the MAC, in bytes. | ||||||
|  |         It must be in the range ``[8..16]``. | ||||||
|  |         The default is 16 (128 bits). | ||||||
|  | 
 | ||||||
|  |     Any other keyword will be passed to the underlying block cipher. | ||||||
|  |     See the relevant documentation for details (at least ``key`` will need | ||||||
|  |     to be present). | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         nonce = kwargs.pop("nonce", None) | ||||||
|  |         if nonce is None: | ||||||
|  |             nonce = get_random_bytes(15) | ||||||
|  |         mac_len = kwargs.pop("mac_len", 16) | ||||||
|  |     except KeyError as e: | ||||||
|  |         raise TypeError("Keyword missing: " + str(e)) | ||||||
|  | 
 | ||||||
|  |     return OcbMode(factory, nonce, mac_len, kwargs) | ||||||
							
								
								
									
										36
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ocb.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ocb.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,36 @@ | ||||||
|  | from types import ModuleType | ||||||
|  | from typing import Union, Any, Optional, Tuple, Dict, overload | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | class OcbMode(object): | ||||||
|  |     block_size: int | ||||||
|  |     nonce: Buffer | ||||||
|  | 
 | ||||||
|  |     def __init__(self, | ||||||
|  |                  factory: ModuleType, | ||||||
|  |                  nonce: Buffer, | ||||||
|  |                  mac_len: int, | ||||||
|  |                  cipher_params: Dict) -> None: ... | ||||||
|  |      | ||||||
|  |     def update(self, assoc_data: Buffer) -> OcbMode: ... | ||||||
|  | 
 | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  | 
 | ||||||
|  |     def digest(self) -> bytes: ... | ||||||
|  |     def hexdigest(self) -> str: ... | ||||||
|  |     def verify(self, received_mac_tag: Buffer) -> None: ... | ||||||
|  |     def hexverify(self, hex_mac_tag: str) -> None: ... | ||||||
|  | 
 | ||||||
|  |     def encrypt_and_digest(self, | ||||||
|  |                            plaintext: Buffer) -> Tuple[bytes, bytes]: ... | ||||||
|  |     def decrypt_and_verify(self, | ||||||
|  |                            ciphertext: Buffer, | ||||||
|  |                            received_mac_tag: Buffer) -> bytes: ... | ||||||
							
								
								
									
										282
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ofb.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										282
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ofb.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,282 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | #  Cipher/mode_ofb.py : OFB mode | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Output Feedback (CFB) mode. | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | __all__ = ['OfbMode'] | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import _copy_bytes | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, | ||||||
|  |                                   create_string_buffer, get_raw_buffer, | ||||||
|  |                                   SmartPointer, c_size_t, c_uint8_ptr, | ||||||
|  |                                   is_writeable_buffer) | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | 
 | ||||||
|  | raw_ofb_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_ofb", """ | ||||||
|  |                         int OFB_start_operation(void *cipher, | ||||||
|  |                                                 const uint8_t iv[], | ||||||
|  |                                                 size_t iv_len, | ||||||
|  |                                                 void **pResult); | ||||||
|  |                         int OFB_encrypt(void *ofbState, | ||||||
|  |                                         const uint8_t *in, | ||||||
|  |                                         uint8_t *out, | ||||||
|  |                                         size_t data_len); | ||||||
|  |                         int OFB_decrypt(void *ofbState, | ||||||
|  |                                         const uint8_t *in, | ||||||
|  |                                         uint8_t *out, | ||||||
|  |                                         size_t data_len); | ||||||
|  |                         int OFB_stop_operation(void *state); | ||||||
|  |                         """ | ||||||
|  |                                         ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class OfbMode(object): | ||||||
|  |     """*Output FeedBack (OFB)*. | ||||||
|  | 
 | ||||||
|  |     This mode is very similar to CBC, but it | ||||||
|  |     transforms the underlying block cipher into a stream cipher. | ||||||
|  | 
 | ||||||
|  |     The keystream is the iterated block encryption of the | ||||||
|  |     previous ciphertext block. | ||||||
|  | 
 | ||||||
|  |     An Initialization Vector (*IV*) is required. | ||||||
|  | 
 | ||||||
|  |     See `NIST SP800-38A`_ , Section 6.4. | ||||||
|  | 
 | ||||||
|  |     .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf | ||||||
|  | 
 | ||||||
|  |     :undocumented: __init__ | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, block_cipher, iv): | ||||||
|  |         """Create a new block cipher, configured in OFB mode. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           block_cipher : C pointer | ||||||
|  |             A smart pointer to the low-level block cipher instance. | ||||||
|  | 
 | ||||||
|  |           iv : bytes/bytearray/memoryview | ||||||
|  |             The initialization vector to use for encryption or decryption. | ||||||
|  |             It is as long as the cipher block. | ||||||
|  | 
 | ||||||
|  |             **The IV must be a nonce, to to be reused for any other | ||||||
|  |             message**. It shall be a nonce or a random value. | ||||||
|  | 
 | ||||||
|  |             Reusing the *IV* for encryptions performed with the same key | ||||||
|  |             compromises confidentiality. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self._state = VoidPointer() | ||||||
|  |         result = raw_ofb_lib.OFB_start_operation(block_cipher.get(), | ||||||
|  |                                                  c_uint8_ptr(iv), | ||||||
|  |                                                  c_size_t(len(iv)), | ||||||
|  |                                                  self._state.address_of()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating the OFB mode" | ||||||
|  |                              % result) | ||||||
|  | 
 | ||||||
|  |         # Ensure that object disposal of this Python object will (eventually) | ||||||
|  |         # free the memory allocated by the raw library for the cipher mode | ||||||
|  |         self._state = SmartPointer(self._state.get(), | ||||||
|  |                                    raw_ofb_lib.OFB_stop_operation) | ||||||
|  | 
 | ||||||
|  |         # Memory allocated for the underlying block cipher is now owed | ||||||
|  |         # by the cipher mode | ||||||
|  |         block_cipher.release() | ||||||
|  | 
 | ||||||
|  |         self.block_size = len(iv) | ||||||
|  |         """The block size of the underlying cipher, in bytes.""" | ||||||
|  | 
 | ||||||
|  |         self.iv = _copy_bytes(None, None, iv) | ||||||
|  |         """The Initialization Vector originally used to create the object. | ||||||
|  |         The value does not change.""" | ||||||
|  | 
 | ||||||
|  |         self.IV = self.iv | ||||||
|  |         """Alias for `iv`""" | ||||||
|  | 
 | ||||||
|  |         self._next = ["encrypt", "decrypt"] | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, plaintext, output=None): | ||||||
|  |         """Encrypt data with the key and the parameters set at initialization. | ||||||
|  | 
 | ||||||
|  |         A cipher object is stateful: once you have encrypted a message | ||||||
|  |         you cannot encrypt (or decrypt) another message using the same | ||||||
|  |         object. | ||||||
|  | 
 | ||||||
|  |         The data to encrypt can be broken up in two or | ||||||
|  |         more pieces and `encrypt` can be called multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.encrypt(a) + c.encrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.encrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         This function does not add any padding to the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           plaintext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to encrypt. | ||||||
|  |             It can be of any length. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the ciphertext must be written to. | ||||||
|  |             If ``None``, the ciphertext is returned. | ||||||
|  |         :Return: | ||||||
|  |           If ``output`` is ``None``, the ciphertext is returned as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "encrypt" not in self._next: | ||||||
|  |             raise TypeError("encrypt() cannot be called after decrypt()") | ||||||
|  |         self._next = ["encrypt"] | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             ciphertext = create_string_buffer(len(plaintext)) | ||||||
|  |         else: | ||||||
|  |             ciphertext = output | ||||||
|  | 
 | ||||||
|  |             if not is_writeable_buffer(output): | ||||||
|  |                 raise TypeError("output must be a bytearray or a writeable memoryview") | ||||||
|  | 
 | ||||||
|  |             if len(plaintext) != len(output): | ||||||
|  |                 raise ValueError("output must have the same length as the input" | ||||||
|  |                                  "  (%d bytes)" % len(plaintext)) | ||||||
|  | 
 | ||||||
|  |         result = raw_ofb_lib.OFB_encrypt(self._state.get(), | ||||||
|  |                                          c_uint8_ptr(plaintext), | ||||||
|  |                                          c_uint8_ptr(ciphertext), | ||||||
|  |                                          c_size_t(len(plaintext))) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while encrypting in OFB mode" % result) | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             return get_raw_buffer(ciphertext) | ||||||
|  |         else: | ||||||
|  |             return None | ||||||
|  | 
 | ||||||
|  |     def decrypt(self, ciphertext, output=None): | ||||||
|  |         """Decrypt data with the key and the parameters set at initialization. | ||||||
|  | 
 | ||||||
|  |         A cipher object is stateful: once you have decrypted a message | ||||||
|  |         you cannot decrypt (or encrypt) another message with the same | ||||||
|  |         object. | ||||||
|  | 
 | ||||||
|  |         The data to decrypt can be broken up in two or | ||||||
|  |         more pieces and `decrypt` can be called multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.decrypt(a) + c.decrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.decrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         This function does not remove any padding from the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           ciphertext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to decrypt. | ||||||
|  |             It can be of any length. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the plaintext is written to. | ||||||
|  |             If ``None``, the plaintext is returned. | ||||||
|  |         :Return: | ||||||
|  |           If ``output`` is ``None``, the plaintext is returned as ``bytes``. | ||||||
|  |           Otherwise, ``None``. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "decrypt" not in self._next: | ||||||
|  |             raise TypeError("decrypt() cannot be called after encrypt()") | ||||||
|  |         self._next = ["decrypt"] | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             plaintext = create_string_buffer(len(ciphertext)) | ||||||
|  |         else: | ||||||
|  |             plaintext = output | ||||||
|  | 
 | ||||||
|  |             if not is_writeable_buffer(output): | ||||||
|  |                 raise TypeError("output must be a bytearray or a writeable memoryview") | ||||||
|  | 
 | ||||||
|  |             if len(ciphertext) != len(output): | ||||||
|  |                 raise ValueError("output must have the same length as the input" | ||||||
|  |                                  "  (%d bytes)" % len(plaintext)) | ||||||
|  | 
 | ||||||
|  |         result = raw_ofb_lib.OFB_decrypt(self._state.get(), | ||||||
|  |                                          c_uint8_ptr(ciphertext), | ||||||
|  |                                          c_uint8_ptr(plaintext), | ||||||
|  |                                          c_size_t(len(ciphertext))) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while decrypting in OFB mode" % result) | ||||||
|  | 
 | ||||||
|  |         if output is None: | ||||||
|  |             return get_raw_buffer(plaintext) | ||||||
|  |         else: | ||||||
|  |             return None | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_ofb_cipher(factory, **kwargs): | ||||||
|  |     """Instantiate a cipher object that performs OFB encryption/decryption. | ||||||
|  | 
 | ||||||
|  |     :Parameters: | ||||||
|  |       factory : module | ||||||
|  |         The underlying block cipher, a module from ``Cryptodome.Cipher``. | ||||||
|  | 
 | ||||||
|  |     :Keywords: | ||||||
|  |       iv : bytes/bytearray/memoryview | ||||||
|  |         The IV to use for OFB. | ||||||
|  | 
 | ||||||
|  |       IV : bytes/bytearray/memoryview | ||||||
|  |         Alias for ``iv``. | ||||||
|  | 
 | ||||||
|  |     Any other keyword will be passed to the underlying block cipher. | ||||||
|  |     See the relevant documentation for details (at least ``key`` will need | ||||||
|  |     to be present). | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     cipher_state = factory._create_base_cipher(kwargs) | ||||||
|  |     iv = kwargs.pop("IV", None) | ||||||
|  |     IV = kwargs.pop("iv", None) | ||||||
|  | 
 | ||||||
|  |     if (None, None) == (iv, IV): | ||||||
|  |         iv = get_random_bytes(factory.block_size) | ||||||
|  |     if iv is not None: | ||||||
|  |         if IV is not None: | ||||||
|  |             raise TypeError("You must either use 'iv' or 'IV', not both") | ||||||
|  |     else: | ||||||
|  |         iv = IV | ||||||
|  | 
 | ||||||
|  |     if len(iv) != factory.block_size: | ||||||
|  |         raise ValueError("Incorrect IV length (it must be %d bytes long)" % | ||||||
|  |                 factory.block_size) | ||||||
|  | 
 | ||||||
|  |     if kwargs: | ||||||
|  |         raise TypeError("Unknown parameters for OFB: %s" % str(kwargs)) | ||||||
|  | 
 | ||||||
|  |     return OfbMode(cipher_state, iv) | ||||||
							
								
								
									
										25
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ofb.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_ofb.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | ||||||
|  | from typing import Union, overload | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import SmartPointer | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | __all__ = ['OfbMode'] | ||||||
|  | 
 | ||||||
|  | class OfbMode(object): | ||||||
|  |     block_size: int | ||||||
|  |     iv: Buffer | ||||||
|  |     IV: Buffer | ||||||
|  |      | ||||||
|  |     def __init__(self, | ||||||
|  |                  block_cipher: SmartPointer, | ||||||
|  |                  iv: Buffer) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     @overload | ||||||
|  |     def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... | ||||||
|  | 
 | ||||||
							
								
								
									
										206
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_openpgp.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_openpgp.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,206 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2014, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | OpenPGP mode. | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | __all__ = ['OpenPgpMode'] | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import _copy_bytes | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | 
 | ||||||
|  | class OpenPgpMode(object): | ||||||
|  |     """OpenPGP mode. | ||||||
|  | 
 | ||||||
|  |     This mode is a variant of CFB, and it is only used in PGP and | ||||||
|  |     OpenPGP_ applications. If in doubt, use another mode. | ||||||
|  | 
 | ||||||
|  |     An Initialization Vector (*IV*) is required. | ||||||
|  | 
 | ||||||
|  |     Unlike CFB, the *encrypted* IV (not the IV itself) is | ||||||
|  |     transmitted to the receiver. | ||||||
|  | 
 | ||||||
|  |     The IV is a random data block. For legacy reasons, two of its bytes are | ||||||
|  |     duplicated to act as a checksum for the correctness of the key, which is now | ||||||
|  |     known to be insecure and is ignored. The encrypted IV is therefore 2 bytes | ||||||
|  |     longer than the clean IV. | ||||||
|  | 
 | ||||||
|  |     .. _OpenPGP: http://tools.ietf.org/html/rfc4880 | ||||||
|  | 
 | ||||||
|  |     :undocumented: __init__ | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, factory, key, iv, cipher_params): | ||||||
|  | 
 | ||||||
|  |         #: The block size of the underlying cipher, in bytes. | ||||||
|  |         self.block_size = factory.block_size | ||||||
|  | 
 | ||||||
|  |         self._done_first_block = False  # True after the first encryption | ||||||
|  | 
 | ||||||
|  |         # Instantiate a temporary cipher to process the IV | ||||||
|  |         IV_cipher = factory.new( | ||||||
|  |                         key, | ||||||
|  |                         factory.MODE_CFB, | ||||||
|  |                         IV=b'\x00' * self.block_size, | ||||||
|  |                         segment_size=self.block_size * 8, | ||||||
|  |                         **cipher_params) | ||||||
|  | 
 | ||||||
|  |         iv = _copy_bytes(None, None, iv) | ||||||
|  | 
 | ||||||
|  |         # The cipher will be used for... | ||||||
|  |         if len(iv) == self.block_size: | ||||||
|  |             # ... encryption | ||||||
|  |             self._encrypted_IV = IV_cipher.encrypt(iv + iv[-2:]) | ||||||
|  |         elif len(iv) == self.block_size + 2: | ||||||
|  |             # ... decryption | ||||||
|  |             self._encrypted_IV = iv | ||||||
|  |             # Last two bytes are for a deprecated "quick check" feature that | ||||||
|  |             # should not be used. (https://eprint.iacr.org/2005/033) | ||||||
|  |             iv = IV_cipher.decrypt(iv)[:-2] | ||||||
|  |         else: | ||||||
|  |             raise ValueError("Length of IV must be %d or %d bytes" | ||||||
|  |                              " for MODE_OPENPGP" | ||||||
|  |                              % (self.block_size, self.block_size + 2)) | ||||||
|  | 
 | ||||||
|  |         self.iv = self.IV = iv | ||||||
|  | 
 | ||||||
|  |         # Instantiate the cipher for the real PGP data | ||||||
|  |         self._cipher = factory.new( | ||||||
|  |                             key, | ||||||
|  |                             factory.MODE_CFB, | ||||||
|  |                             IV=self._encrypted_IV[-self.block_size:], | ||||||
|  |                             segment_size=self.block_size * 8, | ||||||
|  |                             **cipher_params) | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, plaintext): | ||||||
|  |         """Encrypt data with the key and the parameters set at initialization. | ||||||
|  | 
 | ||||||
|  |         A cipher object is stateful: once you have encrypted a message | ||||||
|  |         you cannot encrypt (or decrypt) another message using the same | ||||||
|  |         object. | ||||||
|  | 
 | ||||||
|  |         The data to encrypt can be broken up in two or | ||||||
|  |         more pieces and `encrypt` can be called multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.encrypt(a) + c.encrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.encrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         This function does not add any padding to the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           plaintext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to encrypt. | ||||||
|  | 
 | ||||||
|  |         :Return: | ||||||
|  |             the encrypted data, as a byte string. | ||||||
|  |             It is as long as *plaintext* with one exception: | ||||||
|  |             when encrypting the first message chunk, | ||||||
|  |             the encypted IV is prepended to the returned ciphertext. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         res = self._cipher.encrypt(plaintext) | ||||||
|  |         if not self._done_first_block: | ||||||
|  |             res = self._encrypted_IV + res | ||||||
|  |             self._done_first_block = True | ||||||
|  |         return res | ||||||
|  | 
 | ||||||
|  |     def decrypt(self, ciphertext): | ||||||
|  |         """Decrypt data with the key and the parameters set at initialization. | ||||||
|  | 
 | ||||||
|  |         A cipher object is stateful: once you have decrypted a message | ||||||
|  |         you cannot decrypt (or encrypt) another message with the same | ||||||
|  |         object. | ||||||
|  | 
 | ||||||
|  |         The data to decrypt can be broken up in two or | ||||||
|  |         more pieces and `decrypt` can be called multiple times. | ||||||
|  | 
 | ||||||
|  |         That is, the statement: | ||||||
|  | 
 | ||||||
|  |             >>> c.decrypt(a) + c.decrypt(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |              >>> c.decrypt(a+b) | ||||||
|  | 
 | ||||||
|  |         This function does not remove any padding from the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           ciphertext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to decrypt. | ||||||
|  | 
 | ||||||
|  |         :Return: the decrypted data (byte string). | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         return self._cipher.decrypt(ciphertext) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_openpgp_cipher(factory, **kwargs): | ||||||
|  |     """Create a new block cipher, configured in OpenPGP mode. | ||||||
|  | 
 | ||||||
|  |     :Parameters: | ||||||
|  |       factory : module | ||||||
|  |         The module. | ||||||
|  | 
 | ||||||
|  |     :Keywords: | ||||||
|  |       key : bytes/bytearray/memoryview | ||||||
|  |         The secret key to use in the symmetric cipher. | ||||||
|  | 
 | ||||||
|  |       IV : bytes/bytearray/memoryview | ||||||
|  |         The initialization vector to use for encryption or decryption. | ||||||
|  | 
 | ||||||
|  |         For encryption, the IV must be as long as the cipher block size. | ||||||
|  | 
 | ||||||
|  |         For decryption, it must be 2 bytes longer (it is actually the | ||||||
|  |         *encrypted* IV which was prefixed to the ciphertext). | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     iv = kwargs.pop("IV", None) | ||||||
|  |     IV = kwargs.pop("iv", None) | ||||||
|  | 
 | ||||||
|  |     if (None, None) == (iv, IV): | ||||||
|  |         iv = get_random_bytes(factory.block_size) | ||||||
|  |     if iv is not None: | ||||||
|  |         if IV is not None: | ||||||
|  |             raise TypeError("You must either use 'iv' or 'IV', not both") | ||||||
|  |     else: | ||||||
|  |         iv = IV | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         key = kwargs.pop("key") | ||||||
|  |     except KeyError as e: | ||||||
|  |         raise TypeError("Missing component: " + str(e)) | ||||||
|  | 
 | ||||||
|  |     return OpenPgpMode(factory, key, iv, kwargs) | ||||||
							
								
								
									
										20
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_openpgp.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_openpgp.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | ||||||
|  | from types import ModuleType | ||||||
|  | from typing import Union, Dict | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | __all__ = ['OpenPgpMode'] | ||||||
|  | 
 | ||||||
|  | class OpenPgpMode(object): | ||||||
|  |     block_size: int | ||||||
|  |     iv: Union[bytes, bytearray, memoryview] | ||||||
|  |     IV: Union[bytes, bytearray, memoryview] | ||||||
|  |      | ||||||
|  |     def __init__(self, | ||||||
|  |                  factory: ModuleType, | ||||||
|  |                  key: Buffer, | ||||||
|  |                  iv: Buffer, | ||||||
|  |                  cipher_params: Dict) -> None: ... | ||||||
|  |     def encrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     def decrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  | 
 | ||||||
							
								
								
									
										392
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_siv.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										392
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_siv.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,392 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2014, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Synthetic Initialization Vector (SIV) mode. | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | __all__ = ['SivMode'] | ||||||
|  | 
 | ||||||
|  | from binascii import hexlify, unhexlify | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import bord, _copy_bytes | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import is_buffer | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.number import long_to_bytes, bytes_to_long | ||||||
|  | from Cryptodome.Protocol.KDF import _S2V | ||||||
|  | from Cryptodome.Hash import BLAKE2s | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class SivMode(object): | ||||||
|  |     """Synthetic Initialization Vector (SIV). | ||||||
|  | 
 | ||||||
|  |     This is an Authenticated Encryption with Associated Data (`AEAD`_) mode. | ||||||
|  |     It provides both confidentiality and authenticity. | ||||||
|  | 
 | ||||||
|  |     The header of the message may be left in the clear, if needed, and it will | ||||||
|  |     still be subject to authentication. The decryption step tells the receiver | ||||||
|  |     if the message comes from a source that really knowns the secret key. | ||||||
|  |     Additionally, decryption detects if any part of the message - including the | ||||||
|  |     header - has been modified or corrupted. | ||||||
|  | 
 | ||||||
|  |     Unlike other AEAD modes such as CCM, EAX or GCM, accidental reuse of a | ||||||
|  |     nonce is not catastrophic for the confidentiality of the message. The only | ||||||
|  |     effect is that an attacker can tell when the same plaintext (and same | ||||||
|  |     associated data) is protected with the same key. | ||||||
|  | 
 | ||||||
|  |     The length of the MAC is fixed to the block size of the underlying cipher. | ||||||
|  |     The key size is twice the length of the key of the underlying cipher. | ||||||
|  | 
 | ||||||
|  |     This mode is only available for AES ciphers. | ||||||
|  | 
 | ||||||
|  |     +--------------------+---------------+-------------------+ | ||||||
|  |     |      Cipher        | SIV MAC size  |   SIV key length  | | ||||||
|  |     |                    |    (bytes)    |     (bytes)       | | ||||||
|  |     +====================+===============+===================+ | ||||||
|  |     |    AES-128         |      16       |        32         | | ||||||
|  |     +--------------------+---------------+-------------------+ | ||||||
|  |     |    AES-192         |      16       |        48         | | ||||||
|  |     +--------------------+---------------+-------------------+ | ||||||
|  |     |    AES-256         |      16       |        64         | | ||||||
|  |     +--------------------+---------------+-------------------+ | ||||||
|  | 
 | ||||||
|  |     See `RFC5297`_ and the `original paper`__. | ||||||
|  | 
 | ||||||
|  |     .. _RFC5297: https://tools.ietf.org/html/rfc5297 | ||||||
|  |     .. _AEAD: http://blog.cryptographyengineering.com/2012/05/how-to-choose-authenticated-encryption.html | ||||||
|  |     .. __: http://www.cs.ucdavis.edu/~rogaway/papers/keywrap.pdf | ||||||
|  | 
 | ||||||
|  |     :undocumented: __init__ | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, factory, key, nonce, kwargs): | ||||||
|  | 
 | ||||||
|  |         self.block_size = factory.block_size | ||||||
|  |         """The block size of the underlying cipher, in bytes.""" | ||||||
|  | 
 | ||||||
|  |         self._factory = factory | ||||||
|  | 
 | ||||||
|  |         self._cipher_params = kwargs | ||||||
|  | 
 | ||||||
|  |         if len(key) not in (32, 48, 64): | ||||||
|  |             raise ValueError("Incorrect key length (%d bytes)" % len(key)) | ||||||
|  | 
 | ||||||
|  |         if nonce is not None: | ||||||
|  |             if not is_buffer(nonce): | ||||||
|  |                 raise TypeError("When provided, the nonce must be bytes, bytearray or memoryview") | ||||||
|  | 
 | ||||||
|  |             if len(nonce) == 0: | ||||||
|  |                 raise ValueError("When provided, the nonce must be non-empty") | ||||||
|  | 
 | ||||||
|  |             self.nonce = _copy_bytes(None, None, nonce) | ||||||
|  |             """Public attribute is only available in case of non-deterministic | ||||||
|  |             encryption.""" | ||||||
|  | 
 | ||||||
|  |         subkey_size = len(key) // 2 | ||||||
|  | 
 | ||||||
|  |         self._mac_tag = None  # Cache for MAC tag | ||||||
|  |         self._kdf = _S2V(key[:subkey_size], | ||||||
|  |                          ciphermod=factory, | ||||||
|  |                          cipher_params=self._cipher_params) | ||||||
|  |         self._subkey_cipher = key[subkey_size:] | ||||||
|  | 
 | ||||||
|  |         # Purely for the purpose of verifying that cipher_params are OK | ||||||
|  |         factory.new(key[:subkey_size], factory.MODE_ECB, **kwargs) | ||||||
|  | 
 | ||||||
|  |         # Allowed transitions after initialization | ||||||
|  |         self._next = ["update", "encrypt", "decrypt", | ||||||
|  |                       "digest", "verify"] | ||||||
|  | 
 | ||||||
|  |     def _create_ctr_cipher(self, v): | ||||||
|  |         """Create a new CTR cipher from V in SIV mode""" | ||||||
|  | 
 | ||||||
|  |         v_int = bytes_to_long(v) | ||||||
|  |         q = v_int & 0xFFFFFFFFFFFFFFFF7FFFFFFF7FFFFFFF | ||||||
|  |         return self._factory.new( | ||||||
|  |                     self._subkey_cipher, | ||||||
|  |                     self._factory.MODE_CTR, | ||||||
|  |                     initial_value=q, | ||||||
|  |                     nonce=b"", | ||||||
|  |                     **self._cipher_params) | ||||||
|  | 
 | ||||||
|  |     def update(self, component): | ||||||
|  |         """Protect one associated data component | ||||||
|  | 
 | ||||||
|  |         For SIV, the associated data is a sequence (*vector*) of non-empty | ||||||
|  |         byte strings (*components*). | ||||||
|  | 
 | ||||||
|  |         This method consumes the next component. It must be called | ||||||
|  |         once for each of the components that constitue the associated data. | ||||||
|  | 
 | ||||||
|  |         Note that the components have clear boundaries, so that: | ||||||
|  | 
 | ||||||
|  |             >>> cipher.update(b"builtin") | ||||||
|  |             >>> cipher.update(b"securely") | ||||||
|  | 
 | ||||||
|  |         is not equivalent to: | ||||||
|  | 
 | ||||||
|  |             >>> cipher.update(b"built") | ||||||
|  |             >>> cipher.update(b"insecurely") | ||||||
|  | 
 | ||||||
|  |         If there is no associated data, this method must not be called. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           component : bytes/bytearray/memoryview | ||||||
|  |             The next associated data component. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "update" not in self._next: | ||||||
|  |             raise TypeError("update() can only be called" | ||||||
|  |                                 " immediately after initialization") | ||||||
|  | 
 | ||||||
|  |         self._next = ["update", "encrypt", "decrypt", | ||||||
|  |                       "digest", "verify"] | ||||||
|  | 
 | ||||||
|  |         return self._kdf.update(component) | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, plaintext): | ||||||
|  |         """ | ||||||
|  |         For SIV, encryption and MAC authentication must take place at the same | ||||||
|  |         point. This method shall not be used. | ||||||
|  | 
 | ||||||
|  |         Use `encrypt_and_digest` instead. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         raise TypeError("encrypt() not allowed for SIV mode." | ||||||
|  |                         " Use encrypt_and_digest() instead.") | ||||||
|  | 
 | ||||||
|  |     def decrypt(self, ciphertext): | ||||||
|  |         """ | ||||||
|  |         For SIV, decryption and verification must take place at the same | ||||||
|  |         point. This method shall not be used. | ||||||
|  | 
 | ||||||
|  |         Use `decrypt_and_verify` instead. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         raise TypeError("decrypt() not allowed for SIV mode." | ||||||
|  |                         " Use decrypt_and_verify() instead.") | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         """Compute the *binary* MAC tag. | ||||||
|  | 
 | ||||||
|  |         The caller invokes this function at the very end. | ||||||
|  | 
 | ||||||
|  |         This method returns the MAC that shall be sent to the receiver, | ||||||
|  |         together with the ciphertext. | ||||||
|  | 
 | ||||||
|  |         :Return: the MAC, as a byte string. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "digest" not in self._next: | ||||||
|  |             raise TypeError("digest() cannot be called when decrypting" | ||||||
|  |                             " or validating a message") | ||||||
|  |         self._next = ["digest"] | ||||||
|  |         if self._mac_tag is None: | ||||||
|  |             self._mac_tag = self._kdf.derive() | ||||||
|  |         return self._mac_tag | ||||||
|  | 
 | ||||||
|  |     def hexdigest(self): | ||||||
|  |         """Compute the *printable* MAC tag. | ||||||
|  | 
 | ||||||
|  |         This method is like `digest`. | ||||||
|  | 
 | ||||||
|  |         :Return: the MAC, as a hexadecimal string. | ||||||
|  |         """ | ||||||
|  |         return "".join(["%02x" % bord(x) for x in self.digest()]) | ||||||
|  | 
 | ||||||
|  |     def verify(self, received_mac_tag): | ||||||
|  |         """Validate the *binary* MAC tag. | ||||||
|  | 
 | ||||||
|  |         The caller invokes this function at the very end. | ||||||
|  | 
 | ||||||
|  |         This method checks if the decrypted message is indeed valid | ||||||
|  |         (that is, if the key is correct) and it has not been | ||||||
|  |         tampered with while in transit. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           received_mac_tag : bytes/bytearray/memoryview | ||||||
|  |             This is the *binary* MAC, as received from the sender. | ||||||
|  |         :Raises ValueError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "verify" not in self._next: | ||||||
|  |             raise TypeError("verify() cannot be called" | ||||||
|  |                             " when encrypting a message") | ||||||
|  |         self._next = ["verify"] | ||||||
|  | 
 | ||||||
|  |         if self._mac_tag is None: | ||||||
|  |             self._mac_tag = self._kdf.derive() | ||||||
|  | 
 | ||||||
|  |         secret = get_random_bytes(16) | ||||||
|  | 
 | ||||||
|  |         mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=self._mac_tag) | ||||||
|  |         mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=received_mac_tag) | ||||||
|  | 
 | ||||||
|  |         if mac1.digest() != mac2.digest(): | ||||||
|  |             raise ValueError("MAC check failed") | ||||||
|  | 
 | ||||||
|  |     def hexverify(self, hex_mac_tag): | ||||||
|  |         """Validate the *printable* MAC tag. | ||||||
|  | 
 | ||||||
|  |         This method is like `verify`. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           hex_mac_tag : string | ||||||
|  |             This is the *printable* MAC, as received from the sender. | ||||||
|  |         :Raises ValueError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self.verify(unhexlify(hex_mac_tag)) | ||||||
|  | 
 | ||||||
|  |     def encrypt_and_digest(self, plaintext, output=None): | ||||||
|  |         """Perform encrypt() and digest() in one step. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           plaintext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to encrypt. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the ciphertext must be written to. | ||||||
|  |             If ``None``, the ciphertext is returned. | ||||||
|  |         :Return: | ||||||
|  |             a tuple with two items: | ||||||
|  | 
 | ||||||
|  |             - the ciphertext, as ``bytes`` | ||||||
|  |             - the MAC tag, as ``bytes`` | ||||||
|  | 
 | ||||||
|  |             The first item becomes ``None`` when the ``output`` parameter | ||||||
|  |             specified a location for the result. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "encrypt" not in self._next: | ||||||
|  |             raise TypeError("encrypt() can only be called after" | ||||||
|  |                             " initialization or an update()") | ||||||
|  | 
 | ||||||
|  |         self._next = ["digest"] | ||||||
|  | 
 | ||||||
|  |         # Compute V (MAC) | ||||||
|  |         if hasattr(self, 'nonce'): | ||||||
|  |             self._kdf.update(self.nonce) | ||||||
|  |         self._kdf.update(plaintext) | ||||||
|  |         self._mac_tag = self._kdf.derive() | ||||||
|  | 
 | ||||||
|  |         cipher = self._create_ctr_cipher(self._mac_tag) | ||||||
|  | 
 | ||||||
|  |         return cipher.encrypt(plaintext, output=output), self._mac_tag | ||||||
|  | 
 | ||||||
|  |     def decrypt_and_verify(self, ciphertext, mac_tag, output=None): | ||||||
|  |         """Perform decryption and verification in one step. | ||||||
|  | 
 | ||||||
|  |         A cipher object is stateful: once you have decrypted a message | ||||||
|  |         you cannot decrypt (or encrypt) another message with the same | ||||||
|  |         object. | ||||||
|  | 
 | ||||||
|  |         You cannot reuse an object for encrypting | ||||||
|  |         or decrypting other data with the same key. | ||||||
|  | 
 | ||||||
|  |         This function does not remove any padding from the plaintext. | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           ciphertext : bytes/bytearray/memoryview | ||||||
|  |             The piece of data to decrypt. | ||||||
|  |             It can be of any length. | ||||||
|  |           mac_tag : bytes/bytearray/memoryview | ||||||
|  |             This is the *binary* MAC, as received from the sender. | ||||||
|  |         :Keywords: | ||||||
|  |           output : bytearray/memoryview | ||||||
|  |             The location where the plaintext must be written to. | ||||||
|  |             If ``None``, the plaintext is returned. | ||||||
|  |         :Return: the plaintext as ``bytes`` or ``None`` when the ``output`` | ||||||
|  |             parameter specified a location for the result. | ||||||
|  |         :Raises ValueError: | ||||||
|  |             if the MAC does not match. The message has been tampered with | ||||||
|  |             or the key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "decrypt" not in self._next: | ||||||
|  |             raise TypeError("decrypt() can only be called" | ||||||
|  |                             " after initialization or an update()") | ||||||
|  |         self._next = ["verify"] | ||||||
|  | 
 | ||||||
|  |         # Take the MAC and start the cipher for decryption | ||||||
|  |         self._cipher = self._create_ctr_cipher(mac_tag) | ||||||
|  | 
 | ||||||
|  |         plaintext = self._cipher.decrypt(ciphertext, output=output) | ||||||
|  | 
 | ||||||
|  |         if hasattr(self, 'nonce'): | ||||||
|  |             self._kdf.update(self.nonce) | ||||||
|  |         self._kdf.update(plaintext if output is None else output) | ||||||
|  |         self.verify(mac_tag) | ||||||
|  | 
 | ||||||
|  |         return plaintext | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_siv_cipher(factory, **kwargs): | ||||||
|  |     """Create a new block cipher, configured in | ||||||
|  |     Synthetic Initializaton Vector (SIV) mode. | ||||||
|  | 
 | ||||||
|  |     :Parameters: | ||||||
|  | 
 | ||||||
|  |       factory : object | ||||||
|  |         A symmetric cipher module from `Cryptodome.Cipher` | ||||||
|  |         (like `Cryptodome.Cipher.AES`). | ||||||
|  | 
 | ||||||
|  |     :Keywords: | ||||||
|  | 
 | ||||||
|  |       key : bytes/bytearray/memoryview | ||||||
|  |         The secret key to use in the symmetric cipher. | ||||||
|  |         It must be 32, 48 or 64 bytes long. | ||||||
|  |         If AES is the chosen cipher, the variants *AES-128*, | ||||||
|  |         *AES-192* and or *AES-256* will be used internally. | ||||||
|  | 
 | ||||||
|  |       nonce : bytes/bytearray/memoryview | ||||||
|  |         For deterministic encryption, it is not present. | ||||||
|  | 
 | ||||||
|  |         Otherwise, it is a value that must never be reused | ||||||
|  |         for encrypting message under this key. | ||||||
|  | 
 | ||||||
|  |         There are no restrictions on its length, | ||||||
|  |         but it is recommended to use at least 16 bytes. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         key = kwargs.pop("key") | ||||||
|  |     except KeyError as e: | ||||||
|  |         raise TypeError("Missing parameter: " + str(e)) | ||||||
|  | 
 | ||||||
|  |     nonce = kwargs.pop("nonce", None) | ||||||
|  | 
 | ||||||
|  |     return SivMode(factory, key, nonce, kwargs) | ||||||
							
								
								
									
										38
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_siv.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								resources/lib/deps/Cryptodome/Cipher/_mode_siv.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,38 @@ | ||||||
|  | from types import ModuleType | ||||||
|  | from typing import Union, Tuple, Dict, Optional, overload | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | __all__ = ['SivMode'] | ||||||
|  | 
 | ||||||
|  | class SivMode(object): | ||||||
|  |     block_size: int | ||||||
|  |     nonce: bytes | ||||||
|  |      | ||||||
|  |     def __init__(self, | ||||||
|  |                  factory: ModuleType, | ||||||
|  |                  key: Buffer, | ||||||
|  |                  nonce: Buffer, | ||||||
|  |                  kwargs: Dict) -> None: ... | ||||||
|  |      | ||||||
|  |     def update(self, component: Buffer) -> SivMode: ... | ||||||
|  | 
 | ||||||
|  |     def encrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  |     def decrypt(self, plaintext: Buffer) -> bytes: ... | ||||||
|  | 
 | ||||||
|  |     def digest(self) -> bytes: ... | ||||||
|  |     def hexdigest(self) -> str: ... | ||||||
|  |     def verify(self, received_mac_tag: Buffer) -> None: ... | ||||||
|  |     def hexverify(self, hex_mac_tag: str) -> None: ... | ||||||
|  | 
 | ||||||
|  |     @overload | ||||||
|  |     def encrypt_and_digest(self, | ||||||
|  |                            plaintext: Buffer) -> Tuple[bytes, bytes]: ... | ||||||
|  |     @overload | ||||||
|  |     def encrypt_and_digest(self, | ||||||
|  |                            plaintext: Buffer, | ||||||
|  |                            output: Buffer) -> Tuple[None, bytes]: ... | ||||||
|  |     def decrypt_and_verify(self, | ||||||
|  |                            ciphertext: Buffer, | ||||||
|  |                            received_mac_tag: Buffer, | ||||||
|  |                            output: Optional[Union[bytearray, memoryview]] = ...) -> bytes: ... | ||||||
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_pkcs1_decode.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_pkcs1_decode.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										41
									
								
								resources/lib/deps/Cryptodome/Cipher/_pkcs1_oaep_decode.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								resources/lib/deps/Cryptodome/Cipher/_pkcs1_oaep_decode.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,41 @@ | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, c_size_t, | ||||||
|  |                                   c_uint8_ptr) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | _raw_pkcs1_decode = load_pycryptodome_raw_lib("Cryptodome.Cipher._pkcs1_decode", | ||||||
|  |                         """ | ||||||
|  |                         int pkcs1_decode(const uint8_t *em, size_t len_em, | ||||||
|  |                                          const uint8_t *sentinel, size_t len_sentinel, | ||||||
|  |                                          size_t expected_pt_len, | ||||||
|  |                                          uint8_t *output); | ||||||
|  | 
 | ||||||
|  |                         int oaep_decode(const uint8_t *em, | ||||||
|  |                                         size_t em_len, | ||||||
|  |                                         const uint8_t *lHash, | ||||||
|  |                                         size_t hLen, | ||||||
|  |                                         const uint8_t *db, | ||||||
|  |                                         size_t db_len); | ||||||
|  |                         """) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def pkcs1_decode(em, sentinel, expected_pt_len, output): | ||||||
|  |     if len(em) != len(output): | ||||||
|  |         raise ValueError("Incorrect output length") | ||||||
|  | 
 | ||||||
|  |     ret = _raw_pkcs1_decode.pkcs1_decode(c_uint8_ptr(em), | ||||||
|  |                                          c_size_t(len(em)), | ||||||
|  |                                          c_uint8_ptr(sentinel), | ||||||
|  |                                          c_size_t(len(sentinel)), | ||||||
|  |                                          c_size_t(expected_pt_len), | ||||||
|  |                                          c_uint8_ptr(output)) | ||||||
|  |     return ret | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def oaep_decode(em, lHash, db): | ||||||
|  |     ret = _raw_pkcs1_decode.oaep_decode(c_uint8_ptr(em), | ||||||
|  |                                         c_size_t(len(em)), | ||||||
|  |                                         c_uint8_ptr(lHash), | ||||||
|  |                                         c_size_t(len(lHash)), | ||||||
|  |                                         c_uint8_ptr(db), | ||||||
|  |                                         c_size_t(len(db))) | ||||||
|  |     return ret | ||||||
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_aes.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_aes.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_aesni.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_aesni.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_arc2.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_arc2.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_blowfish.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_blowfish.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_cast.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_cast.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_cbc.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_cbc.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_cfb.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_cfb.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_ctr.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_ctr.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_des.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_des.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_des3.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_des3.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_ecb.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_ecb.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_eksblowfish.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_eksblowfish.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_ocb.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_ocb.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_ofb.abi3.so
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								resources/lib/deps/Cryptodome/Cipher/_raw_ofb.abi3.so
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										247
									
								
								resources/lib/deps/Cryptodome/Hash/BLAKE2b.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										247
									
								
								resources/lib/deps/Cryptodome/Hash/BLAKE2b.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,247 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2014, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | from binascii import unhexlify | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import bord, tobytes | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   VoidPointer, SmartPointer, | ||||||
|  |                                   create_string_buffer, | ||||||
|  |                                   get_raw_buffer, c_size_t, | ||||||
|  |                                   c_uint8_ptr) | ||||||
|  | 
 | ||||||
|  | _raw_blake2b_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._BLAKE2b", | ||||||
|  |                         """ | ||||||
|  |                         int blake2b_init(void **state, | ||||||
|  |                                          const uint8_t *key, | ||||||
|  |                                          size_t key_size, | ||||||
|  |                                          size_t digest_size); | ||||||
|  |                         int blake2b_destroy(void *state); | ||||||
|  |                         int blake2b_update(void *state, | ||||||
|  |                                            const uint8_t *buf, | ||||||
|  |                                            size_t len); | ||||||
|  |                         int blake2b_digest(const void *state, | ||||||
|  |                                            uint8_t digest[64]); | ||||||
|  |                         int blake2b_copy(const void *src, void *dst); | ||||||
|  |                         """) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class BLAKE2b_Hash(object): | ||||||
|  |     """A BLAKE2b hash object. | ||||||
|  |     Do not instantiate directly. Use the :func:`new` function. | ||||||
|  | 
 | ||||||
|  |     :ivar oid: ASN.1 Object ID | ||||||
|  |     :vartype oid: string | ||||||
|  | 
 | ||||||
|  |     :ivar block_size: the size in bytes of the internal message block, | ||||||
|  |                       input to the compression function | ||||||
|  |     :vartype block_size: integer | ||||||
|  | 
 | ||||||
|  |     :ivar digest_size: the size in bytes of the resulting hash | ||||||
|  |     :vartype digest_size: integer | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     # The internal block size of the hash algorithm in bytes. | ||||||
|  |     block_size = 64 | ||||||
|  | 
 | ||||||
|  |     def __init__(self, data, key, digest_bytes, update_after_digest): | ||||||
|  | 
 | ||||||
|  |         # The size of the resulting hash in bytes. | ||||||
|  |         self.digest_size = digest_bytes | ||||||
|  | 
 | ||||||
|  |         self._update_after_digest = update_after_digest | ||||||
|  |         self._digest_done = False | ||||||
|  | 
 | ||||||
|  |         # See https://tools.ietf.org/html/rfc7693 | ||||||
|  |         if digest_bytes in (20, 32, 48, 64) and not key: | ||||||
|  |             self.oid = "1.3.6.1.4.1.1722.12.2.1." + str(digest_bytes) | ||||||
|  | 
 | ||||||
|  |         state = VoidPointer() | ||||||
|  |         result = _raw_blake2b_lib.blake2b_init(state.address_of(), | ||||||
|  |                                                c_uint8_ptr(key), | ||||||
|  |                                                c_size_t(len(key)), | ||||||
|  |                                                c_size_t(digest_bytes) | ||||||
|  |                                                ) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating BLAKE2b" % result) | ||||||
|  |         self._state = SmartPointer(state.get(), | ||||||
|  |                                    _raw_blake2b_lib.blake2b_destroy) | ||||||
|  |         if data: | ||||||
|  |             self.update(data) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def update(self, data): | ||||||
|  |         """Continue hashing of a message by consuming the next chunk of data. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |             data (bytes/bytearray/memoryview): The next chunk of the message being hashed. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if self._digest_done and not self._update_after_digest: | ||||||
|  |             raise TypeError("You can only call 'digest' or 'hexdigest' on this object") | ||||||
|  | 
 | ||||||
|  |         result = _raw_blake2b_lib.blake2b_update(self._state.get(), | ||||||
|  |                                                  c_uint8_ptr(data), | ||||||
|  |                                                  c_size_t(len(data))) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while hashing BLAKE2b data" % result) | ||||||
|  |         return self | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         """Return the **binary** (non-printable) digest of the message that has been hashed so far. | ||||||
|  | 
 | ||||||
|  |         :return: The hash digest, computed over the data processed so far. | ||||||
|  |                  Binary form. | ||||||
|  |         :rtype: byte string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         bfr = create_string_buffer(64) | ||||||
|  |         result = _raw_blake2b_lib.blake2b_digest(self._state.get(), | ||||||
|  |                                                  bfr) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while creating BLAKE2b digest" % result) | ||||||
|  | 
 | ||||||
|  |         self._digest_done = True | ||||||
|  | 
 | ||||||
|  |         return get_raw_buffer(bfr)[:self.digest_size] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def hexdigest(self): | ||||||
|  |         """Return the **printable** digest of the message that has been hashed so far. | ||||||
|  | 
 | ||||||
|  |         :return: The hash digest, computed over the data processed so far. | ||||||
|  |                  Hexadecimal encoded. | ||||||
|  |         :rtype: string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         return "".join(["%02x" % bord(x) for x in tuple(self.digest())]) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def verify(self, mac_tag): | ||||||
|  |         """Verify that a given **binary** MAC (computed by another party) | ||||||
|  |         is valid. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |           mac_tag (bytes/bytearray/memoryview): the expected MAC of the message. | ||||||
|  | 
 | ||||||
|  |         Raises: | ||||||
|  |             ValueError: if the MAC does not match. It means that the message | ||||||
|  |                 has been tampered with or that the MAC key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         secret = get_random_bytes(16) | ||||||
|  | 
 | ||||||
|  |         mac1 = new(digest_bits=160, key=secret, data=mac_tag) | ||||||
|  |         mac2 = new(digest_bits=160, key=secret, data=self.digest()) | ||||||
|  | 
 | ||||||
|  |         if mac1.digest() != mac2.digest(): | ||||||
|  |             raise ValueError("MAC check failed") | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def hexverify(self, hex_mac_tag): | ||||||
|  |         """Verify that a given **printable** MAC (computed by another party) | ||||||
|  |         is valid. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |             hex_mac_tag (string): the expected MAC of the message, as a hexadecimal string. | ||||||
|  | 
 | ||||||
|  |         Raises: | ||||||
|  |             ValueError: if the MAC does not match. It means that the message | ||||||
|  |                 has been tampered with or that the MAC key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self.verify(unhexlify(tobytes(hex_mac_tag))) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def new(self, **kwargs): | ||||||
|  |         """Return a new instance of a BLAKE2b hash object. | ||||||
|  |         See :func:`new`. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "digest_bytes" not in kwargs and "digest_bits" not in kwargs: | ||||||
|  |             kwargs["digest_bytes"] = self.digest_size | ||||||
|  | 
 | ||||||
|  |         return new(**kwargs) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(**kwargs): | ||||||
|  |     """Create a new hash object. | ||||||
|  | 
 | ||||||
|  |     Args: | ||||||
|  |         data (bytes/bytearray/memoryview): | ||||||
|  |             Optional. The very first chunk of the message to hash. | ||||||
|  |             It is equivalent to an early call to :meth:`BLAKE2b_Hash.update`. | ||||||
|  |         digest_bytes (integer): | ||||||
|  |             Optional. The size of the digest, in bytes (1 to 64). Default is 64. | ||||||
|  |         digest_bits (integer): | ||||||
|  |             Optional and alternative to ``digest_bytes``. | ||||||
|  |             The size of the digest, in bits (8 to 512, in steps of 8). | ||||||
|  |             Default is 512. | ||||||
|  |         key (bytes/bytearray/memoryview): | ||||||
|  |             Optional. The key to use to compute the MAC (1 to 64 bytes). | ||||||
|  |             If not specified, no key will be used. | ||||||
|  |         update_after_digest (boolean): | ||||||
|  |             Optional. By default, a hash object cannot be updated anymore after | ||||||
|  |             the digest is computed. When this flag is ``True``, such check | ||||||
|  |             is no longer enforced. | ||||||
|  | 
 | ||||||
|  |     Returns: | ||||||
|  |         A :class:`BLAKE2b_Hash` hash object | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     data = kwargs.pop("data", None) | ||||||
|  |     update_after_digest = kwargs.pop("update_after_digest", False) | ||||||
|  | 
 | ||||||
|  |     digest_bytes = kwargs.pop("digest_bytes", None) | ||||||
|  |     digest_bits = kwargs.pop("digest_bits", None) | ||||||
|  |     if None not in (digest_bytes, digest_bits): | ||||||
|  |         raise TypeError("Only one digest parameter must be provided") | ||||||
|  |     if (None, None) == (digest_bytes, digest_bits): | ||||||
|  |         digest_bytes = 64 | ||||||
|  |     if digest_bytes is not None: | ||||||
|  |         if not (1 <= digest_bytes <= 64): | ||||||
|  |             raise ValueError("'digest_bytes' not in range 1..64") | ||||||
|  |     else: | ||||||
|  |         if not (8 <= digest_bits <= 512) or (digest_bits % 8): | ||||||
|  |             raise ValueError("'digest_bits' not in range 8..512, " | ||||||
|  |                              "with steps of 8") | ||||||
|  |         digest_bytes = digest_bits // 8 | ||||||
|  | 
 | ||||||
|  |     key = kwargs.pop("key", b"") | ||||||
|  |     if len(key) > 64: | ||||||
|  |         raise ValueError("BLAKE2b key cannot exceed 64 bytes") | ||||||
|  | 
 | ||||||
|  |     if kwargs: | ||||||
|  |         raise TypeError("Unknown parameters: " + str(kwargs)) | ||||||
|  | 
 | ||||||
|  |     return BLAKE2b_Hash(data, key, digest_bytes, update_after_digest) | ||||||
							
								
								
									
										32
									
								
								resources/lib/deps/Cryptodome/Hash/BLAKE2b.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								resources/lib/deps/Cryptodome/Hash/BLAKE2b.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | ||||||
|  | from typing import Any, Union | ||||||
|  | from types import ModuleType | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | class BLAKE2b_Hash(object): | ||||||
|  |     block_size: int | ||||||
|  |     digest_size: int | ||||||
|  |     oid: str | ||||||
|  | 
 | ||||||
|  |     def __init__(self, | ||||||
|  |                  data: Buffer, | ||||||
|  | 		 key: Buffer, | ||||||
|  | 		 digest_bytes: bytes, | ||||||
|  | 		 update_after_digest: bool) -> None: ... | ||||||
|  |     def update(self, data: Buffer) -> BLAKE2b_Hash: ... | ||||||
|  |     def digest(self) -> bytes: ... | ||||||
|  |     def hexdigest(self) -> str: ... | ||||||
|  |     def verify(self, mac_tag: Buffer) -> None: ... | ||||||
|  |     def hexverify(self, hex_mac_tag: str) -> None: ... | ||||||
|  |     def new(self, | ||||||
|  |             data: Buffer = ..., | ||||||
|  | 	    digest_bytes: int = ..., | ||||||
|  | 	    digest_bits: int = ..., | ||||||
|  | 	    key: Buffer = ..., | ||||||
|  | 	    update_after_digest: bool = ...) -> BLAKE2b_Hash: ... | ||||||
|  | 
 | ||||||
|  | def new(data: Buffer = ..., | ||||||
|  | 	digest_bytes: int = ..., | ||||||
|  | 	digest_bits: int = ..., | ||||||
|  | 	key: Buffer = ..., | ||||||
|  | 	update_after_digest: bool = ...) -> BLAKE2b_Hash: ... | ||||||
							
								
								
									
										247
									
								
								resources/lib/deps/Cryptodome/Hash/BLAKE2s.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										247
									
								
								resources/lib/deps/Cryptodome/Hash/BLAKE2s.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,247 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2014, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | from binascii import unhexlify | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import bord, tobytes | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   VoidPointer, SmartPointer, | ||||||
|  |                                   create_string_buffer, | ||||||
|  |                                   get_raw_buffer, c_size_t, | ||||||
|  |                                   c_uint8_ptr) | ||||||
|  | 
 | ||||||
|  | _raw_blake2s_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._BLAKE2s", | ||||||
|  |                         """ | ||||||
|  |                         int blake2s_init(void **state, | ||||||
|  |                                          const uint8_t *key, | ||||||
|  |                                          size_t key_size, | ||||||
|  |                                          size_t digest_size); | ||||||
|  |                         int blake2s_destroy(void *state); | ||||||
|  |                         int blake2s_update(void *state, | ||||||
|  |                                            const uint8_t *buf, | ||||||
|  |                                            size_t len); | ||||||
|  |                         int blake2s_digest(const void *state, | ||||||
|  |                                            uint8_t digest[32]); | ||||||
|  |                         int blake2s_copy(const void *src, void *dst); | ||||||
|  |                         """) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class BLAKE2s_Hash(object): | ||||||
|  |     """A BLAKE2s hash object. | ||||||
|  |     Do not instantiate directly. Use the :func:`new` function. | ||||||
|  | 
 | ||||||
|  |     :ivar oid: ASN.1 Object ID | ||||||
|  |     :vartype oid: string | ||||||
|  | 
 | ||||||
|  |     :ivar block_size: the size in bytes of the internal message block, | ||||||
|  |                       input to the compression function | ||||||
|  |     :vartype block_size: integer | ||||||
|  | 
 | ||||||
|  |     :ivar digest_size: the size in bytes of the resulting hash | ||||||
|  |     :vartype digest_size: integer | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     # The internal block size of the hash algorithm in bytes. | ||||||
|  |     block_size = 32 | ||||||
|  | 
 | ||||||
|  |     def __init__(self, data, key, digest_bytes, update_after_digest): | ||||||
|  | 
 | ||||||
|  |         # The size of the resulting hash in bytes. | ||||||
|  |         self.digest_size = digest_bytes | ||||||
|  | 
 | ||||||
|  |         self._update_after_digest = update_after_digest | ||||||
|  |         self._digest_done = False | ||||||
|  | 
 | ||||||
|  |         # See https://tools.ietf.org/html/rfc7693 | ||||||
|  |         if digest_bytes in (16, 20, 28, 32) and not key: | ||||||
|  |             self.oid = "1.3.6.1.4.1.1722.12.2.2." + str(digest_bytes) | ||||||
|  | 
 | ||||||
|  |         state = VoidPointer() | ||||||
|  |         result = _raw_blake2s_lib.blake2s_init(state.address_of(), | ||||||
|  |                                                c_uint8_ptr(key), | ||||||
|  |                                                c_size_t(len(key)), | ||||||
|  |                                                c_size_t(digest_bytes) | ||||||
|  |                                                ) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating BLAKE2s" % result) | ||||||
|  |         self._state = SmartPointer(state.get(), | ||||||
|  |                                    _raw_blake2s_lib.blake2s_destroy) | ||||||
|  |         if data: | ||||||
|  |             self.update(data) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def update(self, data): | ||||||
|  |         """Continue hashing of a message by consuming the next chunk of data. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |             data (byte string/byte array/memoryview): The next chunk of the message being hashed. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if self._digest_done and not self._update_after_digest: | ||||||
|  |             raise TypeError("You can only call 'digest' or 'hexdigest' on this object") | ||||||
|  | 
 | ||||||
|  |         result = _raw_blake2s_lib.blake2s_update(self._state.get(), | ||||||
|  |                                                  c_uint8_ptr(data), | ||||||
|  |                                                  c_size_t(len(data))) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while hashing BLAKE2s data" % result) | ||||||
|  |         return self | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         """Return the **binary** (non-printable) digest of the message that has been hashed so far. | ||||||
|  | 
 | ||||||
|  |         :return: The hash digest, computed over the data processed so far. | ||||||
|  |                  Binary form. | ||||||
|  |         :rtype: byte string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         bfr = create_string_buffer(32) | ||||||
|  |         result = _raw_blake2s_lib.blake2s_digest(self._state.get(), | ||||||
|  |                                                  bfr) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while creating BLAKE2s digest" % result) | ||||||
|  | 
 | ||||||
|  |         self._digest_done = True | ||||||
|  | 
 | ||||||
|  |         return get_raw_buffer(bfr)[:self.digest_size] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def hexdigest(self): | ||||||
|  |         """Return the **printable** digest of the message that has been hashed so far. | ||||||
|  | 
 | ||||||
|  |         :return: The hash digest, computed over the data processed so far. | ||||||
|  |                  Hexadecimal encoded. | ||||||
|  |         :rtype: string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         return "".join(["%02x" % bord(x) for x in tuple(self.digest())]) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def verify(self, mac_tag): | ||||||
|  |         """Verify that a given **binary** MAC (computed by another party) | ||||||
|  |         is valid. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |           mac_tag (byte string/byte array/memoryview): the expected MAC of the message. | ||||||
|  | 
 | ||||||
|  |         Raises: | ||||||
|  |             ValueError: if the MAC does not match. It means that the message | ||||||
|  |                 has been tampered with or that the MAC key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         secret = get_random_bytes(16) | ||||||
|  | 
 | ||||||
|  |         mac1 = new(digest_bits=160, key=secret, data=mac_tag) | ||||||
|  |         mac2 = new(digest_bits=160, key=secret, data=self.digest()) | ||||||
|  | 
 | ||||||
|  |         if mac1.digest() != mac2.digest(): | ||||||
|  |             raise ValueError("MAC check failed") | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def hexverify(self, hex_mac_tag): | ||||||
|  |         """Verify that a given **printable** MAC (computed by another party) | ||||||
|  |         is valid. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |             hex_mac_tag (string): the expected MAC of the message, as a hexadecimal string. | ||||||
|  | 
 | ||||||
|  |         Raises: | ||||||
|  |             ValueError: if the MAC does not match. It means that the message | ||||||
|  |                 has been tampered with or that the MAC key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self.verify(unhexlify(tobytes(hex_mac_tag))) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def new(self, **kwargs): | ||||||
|  |         """Return a new instance of a BLAKE2s hash object. | ||||||
|  |         See :func:`new`. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "digest_bytes" not in kwargs and "digest_bits" not in kwargs: | ||||||
|  |             kwargs["digest_bytes"] = self.digest_size | ||||||
|  | 
 | ||||||
|  |         return new(**kwargs) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(**kwargs): | ||||||
|  |     """Create a new hash object. | ||||||
|  | 
 | ||||||
|  |     Args: | ||||||
|  |         data (byte string/byte array/memoryview): | ||||||
|  |             Optional. The very first chunk of the message to hash. | ||||||
|  |             It is equivalent to an early call to :meth:`BLAKE2s_Hash.update`. | ||||||
|  |         digest_bytes (integer): | ||||||
|  |             Optional. The size of the digest, in bytes (1 to 32). Default is 32. | ||||||
|  |         digest_bits (integer): | ||||||
|  |             Optional and alternative to ``digest_bytes``. | ||||||
|  |             The size of the digest, in bits (8 to 256, in steps of 8). | ||||||
|  |             Default is 256. | ||||||
|  |         key (byte string): | ||||||
|  |             Optional. The key to use to compute the MAC (1 to 64 bytes). | ||||||
|  |             If not specified, no key will be used. | ||||||
|  |         update_after_digest (boolean): | ||||||
|  |             Optional. By default, a hash object cannot be updated anymore after | ||||||
|  |             the digest is computed. When this flag is ``True``, such check | ||||||
|  |             is no longer enforced. | ||||||
|  | 
 | ||||||
|  |     Returns: | ||||||
|  |         A :class:`BLAKE2s_Hash` hash object | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     data = kwargs.pop("data", None) | ||||||
|  |     update_after_digest = kwargs.pop("update_after_digest", False) | ||||||
|  | 
 | ||||||
|  |     digest_bytes = kwargs.pop("digest_bytes", None) | ||||||
|  |     digest_bits = kwargs.pop("digest_bits", None) | ||||||
|  |     if None not in (digest_bytes, digest_bits): | ||||||
|  |         raise TypeError("Only one digest parameter must be provided") | ||||||
|  |     if (None, None) == (digest_bytes, digest_bits): | ||||||
|  |         digest_bytes = 32 | ||||||
|  |     if digest_bytes is not None: | ||||||
|  |         if not (1 <= digest_bytes <= 32): | ||||||
|  |             raise ValueError("'digest_bytes' not in range 1..32") | ||||||
|  |     else: | ||||||
|  |         if not (8 <= digest_bits <= 256) or (digest_bits % 8): | ||||||
|  |             raise ValueError("'digest_bits' not in range 8..256, " | ||||||
|  |                              "with steps of 8") | ||||||
|  |         digest_bytes = digest_bits // 8 | ||||||
|  | 
 | ||||||
|  |     key = kwargs.pop("key", b"") | ||||||
|  |     if len(key) > 32: | ||||||
|  |         raise ValueError("BLAKE2s key cannot exceed 32 bytes") | ||||||
|  | 
 | ||||||
|  |     if kwargs: | ||||||
|  |         raise TypeError("Unknown parameters: " + str(kwargs)) | ||||||
|  | 
 | ||||||
|  |     return BLAKE2s_Hash(data, key, digest_bytes, update_after_digest) | ||||||
							
								
								
									
										26
									
								
								resources/lib/deps/Cryptodome/Hash/BLAKE2s.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								resources/lib/deps/Cryptodome/Hash/BLAKE2s.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | ||||||
|  | from typing import Any, Union | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | class BLAKE2s_Hash(object): | ||||||
|  |     block_size: int | ||||||
|  |     digest_size: int | ||||||
|  |     oid: str | ||||||
|  | 
 | ||||||
|  |     def __init__(self, | ||||||
|  |                  data: Buffer, | ||||||
|  | 		 key: Buffer, | ||||||
|  | 		 digest_bytes: bytes, | ||||||
|  | 		 update_after_digest: bool) -> None: ... | ||||||
|  |     def update(self, data: Buffer) -> BLAKE2s_Hash: ... | ||||||
|  |     def digest(self) -> bytes: ... | ||||||
|  |     def hexdigest(self) -> str: ... | ||||||
|  |     def verify(self, mac_tag: Buffer) -> None: ... | ||||||
|  |     def hexverify(self, hex_mac_tag: str) -> None: ... | ||||||
|  |     def new(self, **kwargs: Any) -> BLAKE2s_Hash: ... | ||||||
|  | 
 | ||||||
|  | def new(data: Buffer = ..., | ||||||
|  | 	digest_bytes: int = ..., | ||||||
|  | 	digest_bits: int = ..., | ||||||
|  | 	key: Buffer = ..., | ||||||
|  | 	update_after_digest: bool = ...) -> BLAKE2s_Hash: ... | ||||||
							
								
								
									
										306
									
								
								resources/lib/deps/Cryptodome/Hash/CMAC.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										306
									
								
								resources/lib/deps/Cryptodome/Hash/CMAC.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,306 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | # Hash/CMAC.py - Implements the CMAC algorithm | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | from binascii import unhexlify | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Hash import BLAKE2s | ||||||
|  | from Cryptodome.Util.strxor import strxor | ||||||
|  | from Cryptodome.Util.number import long_to_bytes, bytes_to_long | ||||||
|  | from Cryptodome.Util.py3compat import bord, tobytes, _copy_bytes | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # The size of the authentication tag produced by the MAC. | ||||||
|  | digest_size = None | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _shift_bytes(bs, xor_lsb=0): | ||||||
|  |     num = (bytes_to_long(bs) << 1) ^ xor_lsb | ||||||
|  |     return long_to_bytes(num, len(bs))[-len(bs):] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class CMAC(object): | ||||||
|  |     """A CMAC hash object. | ||||||
|  |     Do not instantiate directly. Use the :func:`new` function. | ||||||
|  | 
 | ||||||
|  |     :ivar digest_size: the size in bytes of the resulting MAC tag | ||||||
|  |     :vartype digest_size: integer | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     digest_size = None | ||||||
|  | 
 | ||||||
|  |     def __init__(self, key, msg, ciphermod, cipher_params, mac_len, | ||||||
|  |                  update_after_digest): | ||||||
|  | 
 | ||||||
|  |         self.digest_size = mac_len | ||||||
|  | 
 | ||||||
|  |         self._key = _copy_bytes(None, None, key) | ||||||
|  |         self._factory = ciphermod | ||||||
|  |         self._cipher_params = cipher_params | ||||||
|  |         self._block_size = bs = ciphermod.block_size | ||||||
|  |         self._mac_tag = None | ||||||
|  |         self._update_after_digest = update_after_digest | ||||||
|  | 
 | ||||||
|  |         # Section 5.3 of NIST SP 800 38B and Appendix B | ||||||
|  |         if bs == 8: | ||||||
|  |             const_Rb = 0x1B | ||||||
|  |             self._max_size = 8 * (2 ** 21) | ||||||
|  |         elif bs == 16: | ||||||
|  |             const_Rb = 0x87 | ||||||
|  |             self._max_size = 16 * (2 ** 48) | ||||||
|  |         else: | ||||||
|  |             raise TypeError("CMAC requires a cipher with a block size" | ||||||
|  |                             " of 8 or 16 bytes, not %d" % bs) | ||||||
|  | 
 | ||||||
|  |         # Compute sub-keys | ||||||
|  |         zero_block = b'\x00' * bs | ||||||
|  |         self._ecb = ciphermod.new(key, | ||||||
|  |                                   ciphermod.MODE_ECB, | ||||||
|  |                                   **self._cipher_params) | ||||||
|  |         L = self._ecb.encrypt(zero_block) | ||||||
|  |         if bord(L[0]) & 0x80: | ||||||
|  |             self._k1 = _shift_bytes(L, const_Rb) | ||||||
|  |         else: | ||||||
|  |             self._k1 = _shift_bytes(L) | ||||||
|  |         if bord(self._k1[0]) & 0x80: | ||||||
|  |             self._k2 = _shift_bytes(self._k1, const_Rb) | ||||||
|  |         else: | ||||||
|  |             self._k2 = _shift_bytes(self._k1) | ||||||
|  | 
 | ||||||
|  |         # Initialize CBC cipher with zero IV | ||||||
|  |         self._cbc = ciphermod.new(key, | ||||||
|  |                                   ciphermod.MODE_CBC, | ||||||
|  |                                   zero_block, | ||||||
|  |                                   **self._cipher_params) | ||||||
|  | 
 | ||||||
|  |         # Cache for outstanding data to authenticate | ||||||
|  |         self._cache = bytearray(bs) | ||||||
|  |         self._cache_n = 0 | ||||||
|  | 
 | ||||||
|  |         # Last piece of ciphertext produced | ||||||
|  |         self._last_ct = zero_block | ||||||
|  | 
 | ||||||
|  |         # Last block that was encrypted with AES | ||||||
|  |         self._last_pt = None | ||||||
|  | 
 | ||||||
|  |         # Counter for total message size | ||||||
|  |         self._data_size = 0 | ||||||
|  | 
 | ||||||
|  |         if msg: | ||||||
|  |             self.update(msg) | ||||||
|  | 
 | ||||||
|  |     def update(self, msg): | ||||||
|  |         """Authenticate the next chunk of message. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |             data (byte string/byte array/memoryview): The next chunk of data | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if self._mac_tag is not None and not self._update_after_digest: | ||||||
|  |             raise TypeError("update() cannot be called after digest() or verify()") | ||||||
|  | 
 | ||||||
|  |         self._data_size += len(msg) | ||||||
|  |         bs = self._block_size | ||||||
|  | 
 | ||||||
|  |         if self._cache_n > 0: | ||||||
|  |             filler = min(bs - self._cache_n, len(msg)) | ||||||
|  |             self._cache[self._cache_n:self._cache_n+filler] = msg[:filler] | ||||||
|  |             self._cache_n += filler | ||||||
|  | 
 | ||||||
|  |             if self._cache_n < bs: | ||||||
|  |                 return self | ||||||
|  | 
 | ||||||
|  |             msg = memoryview(msg)[filler:] | ||||||
|  |             self._update(self._cache) | ||||||
|  |             self._cache_n = 0 | ||||||
|  | 
 | ||||||
|  |         remain = len(msg) % bs | ||||||
|  |         if remain > 0: | ||||||
|  |             self._update(msg[:-remain]) | ||||||
|  |             self._cache[:remain] = msg[-remain:] | ||||||
|  |         else: | ||||||
|  |             self._update(msg) | ||||||
|  |         self._cache_n = remain | ||||||
|  |         return self | ||||||
|  | 
 | ||||||
|  |     def _update(self, data_block): | ||||||
|  |         """Update a block aligned to the block boundary""" | ||||||
|  |          | ||||||
|  |         bs = self._block_size | ||||||
|  |         assert len(data_block) % bs == 0 | ||||||
|  | 
 | ||||||
|  |         if len(data_block) == 0: | ||||||
|  |             return | ||||||
|  | 
 | ||||||
|  |         ct = self._cbc.encrypt(data_block) | ||||||
|  |         if len(data_block) == bs: | ||||||
|  |             second_last = self._last_ct | ||||||
|  |         else: | ||||||
|  |             second_last = ct[-bs*2:-bs] | ||||||
|  |         self._last_ct = ct[-bs:] | ||||||
|  |         self._last_pt = strxor(second_last, data_block[-bs:]) | ||||||
|  | 
 | ||||||
|  |     def copy(self): | ||||||
|  |         """Return a copy ("clone") of the CMAC object. | ||||||
|  | 
 | ||||||
|  |         The copy will have the same internal state as the original CMAC | ||||||
|  |         object. | ||||||
|  |         This can be used to efficiently compute the MAC tag of byte | ||||||
|  |         strings that share a common initial substring. | ||||||
|  | 
 | ||||||
|  |         :return: An :class:`CMAC` | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         obj = self.__new__(CMAC) | ||||||
|  |         obj.__dict__ = self.__dict__.copy() | ||||||
|  |         obj._cbc = self._factory.new(self._key, | ||||||
|  |                                      self._factory.MODE_CBC, | ||||||
|  |                                      self._last_ct, | ||||||
|  |                                      **self._cipher_params) | ||||||
|  |         obj._cache = self._cache[:] | ||||||
|  |         obj._last_ct = self._last_ct[:] | ||||||
|  |         return obj | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         """Return the **binary** (non-printable) MAC tag of the message | ||||||
|  |         that has been authenticated so far. | ||||||
|  | 
 | ||||||
|  |         :return: The MAC tag, computed over the data processed so far. | ||||||
|  |                  Binary form. | ||||||
|  |         :rtype: byte string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         bs = self._block_size | ||||||
|  | 
 | ||||||
|  |         if self._mac_tag is not None and not self._update_after_digest: | ||||||
|  |             return self._mac_tag | ||||||
|  | 
 | ||||||
|  |         if self._data_size > self._max_size: | ||||||
|  |             raise ValueError("MAC is unsafe for this message") | ||||||
|  | 
 | ||||||
|  |         if self._cache_n == 0 and self._data_size > 0: | ||||||
|  |             # Last block was full | ||||||
|  |             pt = strxor(self._last_pt, self._k1) | ||||||
|  |         else: | ||||||
|  |             # Last block is partial (or message length is zero) | ||||||
|  |             partial = self._cache[:] | ||||||
|  |             partial[self._cache_n:] = b'\x80' + b'\x00' * (bs - self._cache_n - 1) | ||||||
|  |             pt = strxor(strxor(self._last_ct, partial), self._k2) | ||||||
|  | 
 | ||||||
|  |         self._mac_tag = self._ecb.encrypt(pt)[:self.digest_size] | ||||||
|  | 
 | ||||||
|  |         return self._mac_tag | ||||||
|  | 
 | ||||||
|  |     def hexdigest(self): | ||||||
|  |         """Return the **printable** MAC tag of the message authenticated so far. | ||||||
|  | 
 | ||||||
|  |         :return: The MAC tag, computed over the data processed so far. | ||||||
|  |                  Hexadecimal encoded. | ||||||
|  |         :rtype: string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         return "".join(["%02x" % bord(x) | ||||||
|  |                         for x in tuple(self.digest())]) | ||||||
|  | 
 | ||||||
|  |     def verify(self, mac_tag): | ||||||
|  |         """Verify that a given **binary** MAC (computed by another party) | ||||||
|  |         is valid. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |           mac_tag (byte string/byte array/memoryview): the expected MAC of the message. | ||||||
|  | 
 | ||||||
|  |         Raises: | ||||||
|  |             ValueError: if the MAC does not match. It means that the message | ||||||
|  |                 has been tampered with or that the MAC key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         secret = get_random_bytes(16) | ||||||
|  | 
 | ||||||
|  |         mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=mac_tag) | ||||||
|  |         mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=self.digest()) | ||||||
|  | 
 | ||||||
|  |         if mac1.digest() != mac2.digest(): | ||||||
|  |             raise ValueError("MAC check failed") | ||||||
|  | 
 | ||||||
|  |     def hexverify(self, hex_mac_tag): | ||||||
|  |         """Verify that a given **printable** MAC (computed by another party) | ||||||
|  |         is valid. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |           hex_mac_tag (string): the expected MAC of the message, as a hexadecimal string. | ||||||
|  | 
 | ||||||
|  |         Raises: | ||||||
|  |             ValueError: if the MAC does not match. It means that the message | ||||||
|  |                 has been tampered with or that the MAC key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self.verify(unhexlify(tobytes(hex_mac_tag))) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(key, msg=None, ciphermod=None, cipher_params=None, mac_len=None, | ||||||
|  |         update_after_digest=False): | ||||||
|  |     """Create a new MAC object. | ||||||
|  | 
 | ||||||
|  |     Args: | ||||||
|  |         key (byte string/byte array/memoryview): | ||||||
|  |             key for the CMAC object. | ||||||
|  |             The key must be valid for the underlying cipher algorithm. | ||||||
|  |             For instance, it must be 16 bytes long for AES-128. | ||||||
|  |         ciphermod (module): | ||||||
|  |             A cipher module from :mod:`Cryptodome.Cipher`. | ||||||
|  |             The cipher's block size has to be 128 bits, | ||||||
|  |             like :mod:`Cryptodome.Cipher.AES`, to reduce the probability | ||||||
|  |             of collisions. | ||||||
|  |         msg (byte string/byte array/memoryview): | ||||||
|  |             Optional. The very first chunk of the message to authenticate. | ||||||
|  |             It is equivalent to an early call to `CMAC.update`. Optional. | ||||||
|  |         cipher_params (dict): | ||||||
|  |             Optional. A set of parameters to use when instantiating a cipher | ||||||
|  |             object. | ||||||
|  |         mac_len (integer): | ||||||
|  |             Length of the MAC, in bytes. | ||||||
|  |             It must be at least 4 bytes long. | ||||||
|  |             The default (and recommended) length matches the size of a cipher block. | ||||||
|  |         update_after_digest (boolean): | ||||||
|  |             Optional. By default, a hash object cannot be updated anymore after | ||||||
|  |             the digest is computed. When this flag is ``True``, such check | ||||||
|  |             is no longer enforced. | ||||||
|  |     Returns: | ||||||
|  |         A :class:`CMAC` object | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     if ciphermod is None: | ||||||
|  |         raise TypeError("ciphermod must be specified (try AES)") | ||||||
|  | 
 | ||||||
|  |     cipher_params = {} if cipher_params is None else dict(cipher_params) | ||||||
|  | 
 | ||||||
|  |     if mac_len is None: | ||||||
|  |         mac_len = ciphermod.block_size | ||||||
|  |      | ||||||
|  |     if mac_len < 4: | ||||||
|  |         raise ValueError("MAC tag length must be at least 4 bytes long") | ||||||
|  |      | ||||||
|  |     if mac_len > ciphermod.block_size: | ||||||
|  |         raise ValueError("MAC tag length cannot be larger than a cipher block (%d) bytes" % ciphermod.block_size) | ||||||
|  | 
 | ||||||
|  |     return CMAC(key, msg, ciphermod, cipher_params, mac_len, | ||||||
|  |                 update_after_digest) | ||||||
							
								
								
									
										30
									
								
								resources/lib/deps/Cryptodome/Hash/CMAC.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								resources/lib/deps/Cryptodome/Hash/CMAC.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | ||||||
|  | from types import ModuleType | ||||||
|  | from typing import Union, Dict, Any | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | digest_size: int | ||||||
|  | 
 | ||||||
|  | class CMAC(object): | ||||||
|  |     digest_size: int | ||||||
|  | 
 | ||||||
|  |     def __init__(self, | ||||||
|  | 		 key: Buffer, | ||||||
|  |                  msg: Buffer, | ||||||
|  | 		 ciphermod: ModuleType, | ||||||
|  | 		 cipher_params: Dict[str, Any], | ||||||
|  |                  mac_len: int, update_after_digest: bool) -> None: ... | ||||||
|  |     def update(self, data: Buffer) -> CMAC: ... | ||||||
|  |     def copy(self) -> CMAC: ... | ||||||
|  |     def digest(self) -> bytes: ... | ||||||
|  |     def hexdigest(self) -> str: ... | ||||||
|  |     def verify(self, mac_tag: Buffer) -> None: ... | ||||||
|  |     def hexverify(self, hex_mac_tag: str) -> None: ... | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(key: Buffer, | ||||||
|  |         msg: Buffer = ..., | ||||||
|  | 	ciphermod: ModuleType = ..., | ||||||
|  | 	cipher_params: Dict[str, Any] = ..., | ||||||
|  | 	mac_len: int = ..., | ||||||
|  |         update_after_digest: bool = ...) -> CMAC: ... | ||||||
							
								
								
									
										238
									
								
								resources/lib/deps/Cryptodome/Hash/HMAC.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										238
									
								
								resources/lib/deps/Cryptodome/Hash/HMAC.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,238 @@ | ||||||
|  | # | ||||||
|  | # HMAC.py - Implements the HMAC algorithm as described by RFC 2104. | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2014, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import bord, tobytes | ||||||
|  | 
 | ||||||
|  | from binascii import unhexlify | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Hash import BLAKE2s | ||||||
|  | from Cryptodome.Util.strxor import strxor | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | 
 | ||||||
|  | __all__ = ['new', 'HMAC'] | ||||||
|  | 
 | ||||||
|  | _hash2hmac_oid = { | ||||||
|  |     '1.3.14.3.2.26': '1.2.840.113549.2.7',           # SHA-1 | ||||||
|  |     '2.16.840.1.101.3.4.2.4': '1.2.840.113549.2.8',  # SHA-224 | ||||||
|  |     '2.16.840.1.101.3.4.2.1': '1.2.840.113549.2.9',  # SHA-256 | ||||||
|  |     '2.16.840.1.101.3.4.2.2': '1.2.840.113549.2.10',  # SHA-384 | ||||||
|  |     '2.16.840.1.101.3.4.2.3': '1.2.840.113549.2.11',  # SHA-512 | ||||||
|  |     '2.16.840.1.101.3.4.2.5': '1.2.840.113549.2.12',  # SHA-512_224 | ||||||
|  |     '2.16.840.1.101.3.4.2.6': '1.2.840.113549.2.13',  # SHA-512_256 | ||||||
|  |     '2.16.840.1.101.3.4.2.7': '2.16.840.1.101.3.4.2.13',   # SHA-3 224 | ||||||
|  |     '2.16.840.1.101.3.4.2.8': '2.16.840.1.101.3.4.2.14',   # SHA-3 256 | ||||||
|  |     '2.16.840.1.101.3.4.2.9': '2.16.840.1.101.3.4.2.15',   # SHA-3 384 | ||||||
|  |     '2.16.840.1.101.3.4.2.10': '2.16.840.1.101.3.4.2.16',  # SHA-3 512 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | _hmac2hash_oid = {v: k for k, v in _hash2hmac_oid.items()} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class HMAC(object): | ||||||
|  |     """An HMAC hash object. | ||||||
|  |     Do not instantiate directly. Use the :func:`new` function. | ||||||
|  | 
 | ||||||
|  |     :ivar digest_size: the size in bytes of the resulting MAC tag | ||||||
|  |     :vartype digest_size: integer | ||||||
|  | 
 | ||||||
|  |     :ivar oid: the ASN.1 object ID of the HMAC algorithm. | ||||||
|  |                Only present if the algorithm was officially assigned one. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, key, msg=b"", digestmod=None): | ||||||
|  | 
 | ||||||
|  |         if digestmod is None: | ||||||
|  |             from Cryptodome.Hash import MD5 | ||||||
|  |             digestmod = MD5 | ||||||
|  | 
 | ||||||
|  |         if msg is None: | ||||||
|  |             msg = b"" | ||||||
|  | 
 | ||||||
|  |         # Size of the MAC tag | ||||||
|  |         self.digest_size = digestmod.digest_size | ||||||
|  | 
 | ||||||
|  |         self._digestmod = digestmod | ||||||
|  | 
 | ||||||
|  |         # Hash OID --> HMAC OID | ||||||
|  |         try: | ||||||
|  |             self.oid = _hash2hmac_oid[digestmod.oid] | ||||||
|  |         except (KeyError, AttributeError): | ||||||
|  |             pass | ||||||
|  | 
 | ||||||
|  |         if isinstance(key, memoryview): | ||||||
|  |             key = key.tobytes() | ||||||
|  | 
 | ||||||
|  |         try: | ||||||
|  |             if len(key) <= digestmod.block_size: | ||||||
|  |                 # Step 1 or 2 | ||||||
|  |                 key_0 = key + b"\x00" * (digestmod.block_size - len(key)) | ||||||
|  |             else: | ||||||
|  |                 # Step 3 | ||||||
|  |                 hash_k = digestmod.new(key).digest() | ||||||
|  |                 key_0 = hash_k + b"\x00" * (digestmod.block_size - len(hash_k)) | ||||||
|  |         except AttributeError: | ||||||
|  |             # Not all hash types have "block_size" | ||||||
|  |             raise ValueError("Hash type incompatible to HMAC") | ||||||
|  | 
 | ||||||
|  |         # Step 4 | ||||||
|  |         key_0_ipad = strxor(key_0, b"\x36" * len(key_0)) | ||||||
|  | 
 | ||||||
|  |         # Start step 5 and 6 | ||||||
|  |         self._inner = digestmod.new(key_0_ipad) | ||||||
|  |         self._inner.update(msg) | ||||||
|  | 
 | ||||||
|  |         # Step 7 | ||||||
|  |         key_0_opad = strxor(key_0, b"\x5c" * len(key_0)) | ||||||
|  | 
 | ||||||
|  |         # Start step 8 and 9 | ||||||
|  |         self._outer = digestmod.new(key_0_opad) | ||||||
|  | 
 | ||||||
|  |     def update(self, msg): | ||||||
|  |         """Authenticate the next chunk of message. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |             data (byte string/byte array/memoryview): The next chunk of data | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self._inner.update(msg) | ||||||
|  |         return self | ||||||
|  | 
 | ||||||
|  |     def _pbkdf2_hmac_assist(self, first_digest, iterations): | ||||||
|  |         """Carry out the expensive inner loop for PBKDF2-HMAC""" | ||||||
|  | 
 | ||||||
|  |         result = self._digestmod._pbkdf2_hmac_assist( | ||||||
|  |                                     self._inner, | ||||||
|  |                                     self._outer, | ||||||
|  |                                     first_digest, | ||||||
|  |                                     iterations) | ||||||
|  |         return result | ||||||
|  | 
 | ||||||
|  |     def copy(self): | ||||||
|  |         """Return a copy ("clone") of the HMAC object. | ||||||
|  | 
 | ||||||
|  |         The copy will have the same internal state as the original HMAC | ||||||
|  |         object. | ||||||
|  |         This can be used to efficiently compute the MAC tag of byte | ||||||
|  |         strings that share a common initial substring. | ||||||
|  | 
 | ||||||
|  |         :return: An :class:`HMAC` | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         new_hmac = HMAC(b"fake key", digestmod=self._digestmod) | ||||||
|  | 
 | ||||||
|  |         # Syncronize the state | ||||||
|  |         new_hmac._inner = self._inner.copy() | ||||||
|  |         new_hmac._outer = self._outer.copy() | ||||||
|  | 
 | ||||||
|  |         return new_hmac | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         """Return the **binary** (non-printable) MAC tag of the message | ||||||
|  |         authenticated so far. | ||||||
|  | 
 | ||||||
|  |         :return: The MAC tag digest, computed over the data processed so far. | ||||||
|  |                  Binary form. | ||||||
|  |         :rtype: byte string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         frozen_outer_hash = self._outer.copy() | ||||||
|  |         frozen_outer_hash.update(self._inner.digest()) | ||||||
|  |         return frozen_outer_hash.digest() | ||||||
|  | 
 | ||||||
|  |     def verify(self, mac_tag): | ||||||
|  |         """Verify that a given **binary** MAC (computed by another party) | ||||||
|  |         is valid. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |           mac_tag (byte string/byte string/memoryview): the expected MAC of the message. | ||||||
|  | 
 | ||||||
|  |         Raises: | ||||||
|  |             ValueError: if the MAC does not match. It means that the message | ||||||
|  |                 has been tampered with or that the MAC key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         secret = get_random_bytes(16) | ||||||
|  | 
 | ||||||
|  |         mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=mac_tag) | ||||||
|  |         mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=self.digest()) | ||||||
|  | 
 | ||||||
|  |         if mac1.digest() != mac2.digest(): | ||||||
|  |             raise ValueError("MAC check failed") | ||||||
|  | 
 | ||||||
|  |     def hexdigest(self): | ||||||
|  |         """Return the **printable** MAC tag of the message authenticated so far. | ||||||
|  | 
 | ||||||
|  |         :return: The MAC tag, computed over the data processed so far. | ||||||
|  |                  Hexadecimal encoded. | ||||||
|  |         :rtype: string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         return "".join(["%02x" % bord(x) | ||||||
|  |                         for x in tuple(self.digest())]) | ||||||
|  | 
 | ||||||
|  |     def hexverify(self, hex_mac_tag): | ||||||
|  |         """Verify that a given **printable** MAC (computed by another party) | ||||||
|  |         is valid. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |             hex_mac_tag (string): the expected MAC of the message, | ||||||
|  |                 as a hexadecimal string. | ||||||
|  | 
 | ||||||
|  |         Raises: | ||||||
|  |             ValueError: if the MAC does not match. It means that the message | ||||||
|  |                 has been tampered with or that the MAC key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self.verify(unhexlify(tobytes(hex_mac_tag))) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(key, msg=b"", digestmod=None): | ||||||
|  |     """Create a new MAC object. | ||||||
|  | 
 | ||||||
|  |     Args: | ||||||
|  |         key (bytes/bytearray/memoryview): | ||||||
|  |             key for the MAC object. | ||||||
|  |             It must be long enough to match the expected security level of the | ||||||
|  |             MAC. | ||||||
|  |         msg (bytes/bytearray/memoryview): | ||||||
|  |             Optional. The very first chunk of the message to authenticate. | ||||||
|  |             It is equivalent to an early call to :meth:`HMAC.update`. | ||||||
|  |         digestmod (module): | ||||||
|  |             The hash to use to implement the HMAC. | ||||||
|  |             Default is :mod:`Cryptodome.Hash.MD5`. | ||||||
|  | 
 | ||||||
|  |     Returns: | ||||||
|  |         An :class:`HMAC` object | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     return HMAC(key, msg, digestmod) | ||||||
							
								
								
									
										25
									
								
								resources/lib/deps/Cryptodome/Hash/HMAC.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								resources/lib/deps/Cryptodome/Hash/HMAC.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | ||||||
|  | from types import ModuleType | ||||||
|  | from typing import Union, Dict | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | digest_size: int | ||||||
|  | 
 | ||||||
|  | class HMAC(object): | ||||||
|  |     digest_size: int | ||||||
|  | 
 | ||||||
|  |     def __init__(self, | ||||||
|  | 		 key: Buffer, | ||||||
|  |                  msg: Buffer, | ||||||
|  | 		 digestmod: ModuleType) -> None: ... | ||||||
|  |     def update(self, msg: Buffer) -> HMAC: ... | ||||||
|  |     def copy(self) -> HMAC: ... | ||||||
|  |     def digest(self) -> bytes: ... | ||||||
|  |     def hexdigest(self) -> str: ... | ||||||
|  |     def verify(self, mac_tag: Buffer) -> None: ... | ||||||
|  |     def hexverify(self, hex_mac_tag: str) -> None: ... | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(key: Buffer, | ||||||
|  |         msg: Buffer = ..., | ||||||
|  | 	digestmod: ModuleType = ...) -> HMAC: ... | ||||||
							
								
								
									
										179
									
								
								resources/lib/deps/Cryptodome/Hash/KMAC128.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								resources/lib/deps/Cryptodome/Hash/KMAC128.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,179 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2021, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | from binascii import unhexlify | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import bord, tobytes, is_bytes | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | 
 | ||||||
|  | from . import cSHAKE128, SHA3_256 | ||||||
|  | from .cSHAKE128 import _bytepad, _encode_str, _right_encode | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class KMAC_Hash(object): | ||||||
|  |     """A KMAC hash object. | ||||||
|  |     Do not instantiate directly. | ||||||
|  |     Use the :func:`new` function. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, data, key, mac_len, custom, | ||||||
|  |                  oid_variant, cshake, rate): | ||||||
|  | 
 | ||||||
|  |         # See https://tools.ietf.org/html/rfc8702 | ||||||
|  |         self.oid = "2.16.840.1.101.3.4.2." + oid_variant | ||||||
|  |         self.digest_size = mac_len | ||||||
|  | 
 | ||||||
|  |         self._mac = None | ||||||
|  | 
 | ||||||
|  |         partial_newX = _bytepad(_encode_str(tobytes(key)), rate) | ||||||
|  |         self._cshake = cshake._new(partial_newX, custom, b"KMAC") | ||||||
|  | 
 | ||||||
|  |         if data: | ||||||
|  |             self._cshake.update(data) | ||||||
|  | 
 | ||||||
|  |     def update(self, data): | ||||||
|  |         """Authenticate the next chunk of message. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |             data (bytes/bytearray/memoryview): The next chunk of the message to | ||||||
|  |             authenticate. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if self._mac: | ||||||
|  |             raise TypeError("You can only call 'digest' or 'hexdigest' on this object") | ||||||
|  | 
 | ||||||
|  |         self._cshake.update(data) | ||||||
|  |         return self | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         """Return the **binary** (non-printable) MAC tag of the message. | ||||||
|  | 
 | ||||||
|  |         :return: The MAC tag. Binary form. | ||||||
|  |         :rtype: byte string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if not self._mac: | ||||||
|  |             self._cshake.update(_right_encode(self.digest_size * 8)) | ||||||
|  |             self._mac = self._cshake.read(self.digest_size) | ||||||
|  | 
 | ||||||
|  |         return self._mac | ||||||
|  | 
 | ||||||
|  |     def hexdigest(self): | ||||||
|  |         """Return the **printable** MAC tag of the message. | ||||||
|  | 
 | ||||||
|  |         :return: The MAC tag. Hexadecimal encoded. | ||||||
|  |         :rtype: string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         return "".join(["%02x" % bord(x) for x in tuple(self.digest())]) | ||||||
|  | 
 | ||||||
|  |     def verify(self, mac_tag): | ||||||
|  |         """Verify that a given **binary** MAC (computed by another party) | ||||||
|  |         is valid. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |           mac_tag (bytes/bytearray/memoryview): the expected MAC of the message. | ||||||
|  | 
 | ||||||
|  |         Raises: | ||||||
|  |             ValueError: if the MAC does not match. It means that the message | ||||||
|  |                 has been tampered with or that the MAC key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         secret = get_random_bytes(16) | ||||||
|  | 
 | ||||||
|  |         mac1 = SHA3_256.new(secret + mac_tag) | ||||||
|  |         mac2 = SHA3_256.new(secret + self.digest()) | ||||||
|  | 
 | ||||||
|  |         if mac1.digest() != mac2.digest(): | ||||||
|  |             raise ValueError("MAC check failed") | ||||||
|  | 
 | ||||||
|  |     def hexverify(self, hex_mac_tag): | ||||||
|  |         """Verify that a given **printable** MAC (computed by another party) | ||||||
|  |         is valid. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |             hex_mac_tag (string): the expected MAC of the message, as a hexadecimal string. | ||||||
|  | 
 | ||||||
|  |         Raises: | ||||||
|  |             ValueError: if the MAC does not match. It means that the message | ||||||
|  |                 has been tampered with or that the MAC key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self.verify(unhexlify(tobytes(hex_mac_tag))) | ||||||
|  | 
 | ||||||
|  |     def new(self, **kwargs): | ||||||
|  |         """Return a new instance of a KMAC hash object. | ||||||
|  |         See :func:`new`. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if "mac_len" not in kwargs: | ||||||
|  |             kwargs["mac_len"] = self.digest_size | ||||||
|  | 
 | ||||||
|  |         return new(**kwargs) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(**kwargs): | ||||||
|  |     """Create a new KMAC128 object. | ||||||
|  | 
 | ||||||
|  |     Args: | ||||||
|  |         key (bytes/bytearray/memoryview): | ||||||
|  |             The key to use to compute the MAC. | ||||||
|  |             It must be at least 128 bits long (16 bytes). | ||||||
|  |         data (bytes/bytearray/memoryview): | ||||||
|  |             Optional. The very first chunk of the message to authenticate. | ||||||
|  |             It is equivalent to an early call to :meth:`KMAC_Hash.update`. | ||||||
|  |         mac_len (integer): | ||||||
|  |             Optional. The size of the authentication tag, in bytes. | ||||||
|  |             Default is 64. Minimum is 8. | ||||||
|  |         custom (bytes/bytearray/memoryview): | ||||||
|  |             Optional. A customization byte string (``S`` in SP 800-185). | ||||||
|  | 
 | ||||||
|  |     Returns: | ||||||
|  |         A :class:`KMAC_Hash` hash object | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     key = kwargs.pop("key", None) | ||||||
|  |     if not is_bytes(key): | ||||||
|  |         raise TypeError("You must pass a key to KMAC128") | ||||||
|  |     if len(key) < 16: | ||||||
|  |         raise ValueError("The key must be at least 128 bits long (16 bytes)") | ||||||
|  | 
 | ||||||
|  |     data = kwargs.pop("data", None) | ||||||
|  | 
 | ||||||
|  |     mac_len = kwargs.pop("mac_len", 64) | ||||||
|  |     if mac_len < 8: | ||||||
|  |         raise ValueError("'mac_len' must be 8 bytes or more") | ||||||
|  | 
 | ||||||
|  |     custom = kwargs.pop("custom", b"") | ||||||
|  | 
 | ||||||
|  |     if kwargs: | ||||||
|  |         raise TypeError("Unknown parameters: " + str(kwargs)) | ||||||
|  | 
 | ||||||
|  |     return KMAC_Hash(data, key, mac_len, custom, "19", cSHAKE128, 168) | ||||||
							
								
								
									
										33
									
								
								resources/lib/deps/Cryptodome/Hash/KMAC128.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								resources/lib/deps/Cryptodome/Hash/KMAC128.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,33 @@ | ||||||
|  | from typing import Union | ||||||
|  | from types import ModuleType | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | class KMAC_Hash(object): | ||||||
|  | 
 | ||||||
|  |     def __init__(self, | ||||||
|  |                  data: Buffer, | ||||||
|  |                  key: Buffer, | ||||||
|  |                  mac_len: int, | ||||||
|  |                  custom: Buffer, | ||||||
|  |                  oid_variant: str, | ||||||
|  |                  cshake: ModuleType, | ||||||
|  |                  rate: int) -> None: ... | ||||||
|  | 
 | ||||||
|  |     def update(self, data: Buffer) -> KMAC_Hash: ... | ||||||
|  | 
 | ||||||
|  |     def digest(self) -> bytes: ... | ||||||
|  |     def hexdigest(self) -> str: ... | ||||||
|  |     def verify(self, mac_tag: Buffer) -> None: ... | ||||||
|  |     def hexverify(self, hex_mac_tag: str) -> None: ... | ||||||
|  |     def new(self, | ||||||
|  |             data: Buffer = ..., | ||||||
|  | 	        mac_len: int = ..., | ||||||
|  | 	        key: Buffer = ..., | ||||||
|  |             custom: Buffer = ...) -> KMAC_Hash: ... | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(key: Buffer, | ||||||
|  |         data: Buffer = ..., | ||||||
|  | 	    mac_len: int = ..., | ||||||
|  |         custom: Buffer = ...) -> KMAC_Hash: ... | ||||||
							
								
								
									
										74
									
								
								resources/lib/deps/Cryptodome/Hash/KMAC256.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								resources/lib/deps/Cryptodome/Hash/KMAC256.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,74 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2021, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import is_bytes | ||||||
|  | 
 | ||||||
|  | from .KMAC128 import KMAC_Hash | ||||||
|  | from . import cSHAKE256 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(**kwargs): | ||||||
|  |     """Create a new KMAC256 object. | ||||||
|  | 
 | ||||||
|  |     Args: | ||||||
|  |         key (bytes/bytearray/memoryview): | ||||||
|  |             The key to use to compute the MAC. | ||||||
|  |             It must be at least 256 bits long (32 bytes). | ||||||
|  |         data (bytes/bytearray/memoryview): | ||||||
|  |             Optional. The very first chunk of the message to authenticate. | ||||||
|  |             It is equivalent to an early call to :meth:`KMAC_Hash.update`. | ||||||
|  |         mac_len (integer): | ||||||
|  |             Optional. The size of the authentication tag, in bytes. | ||||||
|  |             Default is 64. Minimum is 8. | ||||||
|  |         custom (bytes/bytearray/memoryview): | ||||||
|  |             Optional. A customization byte string (``S`` in SP 800-185). | ||||||
|  | 
 | ||||||
|  |     Returns: | ||||||
|  |         A :class:`KMAC_Hash` hash object | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     key = kwargs.pop("key", None) | ||||||
|  |     if not is_bytes(key): | ||||||
|  |         raise TypeError("You must pass a key to KMAC256") | ||||||
|  |     if len(key) < 32: | ||||||
|  |         raise ValueError("The key must be at least 256 bits long (32 bytes)") | ||||||
|  | 
 | ||||||
|  |     data = kwargs.pop("data", None) | ||||||
|  | 
 | ||||||
|  |     mac_len = kwargs.pop("mac_len", 64) | ||||||
|  |     if mac_len < 8: | ||||||
|  |         raise ValueError("'mac_len' must be 8 bytes or more") | ||||||
|  | 
 | ||||||
|  |     custom = kwargs.pop("custom", b"") | ||||||
|  | 
 | ||||||
|  |     if kwargs: | ||||||
|  |         raise TypeError("Unknown parameters: " + str(kwargs)) | ||||||
|  | 
 | ||||||
|  |     return KMAC_Hash(data, key, mac_len, custom, "20", cSHAKE256, 136) | ||||||
							
								
								
									
										10
									
								
								resources/lib/deps/Cryptodome/Hash/KMAC256.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								resources/lib/deps/Cryptodome/Hash/KMAC256.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | from typing import Union | ||||||
|  | 
 | ||||||
|  | from .KMAC128 import KMAC_Hash | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | def new(key: Buffer, | ||||||
|  |         data: Buffer = ..., | ||||||
|  | 	    mac_len: int = ..., | ||||||
|  |         custom: Buffer = ...) -> KMAC_Hash: ... | ||||||
							
								
								
									
										222
									
								
								resources/lib/deps/Cryptodome/Hash/KangarooTwelve.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										222
									
								
								resources/lib/deps/Cryptodome/Hash/KangarooTwelve.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,222 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2021, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.number import long_to_bytes | ||||||
|  | from Cryptodome.Util.py3compat import bchr | ||||||
|  | 
 | ||||||
|  | from . import TurboSHAKE128 | ||||||
|  | 
 | ||||||
|  | def _length_encode(x): | ||||||
|  |     if x == 0: | ||||||
|  |         return b'\x00' | ||||||
|  | 
 | ||||||
|  |     S = long_to_bytes(x) | ||||||
|  |     return S + bchr(len(S)) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Possible states for a KangarooTwelve instance, which depend on the amount of data processed so far. | ||||||
|  | SHORT_MSG = 1       # Still within the first 8192 bytes, but it is not certain we will exceed them. | ||||||
|  | LONG_MSG_S0 = 2     # Still within the first 8192 bytes, and it is certain we will exceed them. | ||||||
|  | LONG_MSG_SX = 3     # Beyond the first 8192 bytes. | ||||||
|  | SQUEEZING = 4       # No more data to process. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class K12_XOF(object): | ||||||
|  |     """A KangarooTwelve hash object. | ||||||
|  |     Do not instantiate directly. | ||||||
|  |     Use the :func:`new` function. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     def __init__(self, data, custom): | ||||||
|  | 
 | ||||||
|  |         if custom == None: | ||||||
|  |             custom = b'' | ||||||
|  | 
 | ||||||
|  |         self._custom = custom + _length_encode(len(custom)) | ||||||
|  |         self._state = SHORT_MSG | ||||||
|  |         self._padding = None        # Final padding is only decided in read() | ||||||
|  | 
 | ||||||
|  |         # Internal hash that consumes FinalNode | ||||||
|  |         # The real domain separation byte will be known before squeezing | ||||||
|  |         self._hash1 = TurboSHAKE128.new(domain=1) | ||||||
|  |         self._length1 = 0 | ||||||
|  | 
 | ||||||
|  |         # Internal hash that produces CV_i (reset each time) | ||||||
|  |         self._hash2 = None | ||||||
|  |         self._length2 = 0 | ||||||
|  | 
 | ||||||
|  |         # Incremented by one for each 8192-byte block | ||||||
|  |         self._ctr = 0 | ||||||
|  | 
 | ||||||
|  |         if data: | ||||||
|  |             self.update(data) | ||||||
|  | 
 | ||||||
|  |     def update(self, data): | ||||||
|  |         """Hash the next piece of data. | ||||||
|  | 
 | ||||||
|  |         .. note:: | ||||||
|  |             For better performance, submit chunks with a length multiple of 8192 bytes. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |             data (byte string/byte array/memoryview): The next chunk of the | ||||||
|  |               message to hash. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if self._state == SQUEEZING: | ||||||
|  |             raise TypeError("You cannot call 'update' after the first 'read'") | ||||||
|  | 
 | ||||||
|  |         if self._state == SHORT_MSG: | ||||||
|  |             next_length = self._length1 + len(data) | ||||||
|  | 
 | ||||||
|  |             if next_length + len(self._custom) <= 8192: | ||||||
|  |                 self._length1 = next_length | ||||||
|  |                 self._hash1.update(data) | ||||||
|  |                 return self | ||||||
|  | 
 | ||||||
|  |             # Switch to tree hashing | ||||||
|  |             self._state = LONG_MSG_S0 | ||||||
|  | 
 | ||||||
|  |         if self._state == LONG_MSG_S0: | ||||||
|  |             data_mem = memoryview(data) | ||||||
|  |             assert(self._length1 < 8192) | ||||||
|  |             dtc = min(len(data), 8192 - self._length1) | ||||||
|  |             self._hash1.update(data_mem[:dtc]) | ||||||
|  |             self._length1 += dtc | ||||||
|  | 
 | ||||||
|  |             if self._length1 < 8192: | ||||||
|  |                 return self | ||||||
|  | 
 | ||||||
|  |             # Finish hashing S_0 and start S_1 | ||||||
|  |             assert(self._length1 == 8192) | ||||||
|  | 
 | ||||||
|  |             divider = b'\x03' + b'\x00' * 7 | ||||||
|  |             self._hash1.update(divider) | ||||||
|  |             self._length1 += 8 | ||||||
|  | 
 | ||||||
|  |             self._hash2 = TurboSHAKE128.new(domain=0x0B) | ||||||
|  |             self._length2 = 0 | ||||||
|  |             self._ctr = 1 | ||||||
|  | 
 | ||||||
|  |             self._state = LONG_MSG_SX | ||||||
|  |             return self.update(data_mem[dtc:]) | ||||||
|  | 
 | ||||||
|  |         # LONG_MSG_SX | ||||||
|  |         assert(self._state == LONG_MSG_SX) | ||||||
|  |         index = 0 | ||||||
|  |         len_data = len(data) | ||||||
|  | 
 | ||||||
|  |         # All iteractions could actually run in parallel | ||||||
|  |         data_mem = memoryview(data) | ||||||
|  |         while index < len_data: | ||||||
|  | 
 | ||||||
|  |             new_index = min(index + 8192 - self._length2, len_data) | ||||||
|  |             self._hash2.update(data_mem[index:new_index]) | ||||||
|  |             self._length2 += new_index - index | ||||||
|  |             index = new_index | ||||||
|  | 
 | ||||||
|  |             if self._length2 == 8192: | ||||||
|  |                 cv_i = self._hash2.read(32) | ||||||
|  |                 self._hash1.update(cv_i) | ||||||
|  |                 self._length1 += 32 | ||||||
|  |                 self._hash2._reset() | ||||||
|  |                 self._length2 = 0 | ||||||
|  |                 self._ctr += 1 | ||||||
|  | 
 | ||||||
|  |         return self | ||||||
|  | 
 | ||||||
|  |     def read(self, length): | ||||||
|  |         """ | ||||||
|  |         Produce more bytes of the digest. | ||||||
|  | 
 | ||||||
|  |         .. note:: | ||||||
|  |             You cannot use :meth:`update` anymore after the first call to | ||||||
|  |             :meth:`read`. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |             length (integer): the amount of bytes this method must return | ||||||
|  | 
 | ||||||
|  |         :return: the next piece of XOF output (of the given length) | ||||||
|  |         :rtype: byte string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         custom_was_consumed = False | ||||||
|  | 
 | ||||||
|  |         if self._state == SHORT_MSG: | ||||||
|  |             self._hash1.update(self._custom) | ||||||
|  |             self._padding = 0x07 | ||||||
|  |             self._state = SQUEEZING | ||||||
|  | 
 | ||||||
|  |         if self._state == LONG_MSG_S0: | ||||||
|  |             self.update(self._custom) | ||||||
|  |             custom_was_consumed = True | ||||||
|  |             assert(self._state == LONG_MSG_SX) | ||||||
|  | 
 | ||||||
|  |         if self._state == LONG_MSG_SX: | ||||||
|  |             if not custom_was_consumed: | ||||||
|  |                 self.update(self._custom) | ||||||
|  | 
 | ||||||
|  |             # Is there still some leftover data in hash2? | ||||||
|  |             if self._length2 > 0: | ||||||
|  |                 cv_i = self._hash2.read(32) | ||||||
|  |                 self._hash1.update(cv_i) | ||||||
|  |                 self._length1 += 32 | ||||||
|  |                 self._hash2._reset() | ||||||
|  |                 self._length2 = 0 | ||||||
|  |                 self._ctr += 1 | ||||||
|  | 
 | ||||||
|  |             trailer = _length_encode(self._ctr - 1) + b'\xFF\xFF' | ||||||
|  |             self._hash1.update(trailer) | ||||||
|  | 
 | ||||||
|  |             self._padding = 0x06 | ||||||
|  |             self._state = SQUEEZING | ||||||
|  | 
 | ||||||
|  |         self._hash1._domain = self._padding | ||||||
|  |         return self._hash1.read(length) | ||||||
|  | 
 | ||||||
|  |     def new(self, data=None, custom=b''): | ||||||
|  |         return type(self)(data, custom) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(data=None, custom=None): | ||||||
|  |     """Return a fresh instance of a KangarooTwelve object. | ||||||
|  | 
 | ||||||
|  |     Args: | ||||||
|  |        data (bytes/bytearray/memoryview): | ||||||
|  |         Optional. | ||||||
|  |         The very first chunk of the message to hash. | ||||||
|  |         It is equivalent to an early call to :meth:`update`. | ||||||
|  |        custom (bytes): | ||||||
|  |         Optional. | ||||||
|  |         A customization byte string. | ||||||
|  | 
 | ||||||
|  |     :Return: A :class:`K12_XOF` object | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     return K12_XOF(data, custom) | ||||||
							
								
								
									
										16
									
								
								resources/lib/deps/Cryptodome/Hash/KangarooTwelve.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								resources/lib/deps/Cryptodome/Hash/KangarooTwelve.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | ||||||
|  | from typing import Union, Optional | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | class K12_XOF(object): | ||||||
|  |     def __init__(self, | ||||||
|  |                  data:     Optional[Buffer] = ..., | ||||||
|  |                  custom:   Optional[bytes] = ...) -> None: ... | ||||||
|  |     def update(self, data: Buffer) -> K12_XOF: ... | ||||||
|  |     def read(self, length: int) -> bytes: ... | ||||||
|  |     def new(self, | ||||||
|  |                  data:     Optional[Buffer] = ..., | ||||||
|  |                  custom:   Optional[bytes] = ...) -> None: ... | ||||||
|  | 
 | ||||||
|  | def new(data:     Optional[Buffer] = ..., | ||||||
|  |         custom:   Optional[Buffer] = ...) -> K12_XOF: ... | ||||||
							
								
								
									
										166
									
								
								resources/lib/deps/Cryptodome/Hash/MD2.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								resources/lib/deps/Cryptodome/Hash/MD2.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,166 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2014, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import bord | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   VoidPointer, SmartPointer, | ||||||
|  |                                   create_string_buffer, | ||||||
|  |                                   get_raw_buffer, c_size_t, | ||||||
|  |                                   c_uint8_ptr) | ||||||
|  | 
 | ||||||
|  | _raw_md2_lib = load_pycryptodome_raw_lib( | ||||||
|  |                         "Cryptodome.Hash._MD2", | ||||||
|  |                         """ | ||||||
|  |                         int md2_init(void **shaState); | ||||||
|  |                         int md2_destroy(void *shaState); | ||||||
|  |                         int md2_update(void *hs, | ||||||
|  |                                           const uint8_t *buf, | ||||||
|  |                                           size_t len); | ||||||
|  |                         int md2_digest(const void *shaState, | ||||||
|  |                                           uint8_t digest[20]); | ||||||
|  |                         int md2_copy(const void *src, void *dst); | ||||||
|  |                         """) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class MD2Hash(object): | ||||||
|  |     """An MD2 hash object. | ||||||
|  |     Do not instantiate directly. Use the :func:`new` function. | ||||||
|  | 
 | ||||||
|  |     :ivar oid: ASN.1 Object ID | ||||||
|  |     :vartype oid: string | ||||||
|  | 
 | ||||||
|  |     :ivar block_size: the size in bytes of the internal message block, | ||||||
|  |                       input to the compression function | ||||||
|  |     :vartype block_size: integer | ||||||
|  | 
 | ||||||
|  |     :ivar digest_size: the size in bytes of the resulting hash | ||||||
|  |     :vartype digest_size: integer | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     # The size of the resulting hash in bytes. | ||||||
|  |     digest_size = 16 | ||||||
|  |     # The internal block size of the hash algorithm in bytes. | ||||||
|  |     block_size = 16 | ||||||
|  |     # ASN.1 Object ID | ||||||
|  |     oid = "1.2.840.113549.2.2" | ||||||
|  | 
 | ||||||
|  |     def __init__(self, data=None): | ||||||
|  |         state = VoidPointer() | ||||||
|  |         result = _raw_md2_lib.md2_init(state.address_of()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating MD2" | ||||||
|  |                              % result) | ||||||
|  |         self._state = SmartPointer(state.get(), | ||||||
|  |                                    _raw_md2_lib.md2_destroy) | ||||||
|  |         if data: | ||||||
|  |             self.update(data) | ||||||
|  | 
 | ||||||
|  |     def update(self, data): | ||||||
|  |         """Continue hashing of a message by consuming the next chunk of data. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |             data (byte string/byte array/memoryview): The next chunk of the message being hashed. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         result = _raw_md2_lib.md2_update(self._state.get(), | ||||||
|  |                                          c_uint8_ptr(data), | ||||||
|  |                                          c_size_t(len(data))) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating MD2" | ||||||
|  |                              % result) | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         """Return the **binary** (non-printable) digest of the message that has been hashed so far. | ||||||
|  | 
 | ||||||
|  |         :return: The hash digest, computed over the data processed so far. | ||||||
|  |                  Binary form. | ||||||
|  |         :rtype: byte string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         bfr = create_string_buffer(self.digest_size) | ||||||
|  |         result = _raw_md2_lib.md2_digest(self._state.get(), | ||||||
|  |                                          bfr) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating MD2" | ||||||
|  |                              % result) | ||||||
|  | 
 | ||||||
|  |         return get_raw_buffer(bfr) | ||||||
|  | 
 | ||||||
|  |     def hexdigest(self): | ||||||
|  |         """Return the **printable** digest of the message that has been hashed so far. | ||||||
|  | 
 | ||||||
|  |         :return: The hash digest, computed over the data processed so far. | ||||||
|  |                  Hexadecimal encoded. | ||||||
|  |         :rtype: string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         return "".join(["%02x" % bord(x) for x in self.digest()]) | ||||||
|  | 
 | ||||||
|  |     def copy(self): | ||||||
|  |         """Return a copy ("clone") of the hash object. | ||||||
|  | 
 | ||||||
|  |         The copy will have the same internal state as the original hash | ||||||
|  |         object. | ||||||
|  |         This can be used to efficiently compute the digests of strings that | ||||||
|  |         share a common initial substring. | ||||||
|  | 
 | ||||||
|  |         :return: A hash object of the same type | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         clone = MD2Hash() | ||||||
|  |         result = _raw_md2_lib.md2_copy(self._state.get(), | ||||||
|  |                                        clone._state.get()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while copying MD2" % result) | ||||||
|  |         return clone | ||||||
|  | 
 | ||||||
|  |     def new(self, data=None): | ||||||
|  |         return MD2Hash(data) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(data=None): | ||||||
|  |     """Create a new hash object. | ||||||
|  | 
 | ||||||
|  |     :parameter data: | ||||||
|  |         Optional. The very first chunk of the message to hash. | ||||||
|  |         It is equivalent to an early call to :meth:`MD2Hash.update`. | ||||||
|  |     :type data: bytes/bytearray/memoryview | ||||||
|  | 
 | ||||||
|  |     :Return: A :class:`MD2Hash` hash object | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     return MD2Hash().new(data) | ||||||
|  | 
 | ||||||
|  | # The size of the resulting hash in bytes. | ||||||
|  | digest_size = MD2Hash.digest_size | ||||||
|  | 
 | ||||||
|  | # The internal block size of the hash algorithm in bytes. | ||||||
|  | block_size = MD2Hash.block_size | ||||||
							
								
								
									
										19
									
								
								resources/lib/deps/Cryptodome/Hash/MD2.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								resources/lib/deps/Cryptodome/Hash/MD2.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | ||||||
|  | from typing import Union | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | class MD4Hash(object): | ||||||
|  |     digest_size: int | ||||||
|  |     block_size: int | ||||||
|  |     oid: str | ||||||
|  | 
 | ||||||
|  |     def __init__(self, data: Buffer = ...) -> None: ... | ||||||
|  |     def update(self, data: Buffer) -> None: ... | ||||||
|  |     def digest(self) -> bytes: ... | ||||||
|  |     def hexdigest(self) -> str: ... | ||||||
|  |     def copy(self) -> MD4Hash: ... | ||||||
|  |     def new(self, data: Buffer = ...) -> MD4Hash: ... | ||||||
|  | 
 | ||||||
|  | def new(data: Buffer = ...) -> MD4Hash: ... | ||||||
|  | digest_size: int | ||||||
|  | block_size: int | ||||||
							
								
								
									
										185
									
								
								resources/lib/deps/Cryptodome/Hash/MD4.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										185
									
								
								resources/lib/deps/Cryptodome/Hash/MD4.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,185 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2014, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | MD4 is specified in RFC1320_ and produces the 128 bit digest of a message. | ||||||
|  | 
 | ||||||
|  |     >>> from Cryptodome.Hash import MD4 | ||||||
|  |     >>> | ||||||
|  |     >>> h = MD4.new() | ||||||
|  |     >>> h.update(b'Hello') | ||||||
|  |     >>> print h.hexdigest() | ||||||
|  | 
 | ||||||
|  | MD4 stand for Message Digest version 4, and it was invented by Rivest in 1990. | ||||||
|  | This algorithm is insecure. Do not use it for new designs. | ||||||
|  | 
 | ||||||
|  | .. _RFC1320: http://tools.ietf.org/html/rfc1320 | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import bord | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   VoidPointer, SmartPointer, | ||||||
|  |                                   create_string_buffer, | ||||||
|  |                                   get_raw_buffer, c_size_t, | ||||||
|  |                                   c_uint8_ptr) | ||||||
|  | 
 | ||||||
|  | _raw_md4_lib = load_pycryptodome_raw_lib( | ||||||
|  |                         "Cryptodome.Hash._MD4", | ||||||
|  |                         """ | ||||||
|  |                         int md4_init(void **shaState); | ||||||
|  |                         int md4_destroy(void *shaState); | ||||||
|  |                         int md4_update(void *hs, | ||||||
|  |                                           const uint8_t *buf, | ||||||
|  |                                           size_t len); | ||||||
|  |                         int md4_digest(const void *shaState, | ||||||
|  |                                           uint8_t digest[20]); | ||||||
|  |                         int md4_copy(const void *src, void *dst); | ||||||
|  |                         """) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class MD4Hash(object): | ||||||
|  |     """Class that implements an MD4 hash | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     #: The size of the resulting hash in bytes. | ||||||
|  |     digest_size = 16 | ||||||
|  |     #: The internal block size of the hash algorithm in bytes. | ||||||
|  |     block_size = 64 | ||||||
|  |     #: ASN.1 Object ID | ||||||
|  |     oid = "1.2.840.113549.2.4" | ||||||
|  | 
 | ||||||
|  |     def __init__(self, data=None): | ||||||
|  |         state = VoidPointer() | ||||||
|  |         result = _raw_md4_lib.md4_init(state.address_of()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating MD4" | ||||||
|  |                              % result) | ||||||
|  |         self._state = SmartPointer(state.get(), | ||||||
|  |                                    _raw_md4_lib.md4_destroy) | ||||||
|  |         if data: | ||||||
|  |             self.update(data) | ||||||
|  | 
 | ||||||
|  |     def update(self, data): | ||||||
|  |         """Continue hashing of a message by consuming the next chunk of data. | ||||||
|  | 
 | ||||||
|  |         Repeated calls are equivalent to a single call with the concatenation | ||||||
|  |         of all the arguments. In other words: | ||||||
|  | 
 | ||||||
|  |            >>> m.update(a); m.update(b) | ||||||
|  | 
 | ||||||
|  |         is equivalent to: | ||||||
|  | 
 | ||||||
|  |            >>> m.update(a+b) | ||||||
|  | 
 | ||||||
|  |         :Parameters: | ||||||
|  |           data : byte string/byte array/memoryview | ||||||
|  |             The next chunk of the message being hashed. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         result = _raw_md4_lib.md4_update(self._state.get(), | ||||||
|  |                                          c_uint8_ptr(data), | ||||||
|  |                                          c_size_t(len(data))) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating MD4" | ||||||
|  |                              % result) | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         """Return the **binary** (non-printable) digest of the message that | ||||||
|  |         has been hashed so far. | ||||||
|  | 
 | ||||||
|  |         This method does not change the state of the hash object. | ||||||
|  |         You can continue updating the object after calling this function. | ||||||
|  | 
 | ||||||
|  |         :Return: A byte string of `digest_size` bytes. It may contain non-ASCII | ||||||
|  |          characters, including null bytes. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         bfr = create_string_buffer(self.digest_size) | ||||||
|  |         result = _raw_md4_lib.md4_digest(self._state.get(), | ||||||
|  |                                          bfr) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating MD4" | ||||||
|  |                              % result) | ||||||
|  | 
 | ||||||
|  |         return get_raw_buffer(bfr) | ||||||
|  | 
 | ||||||
|  |     def hexdigest(self): | ||||||
|  |         """Return the **printable** digest of the message that has been | ||||||
|  |         hashed so far. | ||||||
|  | 
 | ||||||
|  |         This method does not change the state of the hash object. | ||||||
|  | 
 | ||||||
|  |         :Return: A string of 2* `digest_size` characters. It contains only | ||||||
|  |          hexadecimal ASCII digits. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         return "".join(["%02x" % bord(x) for x in self.digest()]) | ||||||
|  | 
 | ||||||
|  |     def copy(self): | ||||||
|  |         """Return a copy ("clone") of the hash object. | ||||||
|  | 
 | ||||||
|  |         The copy will have the same internal state as the original hash | ||||||
|  |         object. | ||||||
|  |         This can be used to efficiently compute the digests of strings that | ||||||
|  |         share a common initial substring. | ||||||
|  | 
 | ||||||
|  |         :Return: A hash object of the same type | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         clone = MD4Hash() | ||||||
|  |         result = _raw_md4_lib.md4_copy(self._state.get(), | ||||||
|  |                                        clone._state.get()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while copying MD4" % result) | ||||||
|  |         return clone | ||||||
|  | 
 | ||||||
|  |     def new(self, data=None): | ||||||
|  |         return MD4Hash(data) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(data=None): | ||||||
|  |     """Return a fresh instance of the hash object. | ||||||
|  | 
 | ||||||
|  |     :Parameters: | ||||||
|  |        data : byte string/byte array/memoryview | ||||||
|  |         The very first chunk of the message to hash. | ||||||
|  |         It is equivalent to an early call to `MD4Hash.update()`. | ||||||
|  |         Optional. | ||||||
|  | 
 | ||||||
|  |     :Return: A `MD4Hash` object | ||||||
|  |     """ | ||||||
|  |     return MD4Hash().new(data) | ||||||
|  | 
 | ||||||
|  | #: The size of the resulting hash in bytes. | ||||||
|  | digest_size = MD4Hash.digest_size | ||||||
|  | 
 | ||||||
|  | #: The internal block size of the hash algorithm in bytes. | ||||||
|  | block_size = MD4Hash.block_size | ||||||
							
								
								
									
										19
									
								
								resources/lib/deps/Cryptodome/Hash/MD4.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								resources/lib/deps/Cryptodome/Hash/MD4.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | ||||||
|  | from typing import Union, Optional | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | class MD4Hash(object): | ||||||
|  |     digest_size: int | ||||||
|  |     block_size: int | ||||||
|  |     oid: str | ||||||
|  | 
 | ||||||
|  |     def __init__(self, data: Optional[Buffer] = ...) -> None: ... | ||||||
|  |     def update(self, data: Buffer) -> None: ... | ||||||
|  |     def digest(self) -> bytes: ... | ||||||
|  |     def hexdigest(self) -> str: ... | ||||||
|  |     def copy(self) -> MD4Hash: ... | ||||||
|  |     def new(self, data: Optional[Buffer] = ...) -> MD4Hash: ... | ||||||
|  | 
 | ||||||
|  | def new(data: Optional[Buffer] = ...) -> MD4Hash: ... | ||||||
|  | digest_size: int | ||||||
|  | block_size: int | ||||||
							
								
								
									
										184
									
								
								resources/lib/deps/Cryptodome/Hash/MD5.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								resources/lib/deps/Cryptodome/Hash/MD5.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,184 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import * | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   VoidPointer, SmartPointer, | ||||||
|  |                                   create_string_buffer, | ||||||
|  |                                   get_raw_buffer, c_size_t, | ||||||
|  |                                   c_uint8_ptr) | ||||||
|  | 
 | ||||||
|  | _raw_md5_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._MD5", | ||||||
|  |                         """ | ||||||
|  |                         #define MD5_DIGEST_SIZE 16 | ||||||
|  | 
 | ||||||
|  |                         int MD5_init(void **shaState); | ||||||
|  |                         int MD5_destroy(void *shaState); | ||||||
|  |                         int MD5_update(void *hs, | ||||||
|  |                                           const uint8_t *buf, | ||||||
|  |                                           size_t len); | ||||||
|  |                         int MD5_digest(const void *shaState, | ||||||
|  |                                           uint8_t digest[MD5_DIGEST_SIZE]); | ||||||
|  |                         int MD5_copy(const void *src, void *dst); | ||||||
|  | 
 | ||||||
|  |                         int MD5_pbkdf2_hmac_assist(const void *inner, | ||||||
|  |                                             const void *outer, | ||||||
|  |                                             const uint8_t first_digest[MD5_DIGEST_SIZE], | ||||||
|  |                                             uint8_t final_digest[MD5_DIGEST_SIZE], | ||||||
|  |                                             size_t iterations); | ||||||
|  |                         """) | ||||||
|  | 
 | ||||||
|  | class MD5Hash(object): | ||||||
|  |     """A MD5 hash object. | ||||||
|  |     Do not instantiate directly. | ||||||
|  |     Use the :func:`new` function. | ||||||
|  | 
 | ||||||
|  |     :ivar oid: ASN.1 Object ID | ||||||
|  |     :vartype oid: string | ||||||
|  | 
 | ||||||
|  |     :ivar block_size: the size in bytes of the internal message block, | ||||||
|  |                       input to the compression function | ||||||
|  |     :vartype block_size: integer | ||||||
|  | 
 | ||||||
|  |     :ivar digest_size: the size in bytes of the resulting hash | ||||||
|  |     :vartype digest_size: integer | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     # The size of the resulting hash in bytes. | ||||||
|  |     digest_size = 16 | ||||||
|  |     # The internal block size of the hash algorithm in bytes. | ||||||
|  |     block_size = 64 | ||||||
|  |     # ASN.1 Object ID | ||||||
|  |     oid = "1.2.840.113549.2.5" | ||||||
|  | 
 | ||||||
|  |     def __init__(self, data=None): | ||||||
|  |         state = VoidPointer() | ||||||
|  |         result = _raw_md5_lib.MD5_init(state.address_of()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating MD5" | ||||||
|  |                              % result) | ||||||
|  |         self._state = SmartPointer(state.get(), | ||||||
|  |                                    _raw_md5_lib.MD5_destroy) | ||||||
|  |         if data: | ||||||
|  |             self.update(data) | ||||||
|  | 
 | ||||||
|  |     def update(self, data): | ||||||
|  |         """Continue hashing of a message by consuming the next chunk of data. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |             data (byte string/byte array/memoryview): The next chunk of the message being hashed. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         result = _raw_md5_lib.MD5_update(self._state.get(), | ||||||
|  |                                          c_uint8_ptr(data), | ||||||
|  |                                          c_size_t(len(data))) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating MD5" | ||||||
|  |                              % result) | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         """Return the **binary** (non-printable) digest of the message that has been hashed so far. | ||||||
|  | 
 | ||||||
|  |         :return: The hash digest, computed over the data processed so far. | ||||||
|  |                  Binary form. | ||||||
|  |         :rtype: byte string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         bfr = create_string_buffer(self.digest_size) | ||||||
|  |         result = _raw_md5_lib.MD5_digest(self._state.get(), | ||||||
|  |                                            bfr) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating MD5" | ||||||
|  |                              % result) | ||||||
|  | 
 | ||||||
|  |         return get_raw_buffer(bfr) | ||||||
|  | 
 | ||||||
|  |     def hexdigest(self): | ||||||
|  |         """Return the **printable** digest of the message that has been hashed so far. | ||||||
|  | 
 | ||||||
|  |         :return: The hash digest, computed over the data processed so far. | ||||||
|  |                  Hexadecimal encoded. | ||||||
|  |         :rtype: string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         return "".join(["%02x" % bord(x) for x in self.digest()]) | ||||||
|  | 
 | ||||||
|  |     def copy(self): | ||||||
|  |         """Return a copy ("clone") of the hash object. | ||||||
|  | 
 | ||||||
|  |         The copy will have the same internal state as the original hash | ||||||
|  |         object. | ||||||
|  |         This can be used to efficiently compute the digests of strings that | ||||||
|  |         share a common initial substring. | ||||||
|  | 
 | ||||||
|  |         :return: A hash object of the same type | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         clone = MD5Hash() | ||||||
|  |         result = _raw_md5_lib.MD5_copy(self._state.get(), | ||||||
|  |                                          clone._state.get()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while copying MD5" % result) | ||||||
|  |         return clone | ||||||
|  | 
 | ||||||
|  |     def new(self, data=None): | ||||||
|  |         """Create a fresh SHA-1 hash object.""" | ||||||
|  | 
 | ||||||
|  |         return MD5Hash(data) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(data=None): | ||||||
|  |     """Create a new hash object. | ||||||
|  | 
 | ||||||
|  |     :parameter data: | ||||||
|  |         Optional. The very first chunk of the message to hash. | ||||||
|  |         It is equivalent to an early call to :meth:`MD5Hash.update`. | ||||||
|  |     :type data: byte string/byte array/memoryview | ||||||
|  | 
 | ||||||
|  |     :Return: A :class:`MD5Hash` hash object | ||||||
|  |     """ | ||||||
|  |     return MD5Hash().new(data) | ||||||
|  | 
 | ||||||
|  | # The size of the resulting hash in bytes. | ||||||
|  | digest_size = 16 | ||||||
|  | 
 | ||||||
|  | # The internal block size of the hash algorithm in bytes. | ||||||
|  | block_size = 64 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _pbkdf2_hmac_assist(inner, outer, first_digest, iterations): | ||||||
|  |     """Compute the expensive inner loop in PBKDF-HMAC.""" | ||||||
|  | 
 | ||||||
|  |     assert len(first_digest) == digest_size | ||||||
|  |     assert iterations > 0 | ||||||
|  | 
 | ||||||
|  |     bfr = create_string_buffer(digest_size); | ||||||
|  |     result = _raw_md5_lib.MD5_pbkdf2_hmac_assist( | ||||||
|  |                     inner._state.get(), | ||||||
|  |                     outer._state.get(), | ||||||
|  |                     first_digest, | ||||||
|  |                     bfr, | ||||||
|  |                     c_size_t(iterations)) | ||||||
|  | 
 | ||||||
|  |     if result: | ||||||
|  |         raise ValueError("Error %d with PBKDF2-HMAC assis for MD5" % result) | ||||||
|  | 
 | ||||||
|  |     return get_raw_buffer(bfr) | ||||||
							
								
								
									
										19
									
								
								resources/lib/deps/Cryptodome/Hash/MD5.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								resources/lib/deps/Cryptodome/Hash/MD5.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | ||||||
|  | from typing import Union | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | class MD5Hash(object): | ||||||
|  |     digest_size: int | ||||||
|  |     block_size: int | ||||||
|  |     oid: str | ||||||
|  | 
 | ||||||
|  |     def __init__(self, data: Buffer = ...) -> None: ... | ||||||
|  |     def update(self, data: Buffer) -> None: ... | ||||||
|  |     def digest(self) -> bytes: ... | ||||||
|  |     def hexdigest(self) -> str: ... | ||||||
|  |     def copy(self) -> MD5Hash: ... | ||||||
|  |     def new(self, data: Buffer = ...) -> MD5Hash: ... | ||||||
|  | 
 | ||||||
|  | def new(data: Buffer = ...) -> MD5Hash: ... | ||||||
|  | digest_size: int | ||||||
|  | block_size: int | ||||||
							
								
								
									
										217
									
								
								resources/lib/deps/Cryptodome/Hash/Poly1305.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								resources/lib/deps/Cryptodome/Hash/Poly1305.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,217 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | # Hash/Poly1305.py - Implements the Poly1305 MAC | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | from binascii import unhexlify | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import bord, tobytes, _copy_bytes | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Hash import BLAKE2s | ||||||
|  | from Cryptodome.Random import get_random_bytes | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   VoidPointer, SmartPointer, | ||||||
|  |                                   create_string_buffer, | ||||||
|  |                                   get_raw_buffer, c_size_t, | ||||||
|  |                                   c_uint8_ptr) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | _raw_poly1305 = load_pycryptodome_raw_lib("Cryptodome.Hash._poly1305", | ||||||
|  |                         """ | ||||||
|  |                         int poly1305_init(void **state, | ||||||
|  |                                           const uint8_t *r, | ||||||
|  |                                           size_t r_len, | ||||||
|  |                                           const uint8_t *s, | ||||||
|  |                                           size_t s_len); | ||||||
|  |                         int poly1305_destroy(void *state); | ||||||
|  |                         int poly1305_update(void *state, | ||||||
|  |                                             const uint8_t *in, | ||||||
|  |                                             size_t len); | ||||||
|  |                         int poly1305_digest(const void *state, | ||||||
|  |                                             uint8_t *digest, | ||||||
|  |                                             size_t len); | ||||||
|  |                         """) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Poly1305_MAC(object): | ||||||
|  |     """An Poly1305 MAC object. | ||||||
|  |     Do not instantiate directly. Use the :func:`new` function. | ||||||
|  | 
 | ||||||
|  |     :ivar digest_size: the size in bytes of the resulting MAC tag | ||||||
|  |     :vartype digest_size: integer | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     digest_size = 16 | ||||||
|  | 
 | ||||||
|  |     def __init__(self, r, s, data): | ||||||
|  | 
 | ||||||
|  |         if len(r) != 16: | ||||||
|  |             raise ValueError("Parameter r is not 16 bytes long") | ||||||
|  |         if len(s) != 16: | ||||||
|  |             raise ValueError("Parameter s is not 16 bytes long") | ||||||
|  | 
 | ||||||
|  |         self._mac_tag = None | ||||||
|  | 
 | ||||||
|  |         state = VoidPointer() | ||||||
|  |         result = _raw_poly1305.poly1305_init(state.address_of(), | ||||||
|  |                                              c_uint8_ptr(r), | ||||||
|  |                                              c_size_t(len(r)), | ||||||
|  |                                              c_uint8_ptr(s), | ||||||
|  |                                              c_size_t(len(s)) | ||||||
|  |                                              ) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating Poly1305" % result) | ||||||
|  |         self._state = SmartPointer(state.get(), | ||||||
|  |                                    _raw_poly1305.poly1305_destroy) | ||||||
|  |         if data: | ||||||
|  |             self.update(data) | ||||||
|  | 
 | ||||||
|  |     def update(self, data): | ||||||
|  |         """Authenticate the next chunk of message. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |             data (byte string/byte array/memoryview): The next chunk of data | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if self._mac_tag: | ||||||
|  |             raise TypeError("You can only call 'digest' or 'hexdigest' on this object") | ||||||
|  | 
 | ||||||
|  |         result = _raw_poly1305.poly1305_update(self._state.get(), | ||||||
|  |                                                c_uint8_ptr(data), | ||||||
|  |                                                c_size_t(len(data))) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while hashing Poly1305 data" % result) | ||||||
|  |         return self | ||||||
|  | 
 | ||||||
|  |     def copy(self): | ||||||
|  |         raise NotImplementedError() | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         """Return the **binary** (non-printable) MAC tag of the message | ||||||
|  |         authenticated so far. | ||||||
|  | 
 | ||||||
|  |         :return: The MAC tag digest, computed over the data processed so far. | ||||||
|  |                  Binary form. | ||||||
|  |         :rtype: byte string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         if self._mac_tag: | ||||||
|  |             return self._mac_tag | ||||||
|  |          | ||||||
|  |         bfr = create_string_buffer(16) | ||||||
|  |         result = _raw_poly1305.poly1305_digest(self._state.get(), | ||||||
|  |                                                bfr, | ||||||
|  |                                                c_size_t(len(bfr))) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while creating Poly1305 digest" % result) | ||||||
|  | 
 | ||||||
|  |         self._mac_tag = get_raw_buffer(bfr) | ||||||
|  |         return self._mac_tag | ||||||
|  | 
 | ||||||
|  |     def hexdigest(self): | ||||||
|  |         """Return the **printable** MAC tag of the message authenticated so far. | ||||||
|  | 
 | ||||||
|  |         :return: The MAC tag, computed over the data processed so far. | ||||||
|  |                  Hexadecimal encoded. | ||||||
|  |         :rtype: string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         return "".join(["%02x" % bord(x) | ||||||
|  |                         for x in tuple(self.digest())]) | ||||||
|  | 
 | ||||||
|  |     def verify(self, mac_tag): | ||||||
|  |         """Verify that a given **binary** MAC (computed by another party) | ||||||
|  |         is valid. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |           mac_tag (byte string/byte string/memoryview): the expected MAC of the message. | ||||||
|  | 
 | ||||||
|  |         Raises: | ||||||
|  |             ValueError: if the MAC does not match. It means that the message | ||||||
|  |                 has been tampered with or that the MAC key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         secret = get_random_bytes(16) | ||||||
|  | 
 | ||||||
|  |         mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=mac_tag) | ||||||
|  |         mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=self.digest()) | ||||||
|  | 
 | ||||||
|  |         if mac1.digest() != mac2.digest(): | ||||||
|  |             raise ValueError("MAC check failed") | ||||||
|  | 
 | ||||||
|  |     def hexverify(self, hex_mac_tag): | ||||||
|  |         """Verify that a given **printable** MAC (computed by another party) | ||||||
|  |         is valid. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |             hex_mac_tag (string): the expected MAC of the message, | ||||||
|  |                 as a hexadecimal string. | ||||||
|  | 
 | ||||||
|  |         Raises: | ||||||
|  |             ValueError: if the MAC does not match. It means that the message | ||||||
|  |                 has been tampered with or that the MAC key is incorrect. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self.verify(unhexlify(tobytes(hex_mac_tag))) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(**kwargs): | ||||||
|  |     """Create a new Poly1305 MAC object. | ||||||
|  | 
 | ||||||
|  |     Args: | ||||||
|  |         key (bytes/bytearray/memoryview): | ||||||
|  |             The 32-byte key for the Poly1305 object. | ||||||
|  |         cipher (module from ``Cryptodome.Cipher``): | ||||||
|  |             The cipher algorithm to use for deriving the Poly1305 | ||||||
|  |             key pair *(r, s)*. | ||||||
|  |             It can only be ``Cryptodome.Cipher.AES`` or ``Cryptodome.Cipher.ChaCha20``. | ||||||
|  |         nonce (bytes/bytearray/memoryview): | ||||||
|  |             Optional. The non-repeatable value to use for the MAC of this message. | ||||||
|  |             It must be 16 bytes long for ``AES`` and 8 or 12 bytes for ``ChaCha20``. | ||||||
|  |             If not passed, a random nonce is created; you will find it in the | ||||||
|  |             ``nonce`` attribute of the new object. | ||||||
|  |         data (bytes/bytearray/memoryview): | ||||||
|  |             Optional. The very first chunk of the message to authenticate. | ||||||
|  |             It is equivalent to an early call to ``update()``. | ||||||
|  | 
 | ||||||
|  |     Returns: | ||||||
|  |         A :class:`Poly1305_MAC` object | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     cipher = kwargs.pop("cipher", None) | ||||||
|  |     if not hasattr(cipher, '_derive_Poly1305_key_pair'): | ||||||
|  |         raise ValueError("Parameter 'cipher' must be AES or ChaCha20") | ||||||
|  | 
 | ||||||
|  |     cipher_key = kwargs.pop("key", None) | ||||||
|  |     if cipher_key is None: | ||||||
|  |         raise TypeError("You must pass a parameter 'key'") | ||||||
|  | 
 | ||||||
|  |     nonce = kwargs.pop("nonce", None) | ||||||
|  |     data = kwargs.pop("data", None) | ||||||
|  |      | ||||||
|  |     if kwargs: | ||||||
|  |         raise TypeError("Unknown parameters: " + str(kwargs)) | ||||||
|  | 
 | ||||||
|  |     r, s, nonce = cipher._derive_Poly1305_key_pair(cipher_key, nonce) | ||||||
|  |      | ||||||
|  |     new_mac = Poly1305_MAC(r, s, data) | ||||||
|  |     new_mac.nonce = _copy_bytes(None, None, nonce)  # nonce may still be just a memoryview | ||||||
|  |     return new_mac | ||||||
							
								
								
									
										24
									
								
								resources/lib/deps/Cryptodome/Hash/Poly1305.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								resources/lib/deps/Cryptodome/Hash/Poly1305.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | ||||||
|  | from types import ModuleType | ||||||
|  | from typing import Union | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | class Poly1305_MAC(object): | ||||||
|  |     block_size: int | ||||||
|  |     digest_size: int | ||||||
|  |     oid: str | ||||||
|  | 
 | ||||||
|  |     def __init__(self, | ||||||
|  |                  r : int, | ||||||
|  |                  s : int, | ||||||
|  |                  data : Buffer) -> None: ... | ||||||
|  |     def update(self, data: Buffer) -> Poly1305_MAC: ... | ||||||
|  |     def digest(self) -> bytes: ... | ||||||
|  |     def hexdigest(self) -> str: ... | ||||||
|  |     def verify(self, mac_tag: Buffer) -> None: ... | ||||||
|  |     def hexverify(self, hex_mac_tag: str) -> None: ... | ||||||
|  | 
 | ||||||
|  | def new(key: Buffer, | ||||||
|  |         cipher: ModuleType, | ||||||
|  |         nonce: Buffer = ..., | ||||||
|  |         data: Buffer = ...) -> Poly1305_MAC: ... | ||||||
							
								
								
									
										26
									
								
								resources/lib/deps/Cryptodome/Hash/RIPEMD.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								resources/lib/deps/Cryptodome/Hash/RIPEMD.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | # This file exists for backward compatibility with old code that refers to | ||||||
|  | # Cryptodome.Hash.RIPEMD | ||||||
|  | 
 | ||||||
|  | """Deprecated alias for `Cryptodome.Hash.RIPEMD160`""" | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Hash.RIPEMD160 import new, block_size, digest_size | ||||||
							
								
								
									
										3
									
								
								resources/lib/deps/Cryptodome/Hash/RIPEMD.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								resources/lib/deps/Cryptodome/Hash/RIPEMD.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | ||||||
|  | # This file exists for backward compatibility with old code that refers to | ||||||
|  | # Cryptodome.Hash.SHA | ||||||
|  | 
 | ||||||
							
								
								
									
										169
									
								
								resources/lib/deps/Cryptodome/Hash/RIPEMD160.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								resources/lib/deps/Cryptodome/Hash/RIPEMD160.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,169 @@ | ||||||
|  | # =================================================================== | ||||||
|  | # | ||||||
|  | # Copyright (c) 2014, Legrandin <helderijs@gmail.com> | ||||||
|  | # All rights reserved. | ||||||
|  | # | ||||||
|  | # Redistribution and use in source and binary forms, with or without | ||||||
|  | # modification, are permitted provided that the following conditions | ||||||
|  | # are met: | ||||||
|  | # | ||||||
|  | # 1. Redistributions of source code must retain the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer. | ||||||
|  | # 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | #    notice, this list of conditions and the following disclaimer in | ||||||
|  | #    the documentation and/or other materials provided with the | ||||||
|  | #    distribution. | ||||||
|  | # | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||||
|  | # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||||
|  | # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||||
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||||
|  | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||||
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||||
|  | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | # POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import bord | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   VoidPointer, SmartPointer, | ||||||
|  |                                   create_string_buffer, | ||||||
|  |                                   get_raw_buffer, c_size_t, | ||||||
|  |                                   c_uint8_ptr) | ||||||
|  | 
 | ||||||
|  | _raw_ripemd160_lib = load_pycryptodome_raw_lib( | ||||||
|  |                         "Cryptodome.Hash._RIPEMD160", | ||||||
|  |                         """ | ||||||
|  |                         int ripemd160_init(void **shaState); | ||||||
|  |                         int ripemd160_destroy(void *shaState); | ||||||
|  |                         int ripemd160_update(void *hs, | ||||||
|  |                                           const uint8_t *buf, | ||||||
|  |                                           size_t len); | ||||||
|  |                         int ripemd160_digest(const void *shaState, | ||||||
|  |                                           uint8_t digest[20]); | ||||||
|  |                         int ripemd160_copy(const void *src, void *dst); | ||||||
|  |                         """) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class RIPEMD160Hash(object): | ||||||
|  |     """A RIPEMD-160 hash object. | ||||||
|  |     Do not instantiate directly. | ||||||
|  |     Use the :func:`new` function. | ||||||
|  | 
 | ||||||
|  |     :ivar oid: ASN.1 Object ID | ||||||
|  |     :vartype oid: string | ||||||
|  | 
 | ||||||
|  |     :ivar block_size: the size in bytes of the internal message block, | ||||||
|  |                       input to the compression function | ||||||
|  |     :vartype block_size: integer | ||||||
|  | 
 | ||||||
|  |     :ivar digest_size: the size in bytes of the resulting hash | ||||||
|  |     :vartype digest_size: integer | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     # The size of the resulting hash in bytes. | ||||||
|  |     digest_size = 20 | ||||||
|  |     # The internal block size of the hash algorithm in bytes. | ||||||
|  |     block_size = 64 | ||||||
|  |     # ASN.1 Object ID | ||||||
|  |     oid = "1.3.36.3.2.1" | ||||||
|  | 
 | ||||||
|  |     def __init__(self, data=None): | ||||||
|  |         state = VoidPointer() | ||||||
|  |         result = _raw_ripemd160_lib.ripemd160_init(state.address_of()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating RIPEMD160" | ||||||
|  |                              % result) | ||||||
|  |         self._state = SmartPointer(state.get(), | ||||||
|  |                                    _raw_ripemd160_lib.ripemd160_destroy) | ||||||
|  |         if data: | ||||||
|  |             self.update(data) | ||||||
|  | 
 | ||||||
|  |     def update(self, data): | ||||||
|  |         """Continue hashing of a message by consuming the next chunk of data. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |             data (byte string/byte array/memoryview): The next chunk of the message being hashed. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         result = _raw_ripemd160_lib.ripemd160_update(self._state.get(), | ||||||
|  |                                                      c_uint8_ptr(data), | ||||||
|  |                                                      c_size_t(len(data))) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating ripemd160" | ||||||
|  |                              % result) | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         """Return the **binary** (non-printable) digest of the message that has been hashed so far. | ||||||
|  | 
 | ||||||
|  |         :return: The hash digest, computed over the data processed so far. | ||||||
|  |                  Binary form. | ||||||
|  |         :rtype: byte string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         bfr = create_string_buffer(self.digest_size) | ||||||
|  |         result = _raw_ripemd160_lib.ripemd160_digest(self._state.get(), | ||||||
|  |                                                      bfr) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating ripemd160" | ||||||
|  |                              % result) | ||||||
|  | 
 | ||||||
|  |         return get_raw_buffer(bfr) | ||||||
|  | 
 | ||||||
|  |     def hexdigest(self): | ||||||
|  |         """Return the **printable** digest of the message that has been hashed so far. | ||||||
|  | 
 | ||||||
|  |         :return: The hash digest, computed over the data processed so far. | ||||||
|  |                  Hexadecimal encoded. | ||||||
|  |         :rtype: string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         return "".join(["%02x" % bord(x) for x in self.digest()]) | ||||||
|  | 
 | ||||||
|  |     def copy(self): | ||||||
|  |         """Return a copy ("clone") of the hash object. | ||||||
|  | 
 | ||||||
|  |         The copy will have the same internal state as the original hash | ||||||
|  |         object. | ||||||
|  |         This can be used to efficiently compute the digests of strings that | ||||||
|  |         share a common initial substring. | ||||||
|  | 
 | ||||||
|  |         :return: A hash object of the same type | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         clone = RIPEMD160Hash() | ||||||
|  |         result = _raw_ripemd160_lib.ripemd160_copy(self._state.get(), | ||||||
|  |                                                    clone._state.get()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while copying ripemd160" % result) | ||||||
|  |         return clone | ||||||
|  | 
 | ||||||
|  |     def new(self, data=None): | ||||||
|  |         """Create a fresh RIPEMD-160 hash object.""" | ||||||
|  | 
 | ||||||
|  |         return RIPEMD160Hash(data) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(data=None): | ||||||
|  |     """Create a new hash object. | ||||||
|  | 
 | ||||||
|  |     :parameter data: | ||||||
|  |         Optional. The very first chunk of the message to hash. | ||||||
|  |         It is equivalent to an early call to :meth:`RIPEMD160Hash.update`. | ||||||
|  |     :type data: byte string/byte array/memoryview | ||||||
|  | 
 | ||||||
|  |     :Return: A :class:`RIPEMD160Hash` hash object | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     return RIPEMD160Hash().new(data) | ||||||
|  | 
 | ||||||
|  | # The size of the resulting hash in bytes. | ||||||
|  | digest_size = RIPEMD160Hash.digest_size | ||||||
|  | 
 | ||||||
|  | # The internal block size of the hash algorithm in bytes. | ||||||
|  | block_size = RIPEMD160Hash.block_size | ||||||
							
								
								
									
										19
									
								
								resources/lib/deps/Cryptodome/Hash/RIPEMD160.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								resources/lib/deps/Cryptodome/Hash/RIPEMD160.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | ||||||
|  | from typing import Union | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | class RIPEMD160Hash(object): | ||||||
|  |     digest_size: int | ||||||
|  |     block_size: int | ||||||
|  |     oid: str | ||||||
|  | 
 | ||||||
|  |     def __init__(self, data: Buffer = ...) -> None: ... | ||||||
|  |     def update(self, data: Buffer) -> None: ... | ||||||
|  |     def digest(self) -> bytes: ... | ||||||
|  |     def hexdigest(self) -> str: ... | ||||||
|  |     def copy(self) -> RIPEMD160Hash: ... | ||||||
|  |     def new(self, data: Buffer = ...) -> RIPEMD160Hash: ... | ||||||
|  | 
 | ||||||
|  | def new(data: Buffer = ...) -> RIPEMD160Hash: ... | ||||||
|  | digest_size: int | ||||||
|  | block_size: int | ||||||
							
								
								
									
										24
									
								
								resources/lib/deps/Cryptodome/Hash/SHA.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								resources/lib/deps/Cryptodome/Hash/SHA.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | # This file exists for backward compatibility with old code that refers to | ||||||
|  | # Cryptodome.Hash.SHA | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Hash.SHA1 import __doc__, new, block_size, digest_size | ||||||
							
								
								
									
										4
									
								
								resources/lib/deps/Cryptodome/Hash/SHA.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								resources/lib/deps/Cryptodome/Hash/SHA.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,4 @@ | ||||||
|  | # This file exists for backward compatibility with old code that refers to | ||||||
|  | # Cryptodome.Hash.SHA | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Hash.SHA1 import __doc__, new, block_size, digest_size | ||||||
							
								
								
									
										185
									
								
								resources/lib/deps/Cryptodome/Hash/SHA1.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										185
									
								
								resources/lib/deps/Cryptodome/Hash/SHA1.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,185 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # | ||||||
|  | # =================================================================== | ||||||
|  | # The contents of this file are dedicated to the public domain.  To | ||||||
|  | # the extent that dedication to the public domain is not available, | ||||||
|  | # everyone is granted a worldwide, perpetual, royalty-free, | ||||||
|  | # non-exclusive license to exercise all rights associated with the | ||||||
|  | # contents of this file for any purpose whatsoever. | ||||||
|  | # No rights are reserved. | ||||||
|  | # | ||||||
|  | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||||
|  | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||||
|  | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||||
|  | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||||||
|  | # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||||||
|  | # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | # SOFTWARE. | ||||||
|  | # =================================================================== | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util.py3compat import * | ||||||
|  | 
 | ||||||
|  | from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, | ||||||
|  |                                   VoidPointer, SmartPointer, | ||||||
|  |                                   create_string_buffer, | ||||||
|  |                                   get_raw_buffer, c_size_t, | ||||||
|  |                                   c_uint8_ptr) | ||||||
|  | 
 | ||||||
|  | _raw_sha1_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._SHA1", | ||||||
|  |                         """ | ||||||
|  |                         #define SHA1_DIGEST_SIZE 20 | ||||||
|  | 
 | ||||||
|  |                         int SHA1_init(void **shaState); | ||||||
|  |                         int SHA1_destroy(void *shaState); | ||||||
|  |                         int SHA1_update(void *hs, | ||||||
|  |                                           const uint8_t *buf, | ||||||
|  |                                           size_t len); | ||||||
|  |                         int SHA1_digest(const void *shaState, | ||||||
|  |                                           uint8_t digest[SHA1_DIGEST_SIZE]); | ||||||
|  |                         int SHA1_copy(const void *src, void *dst); | ||||||
|  | 
 | ||||||
|  |                         int SHA1_pbkdf2_hmac_assist(const void *inner, | ||||||
|  |                                             const void *outer, | ||||||
|  |                                             const uint8_t first_digest[SHA1_DIGEST_SIZE], | ||||||
|  |                                             uint8_t final_digest[SHA1_DIGEST_SIZE], | ||||||
|  |                                             size_t iterations); | ||||||
|  |                         """) | ||||||
|  | 
 | ||||||
|  | class SHA1Hash(object): | ||||||
|  |     """A SHA-1 hash object. | ||||||
|  |     Do not instantiate directly. | ||||||
|  |     Use the :func:`new` function. | ||||||
|  | 
 | ||||||
|  |     :ivar oid: ASN.1 Object ID | ||||||
|  |     :vartype oid: string | ||||||
|  | 
 | ||||||
|  |     :ivar block_size: the size in bytes of the internal message block, | ||||||
|  |                       input to the compression function | ||||||
|  |     :vartype block_size: integer | ||||||
|  | 
 | ||||||
|  |     :ivar digest_size: the size in bytes of the resulting hash | ||||||
|  |     :vartype digest_size: integer | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     # The size of the resulting hash in bytes. | ||||||
|  |     digest_size = 20 | ||||||
|  |     # The internal block size of the hash algorithm in bytes. | ||||||
|  |     block_size = 64 | ||||||
|  |     # ASN.1 Object ID | ||||||
|  |     oid = "1.3.14.3.2.26" | ||||||
|  | 
 | ||||||
|  |     def __init__(self, data=None): | ||||||
|  |         state = VoidPointer() | ||||||
|  |         result = _raw_sha1_lib.SHA1_init(state.address_of()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating SHA1" | ||||||
|  |                              % result) | ||||||
|  |         self._state = SmartPointer(state.get(), | ||||||
|  |                                    _raw_sha1_lib.SHA1_destroy) | ||||||
|  |         if data: | ||||||
|  |             self.update(data) | ||||||
|  | 
 | ||||||
|  |     def update(self, data): | ||||||
|  |         """Continue hashing of a message by consuming the next chunk of data. | ||||||
|  | 
 | ||||||
|  |         Args: | ||||||
|  |             data (byte string/byte array/memoryview): The next chunk of the message being hashed. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         result = _raw_sha1_lib.SHA1_update(self._state.get(), | ||||||
|  |                                            c_uint8_ptr(data), | ||||||
|  |                                            c_size_t(len(data))) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating SHA1" | ||||||
|  |                              % result) | ||||||
|  | 
 | ||||||
|  |     def digest(self): | ||||||
|  |         """Return the **binary** (non-printable) digest of the message that has been hashed so far. | ||||||
|  | 
 | ||||||
|  |         :return: The hash digest, computed over the data processed so far. | ||||||
|  |                  Binary form. | ||||||
|  |         :rtype: byte string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         bfr = create_string_buffer(self.digest_size) | ||||||
|  |         result = _raw_sha1_lib.SHA1_digest(self._state.get(), | ||||||
|  |                                            bfr) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while instantiating SHA1" | ||||||
|  |                              % result) | ||||||
|  | 
 | ||||||
|  |         return get_raw_buffer(bfr) | ||||||
|  | 
 | ||||||
|  |     def hexdigest(self): | ||||||
|  |         """Return the **printable** digest of the message that has been hashed so far. | ||||||
|  | 
 | ||||||
|  |         :return: The hash digest, computed over the data processed so far. | ||||||
|  |                  Hexadecimal encoded. | ||||||
|  |         :rtype: string | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         return "".join(["%02x" % bord(x) for x in self.digest()]) | ||||||
|  | 
 | ||||||
|  |     def copy(self): | ||||||
|  |         """Return a copy ("clone") of the hash object. | ||||||
|  | 
 | ||||||
|  |         The copy will have the same internal state as the original hash | ||||||
|  |         object. | ||||||
|  |         This can be used to efficiently compute the digests of strings that | ||||||
|  |         share a common initial substring. | ||||||
|  | 
 | ||||||
|  |         :return: A hash object of the same type | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         clone = SHA1Hash() | ||||||
|  |         result = _raw_sha1_lib.SHA1_copy(self._state.get(), | ||||||
|  |                                          clone._state.get()) | ||||||
|  |         if result: | ||||||
|  |             raise ValueError("Error %d while copying SHA1" % result) | ||||||
|  |         return clone | ||||||
|  | 
 | ||||||
|  |     def new(self, data=None): | ||||||
|  |         """Create a fresh SHA-1 hash object.""" | ||||||
|  | 
 | ||||||
|  |         return SHA1Hash(data) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def new(data=None): | ||||||
|  |     """Create a new hash object. | ||||||
|  | 
 | ||||||
|  |     :parameter data: | ||||||
|  |         Optional. The very first chunk of the message to hash. | ||||||
|  |         It is equivalent to an early call to :meth:`SHA1Hash.update`. | ||||||
|  |     :type data: byte string/byte array/memoryview | ||||||
|  | 
 | ||||||
|  |     :Return: A :class:`SHA1Hash` hash object | ||||||
|  |     """ | ||||||
|  |     return SHA1Hash().new(data) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # The size of the resulting hash in bytes. | ||||||
|  | digest_size = SHA1Hash.digest_size | ||||||
|  | 
 | ||||||
|  | # The internal block size of the hash algorithm in bytes. | ||||||
|  | block_size = SHA1Hash.block_size | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _pbkdf2_hmac_assist(inner, outer, first_digest, iterations): | ||||||
|  |     """Compute the expensive inner loop in PBKDF-HMAC.""" | ||||||
|  | 
 | ||||||
|  |     assert len(first_digest) == digest_size | ||||||
|  |     assert iterations > 0 | ||||||
|  | 
 | ||||||
|  |     bfr = create_string_buffer(digest_size); | ||||||
|  |     result = _raw_sha1_lib.SHA1_pbkdf2_hmac_assist( | ||||||
|  |                     inner._state.get(), | ||||||
|  |                     outer._state.get(), | ||||||
|  |                     first_digest, | ||||||
|  |                     bfr, | ||||||
|  |                     c_size_t(iterations)) | ||||||
|  | 
 | ||||||
|  |     if result: | ||||||
|  |         raise ValueError("Error %d with PBKDF2-HMAC assis for SHA1" % result) | ||||||
|  | 
 | ||||||
|  |     return get_raw_buffer(bfr) | ||||||
							
								
								
									
										19
									
								
								resources/lib/deps/Cryptodome/Hash/SHA1.pyi
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								resources/lib/deps/Cryptodome/Hash/SHA1.pyi
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | ||||||
|  | from typing import Union, Optional | ||||||
|  | 
 | ||||||
|  | Buffer = Union[bytes, bytearray, memoryview] | ||||||
|  | 
 | ||||||
|  | class SHA1Hash(object): | ||||||
|  |     digest_size: int | ||||||
|  |     block_size: int | ||||||
|  |     oid: str | ||||||
|  | 
 | ||||||
|  |     def __init__(self, data: Optional[Buffer] = ...) -> None: ... | ||||||
|  |     def update(self, data: Buffer) -> None: ... | ||||||
|  |     def digest(self) -> bytes: ... | ||||||
|  |     def hexdigest(self) -> str: ... | ||||||
|  |     def copy(self) -> SHA1Hash: ... | ||||||
|  |     def new(self, data: Optional[Buffer] = ...) -> SHA1Hash: ... | ||||||
|  | 
 | ||||||
|  | def new(data: Optional[Buffer] = ...) -> SHA1Hash: ... | ||||||
|  | digest_size: int | ||||||
|  | block_size: int | ||||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue