aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDeterminant <[email protected]>2024-08-23 03:14:03 +0000
committerDeterminant <[email protected]>2024-08-22 20:34:57 -0700
commit8d1c76ec7caf247d5675e14260d20fc508977ffb (patch)
tree8fa7c8ce3b7e3f4ece150a6da5922b5eb2dc7772
parent258780284151d49cba1d9c0d2ce33f9a19bb058b (diff)
release v0.1.8
-rw-r--r--AppImageBuilder.yml5
-rw-r--r--frozen_deps/Cryptodome/Cipher/AES.py174
-rw-r--r--frozen_deps/Cryptodome/Cipher/AES.pyi155
-rw-r--r--frozen_deps/Cryptodome/Cipher/ARC2.pyi12
-rw-r--r--frozen_deps/Cryptodome/Cipher/ARC4.py7
-rw-r--r--frozen_deps/Cryptodome/Cipher/ARC4.pyi2
-rw-r--r--frozen_deps/Cryptodome/Cipher/Blowfish.pyi12
-rw-r--r--frozen_deps/Cryptodome/Cipher/CAST.pyi12
-rw-r--r--frozen_deps/Cryptodome/Cipher/ChaCha20.py10
-rw-r--r--frozen_deps/Cryptodome/Cipher/ChaCha20.pyi6
-rw-r--r--frozen_deps/Cryptodome/Cipher/ChaCha20_Poly1305.py32
-rw-r--r--frozen_deps/Cryptodome/Cipher/ChaCha20_Poly1305.pyi6
-rw-r--r--frozen_deps/Cryptodome/Cipher/DES.pyi12
-rw-r--r--frozen_deps/Cryptodome/Cipher/DES3.pyi12
-rw-r--r--frozen_deps/Cryptodome/Cipher/PKCS1_OAEP.py44
-rw-r--r--frozen_deps/Cryptodome/Cipher/PKCS1_v1_5.py38
-rw-r--r--frozen_deps/Cryptodome/Cipher/Salsa20.pyi5
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_ARC4.abi3.sobin13768 -> 21016 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_ARC4.cpython-39-x86_64-linux-gnu.sobin14354 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_Salsa20.abi3.sobin26784 -> 27016 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_Salsa20.cpython-39-x86_64-linux-gnu.sobin21734 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_chacha20.abi3.sobin28224 -> 30624 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_chacha20.cpython-39-x86_64-linux-gnu.sobin25741 -> 0 bytes
-rw-r--r--frozen_deps/Cryptodome/Cipher/_mode_cbc.py22
-rw-r--r--frozen_deps/Cryptodome/Cipher/_mode_ccm.py30
-rw-r--r--frozen_deps/Cryptodome/Cipher/_mode_cfb.py22
-rw-r--r--frozen_deps/Cryptodome/Cipher/_mode_ctr.py10
-rw-r--r--frozen_deps/Cryptodome/Cipher/_mode_eax.py30
-rw-r--r--frozen_deps/Cryptodome/Cipher/_mode_gcm.py32
-rw-r--r--frozen_deps/Cryptodome/Cipher/_mode_ocb.py45
-rw-r--r--frozen_deps/Cryptodome/Cipher/_mode_ofb.py20
-rw-r--r--frozen_deps/Cryptodome/Cipher/_mode_siv.py32
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_pkcs1_decode.abi3.sobin28096 -> 56536 bytes
-rw-r--r--frozen_deps/Cryptodome/Cipher/_pkcs1_oaep_decode.py41
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_aes.abi3.sobin66256 -> 106808 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_aes.cpython-39-x86_64-linux-gnu.sobin54112 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_aesni.abi3.sobin101136 -> 106384 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_aesni.cpython-39-x86_64-linux-gnu.sobin52331 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_arc2.abi3.sobin43776 -> 46464 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_arc2.cpython-39-x86_64-linux-gnu.sobin18917 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_blowfish.abi3.sobin69976 -> 78640 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_blowfish.cpython-39-x86_64-linux-gnu.sobin26938 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_cast.abi3.sobin42976 -> 57408 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_cast.cpython-39-x86_64-linux-gnu.sobin44422 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_cbc.abi3.sobin20736 -> 23000 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_cbc.cpython-39-x86_64-linux-gnu.sobin17215 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_cfb.abi3.sobin25440 -> 26864 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_cfb.cpython-39-x86_64-linux-gnu.sobin22696 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_ctr.abi3.sobin28600 -> 31336 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_ctr.cpython-39-x86_64-linux-gnu.sobin23249 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_des.abi3.sobin75672 -> 71560 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_des.cpython-39-x86_64-linux-gnu.sobin62525 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_des3.abi3.sobin76480 -> 72520 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_des3.cpython-39-x86_64-linux-gnu.sobin63370 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_ecb.abi3.sobin12440 -> 19016 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_ecb.cpython-39-x86_64-linux-gnu.sobin10893 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_eksblowfish.abi3.sobin166264 -> 181192 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_eksblowfish.cpython-39-x86_64-linux-gnu.sobin58926 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_ocb.abi3.sobin37344 -> 45856 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_ocb.cpython-39-x86_64-linux-gnu.sobin30281 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_ofb.abi3.sobin15368 -> 22128 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Cipher/_raw_ofb.cpython-39-x86_64-linux-gnu.sobin14743 -> 0 bytes
-rw-r--r--frozen_deps/Cryptodome/Hash/BLAKE2b.py4
-rw-r--r--frozen_deps/Cryptodome/Hash/BLAKE2s.py2
-rw-r--r--frozen_deps/Cryptodome/Hash/CMAC.py12
-rw-r--r--frozen_deps/Cryptodome/Hash/HMAC.py27
-rw-r--r--frozen_deps/Cryptodome/Hash/KangarooTwelve.py78
-rw-r--r--frozen_deps/Cryptodome/Hash/TupleHash128.py18
-rw-r--r--frozen_deps/Cryptodome/Hash/TupleHash128.pyi4
-rw-r--r--frozen_deps/Cryptodome/Hash/TupleHash256.py3
-rw-r--r--frozen_deps/Cryptodome/Hash/TurboSHAKE128.py112
-rw-r--r--frozen_deps/Cryptodome/Hash/TurboSHAKE128.pyi17
-rw-r--r--frozen_deps/Cryptodome/Hash/TurboSHAKE256.py22
-rw-r--r--frozen_deps/Cryptodome/Hash/TurboSHAKE256.pyi12
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_BLAKE2b.abi3.sobin21888 -> 27424 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_BLAKE2b.cpython-39-x86_64-linux-gnu.sobin20015 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_BLAKE2s.abi3.sobin21712 -> 26952 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_BLAKE2s.cpython-39-x86_64-linux-gnu.sobin20807 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_MD2.abi3.sobin20128 -> 23136 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_MD2.cpython-39-x86_64-linux-gnu.sobin16919 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_MD4.abi3.sobin25576 -> 27192 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_MD4.cpython-39-x86_64-linux-gnu.sobin19072 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_MD5.abi3.sobin31704 -> 32008 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_MD5.cpython-39-x86_64-linux-gnu.sobin25434 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_RIPEMD160.abi3.sobin55608 -> 60728 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_RIPEMD160.cpython-39-x86_64-linux-gnu.sobin27226 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_SHA1.abi3.sobin74416 -> 72064 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_SHA1.cpython-39-x86_64-linux-gnu.sobin84273 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_SHA224.abi3.sobin43792 -> 45768 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_SHA224.cpython-39-x86_64-linux-gnu.sobin35822 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_SHA256.abi3.sobin43872 -> 45832 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_SHA256.cpython-39-x86_64-linux-gnu.sobin35806 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_SHA384.abi3.sobin50520 -> 54160 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_SHA384.cpython-39-x86_64-linux-gnu.sobin41869 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_SHA512.abi3.sobin50624 -> 54200 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_SHA512.cpython-39-x86_64-linux-gnu.sobin41967 -> 0 bytes
-rw-r--r--frozen_deps/Cryptodome/Hash/__init__.py49
-rw-r--r--frozen_deps/Cryptodome/Hash/__init__.pyi57
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_ghash_clmul.abi3.sobin50160 -> 58376 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_ghash_clmul.cpython-39-x86_64-linux-gnu.sobin34203 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_ghash_portable.abi3.sobin17432 -> 25024 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_ghash_portable.cpython-39-x86_64-linux-gnu.sobin18711 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_keccak.abi3.sobin35064 -> 41632 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_keccak.cpython-39-x86_64-linux-gnu.sobin26749 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_poly1305.abi3.sobin33360 -> 33424 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Hash/_poly1305.cpython-39-x86_64-linux-gnu.sobin25921 -> 0 bytes
-rw-r--r--frozen_deps/Cryptodome/Hash/cSHAKE128.py6
-rw-r--r--frozen_deps/Cryptodome/IO/PKCS8.py49
-rw-r--r--frozen_deps/Cryptodome/IO/PKCS8.pyi15
-rw-r--r--frozen_deps/Cryptodome/IO/_PBES.py229
-rw-r--r--frozen_deps/Cryptodome/IO/_PBES.pyi15
-rw-r--r--frozen_deps/Cryptodome/Math/Numbers.pyi6
-rw-r--r--frozen_deps/Cryptodome/Math/_IntegerBase.py20
-rw-r--r--frozen_deps/Cryptodome/Math/_IntegerBase.pyi6
-rw-r--r--frozen_deps/Cryptodome/Math/_IntegerCustom.py56
-rw-r--r--frozen_deps/Cryptodome/Math/_IntegerGMP.py20
-rw-r--r--frozen_deps/Cryptodome/Math/_IntegerNative.py45
-rwxr-xr-xfrozen_deps/Cryptodome/Math/_modexp.abi3.sobin294464 -> 213552 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Math/_modexp.cpython-39-x86_64-linux-gnu.sobin207274 -> 0 bytes
-rw-r--r--frozen_deps/Cryptodome/Protocol/DH.py101
-rw-r--r--frozen_deps/Cryptodome/Protocol/DH.pyi15
-rw-r--r--frozen_deps/Cryptodome/Protocol/KDF.py80
-rw-r--r--frozen_deps/Cryptodome/Protocol/KDF.pyi20
-rw-r--r--frozen_deps/Cryptodome/Protocol/__init__.py2
-rwxr-xr-xfrozen_deps/Cryptodome/Protocol/_scrypt.abi3.sobin25024 -> 26176 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Protocol/_scrypt.cpython-39-x86_64-linux-gnu.sobin16510 -> 0 bytes
-rw-r--r--frozen_deps/Cryptodome/PublicKey/ECC.py56
-rw-r--r--frozen_deps/Cryptodome/PublicKey/ECC.pyi50
-rw-r--r--frozen_deps/Cryptodome/PublicKey/RSA.py150
-rw-r--r--frozen_deps/Cryptodome/PublicKey/RSA.pyi41
-rwxr-xr-xfrozen_deps/Cryptodome/PublicKey/_ec_ws.abi3.sobin1068008 -> 960552 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/PublicKey/_ec_ws.cpython-39-x86_64-linux-gnu.sobin1000375 -> 0 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/PublicKey/_ed25519.abi3.sobin578280 -> 220544 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/PublicKey/_ed448.abi3.sobin329424 -> 250592 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/PublicKey/_x25519.abi3.sobin124632 -> 79472 bytes
-rw-r--r--frozen_deps/Cryptodome/Random/random.pyi6
-rw-r--r--frozen_deps/Cryptodome/Signature/PKCS1_PSS.pyi27
-rw-r--r--frozen_deps/Cryptodome/Signature/PKCS1_v1_5.pyi14
-rw-r--r--frozen_deps/Cryptodome/Signature/eddsa.py12
-rw-r--r--frozen_deps/Cryptodome/Signature/eddsa.pyi2
-rw-r--r--frozen_deps/Cryptodome/Signature/pkcs1_15.py11
-rw-r--r--frozen_deps/Cryptodome/Signature/pss.py11
-rw-r--r--frozen_deps/Cryptodome/Signature/pss.pyi2
-rw-r--r--frozen_deps/Cryptodome/Util/Counter.py2
-rwxr-xr-xfrozen_deps/Cryptodome/Util/_cpuid_c.abi3.sobin12776 -> 19304 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Util/_cpuid_c.cpython-39-x86_64-linux-gnu.sobin10899 -> 0 bytes
-rw-r--r--frozen_deps/Cryptodome/Util/_raw_api.py6
-rwxr-xr-xfrozen_deps/Cryptodome/Util/_strxor.abi3.sobin14960 -> 20376 bytes
-rwxr-xr-xfrozen_deps/Cryptodome/Util/_strxor.cpython-39-x86_64-linux-gnu.sobin13213 -> 0 bytes
-rw-r--r--frozen_deps/Cryptodome/Util/asn1.py209
-rw-r--r--frozen_deps/Cryptodome/Util/asn1.pyi18
-rw-r--r--frozen_deps/Cryptodome/Util/number.py81
-rw-r--r--frozen_deps/Cryptodome/Util/py3compat.py11
-rw-r--r--frozen_deps/Cryptodome/__init__.py2
-rwxr-xr-xfrozen_deps/_pysha3.cpython-310-x86_64-linux-gnu.sobin381088 -> 358248 bytes
-rwxr-xr-xfrozen_deps/_pysha3.cpython-38-x86_64-linux-gnu.sobin517664 -> 0 bytes
-rwxr-xr-xfrozen_deps/_pysha3.cpython-39-x86_64-linux-gnu.sobin517208 -> 0 bytes
-rw-r--r--frozen_deps/base58-2.0.1.dist-info/COPYING19
-rw-r--r--frozen_deps/base58-2.0.1.dist-info/INSTALLER1
-rw-r--r--frozen_deps/base58-2.0.1.dist-info/METADATA20
-rw-r--r--frozen_deps/base58-2.0.1.dist-info/RECORD13
-rw-r--r--frozen_deps/base58-2.0.1.dist-info/WHEEL5
-rw-r--r--frozen_deps/base58-2.0.1.dist-info/entry_points.txt3
-rw-r--r--frozen_deps/base58-2.0.1.dist-info/top_level.txt1
-rw-r--r--frozen_deps/base58-2.1.0.dist-info/COPYING19
-rw-r--r--frozen_deps/base58-2.1.0.dist-info/INSTALLER1
-rw-r--r--frozen_deps/base58-2.1.0.dist-info/METADATA85
-rw-r--r--frozen_deps/base58-2.1.0.dist-info/RECORD13
-rw-r--r--frozen_deps/base58-2.1.0.dist-info/WHEEL5
-rw-r--r--frozen_deps/base58-2.1.0.dist-info/entry_points.txt3
-rw-r--r--frozen_deps/base58-2.1.0.dist-info/top_level.txt1
-rw-r--r--frozen_deps/base58-2.1.1.dist-info/COPYING19
-rw-r--r--frozen_deps/base58-2.1.1.dist-info/INSTALLER1
-rw-r--r--frozen_deps/base58-2.1.1.dist-info/METADATA86
-rw-r--r--frozen_deps/base58-2.1.1.dist-info/RECORD13
-rw-r--r--frozen_deps/base58-2.1.1.dist-info/WHEEL5
-rw-r--r--frozen_deps/base58-2.1.1.dist-info/entry_points.txt3
-rw-r--r--frozen_deps/base58-2.1.1.dist-info/top_level.txt1
-rw-r--r--frozen_deps/bech32.py123
-rwxr-xr-xfrozen_deps/bin/base588
-rwxr-xr-xfrozen_deps/bin/keytree.py438
-rw-r--r--frozen_deps/ecdsa-0.16.1.dist-info/INSTALLER1
-rw-r--r--frozen_deps/ecdsa-0.16.1.dist-info/LICENSE24
-rw-r--r--frozen_deps/ecdsa-0.16.1.dist-info/METADATA626
-rw-r--r--frozen_deps/ecdsa-0.16.1.dist-info/RECORD52
-rw-r--r--frozen_deps/ecdsa-0.16.1.dist-info/WHEEL6
-rw-r--r--frozen_deps/ecdsa-0.16.1.dist-info/top_level.txt1
-rw-r--r--frozen_deps/ecdsa-0.18.0.dist-info/INSTALLER1
-rw-r--r--frozen_deps/ecdsa-0.18.0.dist-info/LICENSE24
-rw-r--r--frozen_deps/ecdsa-0.18.0.dist-info/METADATA675
-rw-r--r--frozen_deps/ecdsa-0.18.0.dist-info/RECORD64
-rw-r--r--frozen_deps/ecdsa-0.18.0.dist-info/WHEEL6
-rw-r--r--frozen_deps/ecdsa-0.18.0.dist-info/top_level.txt1
-rw-r--r--frozen_deps/ecdsa/__init__.py14
-rw-r--r--frozen_deps/ecdsa/_compat.py27
-rw-r--r--frozen_deps/ecdsa/_version.py6
-rw-r--r--frozen_deps/ecdsa/curves.py77
-rw-r--r--frozen_deps/ecdsa/der.py32
-rw-r--r--frozen_deps/ecdsa/ecdsa.py247
-rw-r--r--frozen_deps/ecdsa/ellipticcurve.py28
-rw-r--r--frozen_deps/ecdsa/keys.py41
-rw-r--r--frozen_deps/ecdsa/numbertheory.py30
-rw-r--r--frozen_deps/ecdsa/ssh.py83
-rw-r--r--frozen_deps/ecdsa/test_der.py80
-rw-r--r--frozen_deps/ecdsa/test_ecdh.py8
-rw-r--r--frozen_deps/ecdsa/test_ecdsa.py45
-rw-r--r--frozen_deps/ecdsa/test_eddsa.py47
-rw-r--r--frozen_deps/ecdsa/test_ellipticcurve.py63
-rw-r--r--frozen_deps/ecdsa/test_jacobi.py140
-rw-r--r--frozen_deps/ecdsa/test_keys.py207
-rw-r--r--frozen_deps/ecdsa/test_malformed_sigs.py46
-rw-r--r--frozen_deps/ecdsa/test_numbertheory.py64
-rw-r--r--frozen_deps/ecdsa/test_pyecdsa.py607
-rw-r--r--frozen_deps/ecdsa/test_sha3.py4
-rw-r--r--frozen_deps/ecdsa/util.py126
-rw-r--r--frozen_deps/keytree.py-0.2-py3.9.egg-info/PKG-INFO10
-rw-r--r--frozen_deps/keytree.py-0.2-py3.9.egg-info/SOURCES.txt9
-rw-r--r--frozen_deps/keytree.py-0.2-py3.9.egg-info/dependency_links.txt1
-rw-r--r--frozen_deps/keytree.py-0.2-py3.9.egg-info/installed-files.txt8
-rw-r--r--frozen_deps/keytree.py-0.2-py3.9.egg-info/requires.txt5
-rw-r--r--frozen_deps/keytree.py-0.2-py3.9.egg-info/top_level.txt1
-rw-r--r--frozen_deps/keytree.py-0.2.dist-info/INSTALLER1
-rw-r--r--frozen_deps/keytree.py-0.2.dist-info/METADATA14
-rw-r--r--frozen_deps/keytree.py-0.2.dist-info/RECORD11
-rw-r--r--frozen_deps/keytree.py-0.2.dist-info/REQUESTED0
-rw-r--r--frozen_deps/keytree.py-0.2.dist-info/WHEEL5
-rw-r--r--frozen_deps/keytree.py-0.2.dist-info/direct_url.json1
-rw-r--r--frozen_deps/keytree.py-0.2.dist-info/top_level.txt1
-rw-r--r--frozen_deps/pycryptodomex-3.15.0.dist-info/AUTHORS.rst50
-rw-r--r--frozen_deps/pycryptodomex-3.15.0.dist-info/INSTALLER1
-rw-r--r--frozen_deps/pycryptodomex-3.15.0.dist-info/LICENSE.rst61
-rw-r--r--frozen_deps/pycryptodomex-3.15.0.dist-info/METADATA84
-rw-r--r--frozen_deps/pycryptodomex-3.15.0.dist-info/RECORD512
-rw-r--r--frozen_deps/pycryptodomex-3.15.0.dist-info/WHEEL5
-rw-r--r--frozen_deps/pycryptodomex-3.15.0.dist-info/top_level.txt1
-rw-r--r--frozen_deps/pycryptodomex-3.9.9.dist-info/AUTHORS.rst49
-rw-r--r--frozen_deps/pycryptodomex-3.9.9.dist-info/INSTALLER1
-rw-r--r--frozen_deps/pycryptodomex-3.9.9.dist-info/LICENSE.rst274
-rw-r--r--frozen_deps/pycryptodomex-3.9.9.dist-info/METADATA84
-rw-r--r--frozen_deps/pycryptodomex-3.9.9.dist-info/RECORD794
-rw-r--r--frozen_deps/pycryptodomex-3.9.9.dist-info/WHEEL5
-rw-r--r--frozen_deps/pycryptodomex-3.9.9.dist-info/top_level.txt1
-rw-r--r--frozen_deps/pysha3-1.0.2-py3.9.egg-info/PKG-INFO249
-rw-r--r--frozen_deps/pysha3-1.0.2-py3.9.egg-info/SOURCES.txt47
-rw-r--r--frozen_deps/pysha3-1.0.2-py3.9.egg-info/dependency_links.txt1
-rw-r--r--frozen_deps/pysha3-1.0.2-py3.9.egg-info/installed-files.txt7
-rw-r--r--frozen_deps/pysha3-1.0.2-py3.9.egg-info/top_level.txt2
-rw-r--r--frozen_deps/pysha3-1.0.2.dist-info/INSTALLER1
-rw-r--r--frozen_deps/pysha3-1.0.2.dist-info/LICENSE49
-rw-r--r--frozen_deps/pysha3-1.0.2.dist-info/METADATA250
-rw-r--r--frozen_deps/pysha3-1.0.2.dist-info/RECORD9
-rw-r--r--frozen_deps/pysha3-1.0.2.dist-info/WHEEL5
-rw-r--r--frozen_deps/pysha3-1.0.2.dist-info/top_level.txt2
-rw-r--r--frozen_deps/six-1.15.0.dist-info/INSTALLER1
-rw-r--r--frozen_deps/six-1.15.0.dist-info/LICENSE18
-rw-r--r--frozen_deps/six-1.15.0.dist-info/METADATA49
-rw-r--r--frozen_deps/six-1.15.0.dist-info/RECORD8
-rw-r--r--frozen_deps/six-1.15.0.dist-info/WHEEL6
-rw-r--r--frozen_deps/six-1.15.0.dist-info/top_level.txt1
-rw-r--r--frozen_deps/six-1.16.0.dist-info/INSTALLER1
-rw-r--r--frozen_deps/six-1.16.0.dist-info/LICENSE18
-rw-r--r--frozen_deps/six-1.16.0.dist-info/METADATA49
-rw-r--r--frozen_deps/six-1.16.0.dist-info/RECORD8
-rw-r--r--frozen_deps/six-1.16.0.dist-info/WHEEL6
-rw-r--r--frozen_deps/six-1.16.0.dist-info/top_level.txt1
-rw-r--r--keytree-0.1.7-x86_64.AppImage.zsyncbin54486 -> 0 bytes
-rwxr-xr-xkeytree-0.1.8-x86_64.AppImage (renamed from keytree-0.1.7-x86_64.AppImage)bin15873216 -> 15787200 bytes
-rw-r--r--keytree-0.1.8-x86_64.AppImage.zsyncbin0 -> 54192 bytes
-rw-r--r--setup.py2
269 files changed, 3511 insertions, 6298 deletions
diff --git a/AppImageBuilder.yml b/AppImageBuilder.yml
index eb458a3..4c474d1 100644
--- a/AppImageBuilder.yml
+++ b/AppImageBuilder.yml
@@ -2,9 +2,12 @@ version: 1
script:
- rm -rf AppDir | true
- mkdir -p AppDir/usr/src
+ - cp mnemonic.py AppDir/usr/src
- cp bech32.py AppDir/usr/src
+ - cp shamir.py AppDir/usr/src
- cp keytree.py AppDir/usr/src
- cp setup.py AppDir/usr/src
+ - cp -r wordlist/ AppDir/usr/src
- python3.10 -m pip install -t AppDir/usr/src/frozen_deps AppDir/usr/src
- rm -rf AppDir/usr/src/frozen_deps/Cryptodome/SelfTest
@@ -39,7 +42,7 @@ AppDir:
PYTHONHOME: '${APPDIR}/usr'
# Path to the site-packages dir or other modules dirs
# See https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH
- PYTHONPATH: '${APPDIR}/usr/lib/python3.8/site-packages'
+ PYTHONPATH: '${APPDIR}/usr/lib/python3.10/site-packages'
AppImage:
update-information: 'gh-releases-zsync|AppImageCrafters|keytree|latest|python-appimage-*x86_64.AppImage.zsync'
diff --git a/frozen_deps/Cryptodome/Cipher/AES.py b/frozen_deps/Cryptodome/Cipher/AES.py
index 566a207..402a3d7 100644
--- a/frozen_deps/Cryptodome/Cipher/AES.py
+++ b/frozen_deps/Cryptodome/Cipher/AES.py
@@ -19,21 +19,6 @@
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
# ===================================================================
-"""
-Module's constants for the modes of operation supported with AES:
-
-: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_CCM: :ref:`Counter with CBC-MAC (CCM) Mode <ccm_mode>`
-:var MODE_EAX: :ref:`EAX Mode <eax_mode>`
-:var MODE_GCM: :ref:`Galois Counter Mode (GCM) <gcm_mode>`
-:var MODE_SIV: :ref:`Syntethic Initialization Vector (SIV) <siv_mode>`
-:var MODE_OCB: :ref:`Offset Code Book (OCB) <ocb_mode>`
-"""
import sys
@@ -45,6 +30,18 @@ from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib,
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[],
@@ -130,120 +127,107 @@ def _derive_Poly1305_key_pair(key, nonce):
def new(key, mode, *args, **kwargs):
"""Create a new AES cipher.
- :param key:
+ Args:
+ key(bytes/bytearray/memoryview):
The secret key to use in the symmetric cipher.
- It must be 16, 24 or 32 bytes long (respectively for *AES-128*,
- *AES-192* or *AES-256*).
+ 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.
- :type key: bytes/bytearray/memoryview
-
- :param mode:
+ mode (a ``MODE_*`` constant):
The chaining mode to use for encryption or decryption.
If in doubt, use ``MODE_EAX``.
- :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).
+ 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.
+ 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_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).
+ 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).
+ 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``).
+ 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).
+ 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_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_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_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_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.
+ 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).
+ 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.
+ 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.
+ 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**.
+ 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.
+ 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.
+ 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.
+ 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*) --
- Instance of ``Cryptodome.Util.Counter``, which allows full customization
- of the counter block. This parameter is incompatible to both ``nonce``
- and ``initial_value``.
+ 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).
+ use_aesni: (boolean):
+ Use Intel AES-NI hardware extensions (default: use if available).
- :Return: an AES object, of the applicable mode.
+ Returns:
+ an AES object, of the applicable mode.
"""
kwargs["add_aes_modes"] = True
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_CCM = 8
-MODE_EAX = 9
-MODE_SIV = 10
-MODE_GCM = 11
-MODE_OCB = 12
-
# Size of a data block (in bytes)
block_size = 16
# Size of a key (in bytes)
diff --git a/frozen_deps/Cryptodome/Cipher/AES.pyi b/frozen_deps/Cryptodome/Cipher/AES.pyi
index c150efb..3f07b65 100644
--- a/frozen_deps/Cryptodome/Cipher/AES.pyi
+++ b/frozen_deps/Cryptodome/Cipher/AES.pyi
@@ -1,4 +1,7 @@
-from typing import Union, Tuple, Optional, Dict
+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
@@ -12,36 +15,142 @@ from Cryptodome.Cipher._mode_gcm import GcmMode
from Cryptodome.Cipher._mode_siv import SivMode
from Cryptodome.Cipher._mode_ocb import OcbMode
-AESMode = int
+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: AESMode
-MODE_CBC: AESMode
-MODE_CFB: AESMode
-MODE_OFB: AESMode
-MODE_CTR: AESMode
-MODE_OPENPGP: AESMode
-MODE_CCM: AESMode
-MODE_EAX: AESMode
-MODE_GCM: AESMode
-MODE_SIV: AESMode
-MODE_OCB: AESMode
+# MODE_ECB
+@overload
+def new(key: Buffer,
+ mode: Literal[1],
+ use_aesni : bool = ...) -> \
+ EcbMode: ...
-Buffer = Union[bytes, bytearray, memoryview]
+# MODE_CBC
+@overload
+def new(key: Buffer,
+ mode: Literal[2],
+ iv : Optional[Buffer] = ...,
+ use_aesni : bool = ...) -> \
+ CbcMode: ...
+@overload
def new(key: Buffer,
- mode: AESMode,
- iv : Buffer = ...,
- IV : Buffer = ...,
- nonce : 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 = ...,
- mac_len : int = ...,
- assoc_len : 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 = ...) -> \
- Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode,
- OpenPgpMode, CcmMode, EaxMode, GcmMode,
- SivMode, OcbMode]: ...
+ 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]
diff --git a/frozen_deps/Cryptodome/Cipher/ARC2.pyi b/frozen_deps/Cryptodome/Cipher/ARC2.pyi
index 9659c68..a122a52 100644
--- a/frozen_deps/Cryptodome/Cipher/ARC2.pyi
+++ b/frozen_deps/Cryptodome/Cipher/ARC2.pyi
@@ -1,4 +1,6 @@
-from typing import Union, Dict, Iterable
+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
@@ -18,13 +20,11 @@ MODE_CTR: ARC2Mode
MODE_OPENPGP: ARC2Mode
MODE_EAX: ARC2Mode
-Buffer = Union[bytes, bytearray, memoryview]
-
def new(key: Buffer,
mode: ARC2Mode,
- iv : Buffer = ...,
- IV : Buffer = ...,
- nonce : Buffer = ...,
+ iv : Optional[Buffer] = ...,
+ IV : Optional[Buffer] = ...,
+ nonce : Optional[Buffer] = ...,
segment_size : int = ...,
mac_len : int = ...,
initial_value : Union[int, Buffer] = ...,
diff --git a/frozen_deps/Cryptodome/Cipher/ARC4.py b/frozen_deps/Cryptodome/Cipher/ARC4.py
index e640e77..543a323 100644
--- a/frozen_deps/Cryptodome/Cipher/ARC4.py
+++ b/frozen_deps/Cryptodome/Cipher/ARC4.py
@@ -20,8 +20,6 @@
# SOFTWARE.
# ===================================================================
-from Cryptodome.Util.py3compat import b
-
from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer,
create_string_buffer, get_raw_buffer,
SmartPointer, c_size_t, c_uint8_ptr)
@@ -113,7 +111,7 @@ def new(key, *args, **kwargs):
:param key:
The secret key to use in the symmetric cipher.
- Its length must be in the range ``[5..256]``.
+ Its length must be in the range ``[1..256]``.
The recommended length is 16 bytes.
:type key: bytes, bytearray, memoryview
@@ -131,7 +129,8 @@ def new(key, *args, **kwargs):
"""
return ARC4Cipher(key, *args, **kwargs)
+
# Size of a data block (in bytes)
block_size = 1
# Size of a key (in bytes)
-key_size = range(5, 256+1)
+key_size = range(1, 256+1)
diff --git a/frozen_deps/Cryptodome/Cipher/ARC4.pyi b/frozen_deps/Cryptodome/Cipher/ARC4.pyi
index 2e75d6f..b081585 100644
--- a/frozen_deps/Cryptodome/Cipher/ARC4.pyi
+++ b/frozen_deps/Cryptodome/Cipher/ARC4.pyi
@@ -1,6 +1,6 @@
from typing import Any, Union, Iterable
-Buffer = Union[bytes, bytearray, memoryview]
+Buffer = bytes|bytearray|memoryview
class ARC4Cipher:
block_size: int
diff --git a/frozen_deps/Cryptodome/Cipher/Blowfish.pyi b/frozen_deps/Cryptodome/Cipher/Blowfish.pyi
index a669240..b8b21c6 100644
--- a/frozen_deps/Cryptodome/Cipher/Blowfish.pyi
+++ b/frozen_deps/Cryptodome/Cipher/Blowfish.pyi
@@ -1,4 +1,6 @@
-from typing import Union, Dict, Iterable
+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
@@ -18,13 +20,11 @@ MODE_CTR: BlowfishMode
MODE_OPENPGP: BlowfishMode
MODE_EAX: BlowfishMode
-Buffer = Union[bytes, bytearray, memoryview]
-
def new(key: Buffer,
mode: BlowfishMode,
- iv : Buffer = ...,
- IV : Buffer = ...,
- nonce : Buffer = ...,
+ iv : Optional[Buffer] = ...,
+ IV : Optional[Buffer] = ...,
+ nonce : Optional[Buffer] = ...,
segment_size : int = ...,
mac_len : int = ...,
initial_value : Union[int, Buffer] = ...,
diff --git a/frozen_deps/Cryptodome/Cipher/CAST.pyi b/frozen_deps/Cryptodome/Cipher/CAST.pyi
index 6b411cf..be01f09 100644
--- a/frozen_deps/Cryptodome/Cipher/CAST.pyi
+++ b/frozen_deps/Cryptodome/Cipher/CAST.pyi
@@ -1,4 +1,6 @@
-from typing import Union, Dict, Iterable
+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
@@ -18,13 +20,11 @@ MODE_CTR: CASTMode
MODE_OPENPGP: CASTMode
MODE_EAX: CASTMode
-Buffer = Union[bytes, bytearray, memoryview]
-
def new(key: Buffer,
mode: CASTMode,
- iv : Buffer = ...,
- IV : Buffer = ...,
- nonce : Buffer = ...,
+ iv : Optional[Buffer] = ...,
+ IV : Optional[Buffer] = ...,
+ nonce : Optional[Buffer] = ...,
segment_size : int = ...,
mac_len : int = ...,
initial_value : Union[int, Buffer] = ...,
diff --git a/frozen_deps/Cryptodome/Cipher/ChaCha20.py b/frozen_deps/Cryptodome/Cipher/ChaCha20.py
index b4f8b5f..648d692 100644
--- a/frozen_deps/Cryptodome/Cipher/ChaCha20.py
+++ b/frozen_deps/Cryptodome/Cipher/ChaCha20.py
@@ -106,7 +106,7 @@ class ChaCha20Cipher(object):
self._name = "ChaCha20"
nonce = self.nonce
- self._next = ( self.encrypt, self.decrypt )
+ self._next = ("encrypt", "decrypt")
self._state = VoidPointer()
result = _raw_chacha20_lib.chacha20_init(
@@ -134,9 +134,9 @@ class ChaCha20Cipher(object):
Otherwise, ``None``.
"""
- if self.encrypt not in self._next:
+ if "encrypt" not in self._next:
raise TypeError("Cipher object can only be used for decryption")
- self._next = ( self.encrypt, )
+ self._next = ("encrypt",)
return self._encrypt(plaintext, output)
def _encrypt(self, plaintext, output):
@@ -180,9 +180,9 @@ class ChaCha20Cipher(object):
Otherwise, ``None``.
"""
- if self.decrypt not in self._next:
+ if "decrypt" not in self._next:
raise TypeError("Cipher object can only be used for encryption")
- self._next = ( self.decrypt, )
+ self._next = ("decrypt",)
try:
return self._encrypt(ciphertext, output)
diff --git a/frozen_deps/Cryptodome/Cipher/ChaCha20.pyi b/frozen_deps/Cryptodome/Cipher/ChaCha20.pyi
index 3d00a1d..f5001cd 100644
--- a/frozen_deps/Cryptodome/Cipher/ChaCha20.pyi
+++ b/frozen_deps/Cryptodome/Cipher/ChaCha20.pyi
@@ -1,6 +1,6 @@
-from typing import Union, overload
+from typing import Union, overload, Optional
-Buffer = Union[bytes, bytearray, memoryview]
+Buffer = bytes|bytearray|memoryview
def _HChaCha20(key: Buffer, nonce: Buffer) -> bytearray: ...
@@ -19,7 +19,7 @@ class ChaCha20Cipher:
def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ...
def seek(self, position: int) -> None: ...
-def new(key: Buffer, nonce: Buffer = ...) -> ChaCha20Cipher: ...
+def new(key: Buffer, nonce: Optional[Buffer] = ...) -> ChaCha20Cipher: ...
block_size: int
key_size: int
diff --git a/frozen_deps/Cryptodome/Cipher/ChaCha20_Poly1305.py b/frozen_deps/Cryptodome/Cipher/ChaCha20_Poly1305.py
index b6bc7a6..b2923ed 100644
--- a/frozen_deps/Cryptodome/Cipher/ChaCha20_Poly1305.py
+++ b/frozen_deps/Cryptodome/Cipher/ChaCha20_Poly1305.py
@@ -63,10 +63,8 @@ class ChaCha20Poly1305Cipher(object):
See also `new()` at the module level."""
- self.nonce = _copy_bytes(None, None, nonce)
-
- self._next = (self.update, self.encrypt, self.decrypt, self.digest,
- self.verify)
+ self._next = ("update", "encrypt", "decrypt", "digest",
+ "verify")
self._authenticator = Poly1305.new(key=key, nonce=nonce, cipher=ChaCha20)
@@ -94,7 +92,7 @@ class ChaCha20Poly1305Cipher(object):
A piece of associated data. There are no restrictions on its size.
"""
- if self.update not in self._next:
+ if "update" not in self._next:
raise TypeError("update() method cannot be called")
self._len_aad += len(data)
@@ -120,13 +118,13 @@ class ChaCha20Poly1305Cipher(object):
Otherwise, ``None``.
"""
- if self.encrypt not in self._next:
+ 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 = (self.encrypt, self.digest)
+ self._next = ("encrypt", "digest")
result = self._cipher.encrypt(plaintext, output=output)
self._len_ct += len(plaintext)
@@ -149,13 +147,13 @@ class ChaCha20Poly1305Cipher(object):
Otherwise, ``None``.
"""
- if self.decrypt not in self._next:
+ 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 = (self.decrypt, self.verify)
+ self._next = ("decrypt", "verify")
self._len_ct += len(ciphertext)
self._authenticator.update(ciphertext)
@@ -189,9 +187,9 @@ class ChaCha20Poly1305Cipher(object):
:Return: the MAC tag, as 16 ``bytes``.
"""
- if self.digest not in self._next:
+ if "digest" not in self._next:
raise TypeError("digest() method cannot be called")
- self._next = (self.digest,)
+ self._next = ("digest",)
return self._compute_mac()
@@ -218,10 +216,10 @@ class ChaCha20Poly1305Cipher(object):
or the key is incorrect.
"""
- if self.verify not in self._next:
+ if "verify" not in self._next:
raise TypeError("verify() cannot be called"
" when encrypting a message")
- self._next = (self.verify,)
+ self._next = ("verify",)
secret = get_random_bytes(16)
@@ -316,10 +314,10 @@ def new(**kwargs):
nonce = get_random_bytes(12)
if len(nonce) in (8, 12):
- pass
+ chacha20_poly1305_nonce = nonce
elif len(nonce) == 24:
key = _HChaCha20(key, nonce[:16])
- nonce = b'\x00\x00\x00\x00' + nonce[16:]
+ chacha20_poly1305_nonce = b'\x00\x00\x00\x00' + nonce[16:]
else:
raise ValueError("Nonce must be 8, 12 or 24 bytes long")
@@ -329,7 +327,9 @@ def new(**kwargs):
if kwargs:
raise TypeError("Unknown parameters: " + str(kwargs))
- return ChaCha20Poly1305Cipher(key, nonce)
+ cipher = ChaCha20Poly1305Cipher(key, chacha20_poly1305_nonce)
+ cipher.nonce = _copy_bytes(None, None, nonce)
+ return cipher
# Size of a key (in bytes)
diff --git a/frozen_deps/Cryptodome/Cipher/ChaCha20_Poly1305.pyi b/frozen_deps/Cryptodome/Cipher/ChaCha20_Poly1305.pyi
index ef0450f..109e805 100644
--- a/frozen_deps/Cryptodome/Cipher/ChaCha20_Poly1305.pyi
+++ b/frozen_deps/Cryptodome/Cipher/ChaCha20_Poly1305.pyi
@@ -1,6 +1,6 @@
-from typing import Union, Tuple, overload
+from typing import Union, Tuple, overload, Optional
-Buffer = Union[bytes, bytearray, memoryview]
+Buffer = bytes|bytearray|memoryview
class ChaCha20Poly1305Cipher:
nonce: bytes
@@ -22,7 +22,7 @@ class ChaCha20Poly1305Cipher:
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: Buffer = ...) -> ChaCha20Poly1305Cipher: ...
+def new(key: Buffer, nonce: Optional[Buffer] = ...) -> ChaCha20Poly1305Cipher: ...
block_size: int
key_size: int
diff --git a/frozen_deps/Cryptodome/Cipher/DES.pyi b/frozen_deps/Cryptodome/Cipher/DES.pyi
index 1ba2752..25a3b23 100644
--- a/frozen_deps/Cryptodome/Cipher/DES.pyi
+++ b/frozen_deps/Cryptodome/Cipher/DES.pyi
@@ -1,4 +1,6 @@
-from typing import Union, Dict, Iterable
+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
@@ -18,13 +20,11 @@ MODE_CTR: DESMode
MODE_OPENPGP: DESMode
MODE_EAX: DESMode
-Buffer = Union[bytes, bytearray, memoryview]
-
def new(key: Buffer,
mode: DESMode,
- iv : Buffer = ...,
- IV : Buffer = ...,
- nonce : Buffer = ...,
+ iv : Optional[Buffer] = ...,
+ IV : Optional[Buffer] = ...,
+ nonce : Optional[Buffer] = ...,
segment_size : int = ...,
mac_len : int = ...,
initial_value : Union[int, Buffer] = ...,
diff --git a/frozen_deps/Cryptodome/Cipher/DES3.pyi b/frozen_deps/Cryptodome/Cipher/DES3.pyi
index c1a524f..2c150f8 100644
--- a/frozen_deps/Cryptodome/Cipher/DES3.pyi
+++ b/frozen_deps/Cryptodome/Cipher/DES3.pyi
@@ -1,4 +1,6 @@
-from typing import Union, Dict, Tuple
+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
@@ -20,13 +22,11 @@ MODE_CTR: DES3Mode
MODE_OPENPGP: DES3Mode
MODE_EAX: DES3Mode
-Buffer = Union[bytes, bytearray, memoryview]
-
def new(key: Buffer,
mode: DES3Mode,
- iv : Buffer = ...,
- IV : Buffer = ...,
- nonce : Buffer = ...,
+ iv : Optional[Buffer] = ...,
+ IV : Optional[Buffer] = ...,
+ nonce : Optional[Buffer] = ...,
segment_size : int = ...,
mac_len : int = ...,
initial_value : Union[int, Buffer] = ...,
diff --git a/frozen_deps/Cryptodome/Cipher/PKCS1_OAEP.py b/frozen_deps/Cryptodome/Cipher/PKCS1_OAEP.py
index 7525c5d..08f9efe 100644
--- a/frozen_deps/Cryptodome/Cipher/PKCS1_OAEP.py
+++ b/frozen_deps/Cryptodome/Cipher/PKCS1_OAEP.py
@@ -23,11 +23,13 @@
from Cryptodome.Signature.pss import MGF1
import Cryptodome.Hash.SHA1
-from Cryptodome.Util.py3compat import bord, _copy_bytes
+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.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.
@@ -68,7 +70,7 @@ class PKCS1OAEP_Cipher:
if mgfunc:
self._mgf = mgfunc
else:
- self._mgf = lambda x,y: MGF1(x,y,self._hashObj)
+ self._mgf = lambda x, y: MGF1(x, y, self._hashObj)
self._label = _copy_bytes(None, None, label)
self._randfunc = randfunc
@@ -105,7 +107,7 @@ class PKCS1OAEP_Cipher:
# See 7.1.1 in RFC3447
modBits = Cryptodome.Util.number.size(self._key.n)
- k = ceil_div(modBits, 8) # Convert from bits to bytes
+ k = ceil_div(modBits, 8) # Convert from bits to bytes
hLen = self._hashObj.digest_size
mLen = len(message)
@@ -159,22 +161,18 @@ class PKCS1OAEP_Cipher:
# See 7.1.2 in RFC3447
modBits = Cryptodome.Util.number.size(self._key.n)
- k = ceil_div(modBits,8) # Convert from bits to bytes
+ 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:
+ 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)
- m_int = self._key._decrypt(ct_int)
- # Complete step 2c (I2OSP)
- em = long_to_bytes(m_int, k)
+ # Step 2b (RSADP) and step 2c (I2OSP)
+ em = self._key._decrypt_to_bytes(ct_int)
# Step 3a
lHash = self._hashObj.new(self._label).digest()
- # Step 3b
- y = em[0]
# 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]
@@ -187,22 +185,17 @@ class PKCS1OAEP_Cipher:
dbMask = self._mgf(seed, k-hLen-1)
# Step 3f
db = strxor(maskedDB, dbMask)
- # Step 3g
- one_pos = hLen + db[hLen:].find(b'\x01')
- lHash1 = db[:hLen]
- invalid = bord(y) | int(one_pos < hLen)
- hash_compare = strxor(lHash1, lHash)
- for x in hash_compare:
- invalid |= bord(x)
- for x in db[hLen:one_pos]:
- invalid |= bord(x)
- if invalid != 0:
+ # Step 3b + 3g
+ res = oaep_decode(em, lHash, db)
+ if res <= 0:
raise ValueError("Incorrect decryption.")
# Step 4
- return db[one_pos + 1:]
+ 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.
+ """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.
@@ -236,4 +229,3 @@ def new(key, hashAlgo=None, mgfunc=None, label=b'', randfunc=None):
if randfunc is None:
randfunc = Random.get_random_bytes
return PKCS1OAEP_Cipher(key, hashAlgo, mgfunc, label, randfunc)
-
diff --git a/frozen_deps/Cryptodome/Cipher/PKCS1_v1_5.py b/frozen_deps/Cryptodome/Cipher/PKCS1_v1_5.py
index 17ef9eb..d7a9b79 100644
--- a/frozen_deps/Cryptodome/Cipher/PKCS1_v1_5.py
+++ b/frozen_deps/Cryptodome/Cipher/PKCS1_v1_5.py
@@ -25,31 +25,7 @@ __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 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);
- """)
-
-
-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
+from ._pkcs1_oaep_decode import pkcs1_decode
class PKCS115_Cipher:
@@ -113,7 +89,6 @@ class PKCS115_Cipher:
continue
ps.append(new_byte)
ps = b"".join(ps)
- assert(len(ps) == k - mLen - 3)
# Step 2b
em = b'\x00\x02' + ps + b'\x00' + _copy_bytes(None, None, message)
# Step 3a (OS2IP)
@@ -176,23 +151,20 @@ class PKCS115_Cipher:
# Step 2a (O2SIP)
ct_int = bytes_to_long(ciphertext)
- # Step 2b (RSADP)
- m_int = self._key._decrypt(ct_int)
-
- # Complete step 2c (I2OSP)
- em = long_to_bytes(m_int, k)
+ # 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)
+ 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)
+ size = pkcs1_decode(em, sentinel, expected_pt_len, output)
return output[size:]
diff --git a/frozen_deps/Cryptodome/Cipher/Salsa20.pyi b/frozen_deps/Cryptodome/Cipher/Salsa20.pyi
index 9178f0d..cf8690e 100644
--- a/frozen_deps/Cryptodome/Cipher/Salsa20.pyi
+++ b/frozen_deps/Cryptodome/Cipher/Salsa20.pyi
@@ -1,7 +1,6 @@
-from typing import Union, Tuple, Optional, overload
+from typing import Union, Tuple, Optional, overload, Optional
-
-Buffer = Union[bytes, bytearray, memoryview]
+Buffer = bytes|bytearray|memoryview
class Salsa20Cipher:
nonce: bytes
diff --git a/frozen_deps/Cryptodome/Cipher/_ARC4.abi3.so b/frozen_deps/Cryptodome/Cipher/_ARC4.abi3.so
index c367472..451d359 100755
--- a/frozen_deps/Cryptodome/Cipher/_ARC4.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_ARC4.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_ARC4.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Cipher/_ARC4.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 41266ee..0000000
--- a/frozen_deps/Cryptodome/Cipher/_ARC4.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_Salsa20.abi3.so b/frozen_deps/Cryptodome/Cipher/_Salsa20.abi3.so
index 10ba4b7..a303d91 100755
--- a/frozen_deps/Cryptodome/Cipher/_Salsa20.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_Salsa20.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_Salsa20.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Cipher/_Salsa20.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 83a9be7..0000000
--- a/frozen_deps/Cryptodome/Cipher/_Salsa20.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_chacha20.abi3.so b/frozen_deps/Cryptodome/Cipher/_chacha20.abi3.so
index 316d6cb..f1f1fa1 100755
--- a/frozen_deps/Cryptodome/Cipher/_chacha20.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_chacha20.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_chacha20.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Cipher/_chacha20.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 554ee0e..0000000
--- a/frozen_deps/Cryptodome/Cipher/_chacha20.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_mode_cbc.py b/frozen_deps/Cryptodome/Cipher/_mode_cbc.py
index edc29ca..94d02e7 100644
--- a/frozen_deps/Cryptodome/Cipher/_mode_cbc.py
+++ b/frozen_deps/Cryptodome/Cipher/_mode_cbc.py
@@ -120,7 +120,7 @@ class CbcMode(object):
self.IV = self.iv
"""Alias for `iv`"""
- self._next = [ self.encrypt, self.decrypt ]
+ self._next = ["encrypt", "decrypt"]
def encrypt(self, plaintext, output=None):
"""Encrypt data with the key and the parameters set at initialization.
@@ -158,18 +158,18 @@ class CbcMode(object):
Otherwise, ``None``.
"""
- if self.encrypt not in self._next:
+ if "encrypt" not in self._next:
raise TypeError("encrypt() cannot be called after decrypt()")
- self._next = [ self.encrypt ]
-
+ 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))
@@ -221,10 +221,10 @@ class CbcMode(object):
Otherwise, ``None``.
"""
- if self.decrypt not in self._next:
+ if "decrypt" not in self._next:
raise TypeError("decrypt() cannot be called after encrypt()")
- self._next = [ self.decrypt ]
-
+ self._next = ["decrypt"]
+
if output is None:
plaintext = create_string_buffer(len(ciphertext))
else:
@@ -232,7 +232,7 @@ class CbcMode(object):
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))
@@ -285,7 +285,7 @@ def _create_cbc_cipher(factory, **kwargs):
if len(iv) != factory.block_size:
raise ValueError("Incorrect IV length (it must be %d bytes long)" %
- factory.block_size)
+ factory.block_size)
if kwargs:
raise TypeError("Unknown parameters for CBC: %s" % str(kwargs))
diff --git a/frozen_deps/Cryptodome/Cipher/_mode_ccm.py b/frozen_deps/Cryptodome/Cipher/_mode_ccm.py
index 0e1c2f6..ec2e4f4 100644
--- a/frozen_deps/Cryptodome/Cipher/_mode_ccm.py
+++ b/frozen_deps/Cryptodome/Cipher/_mode_ccm.py
@@ -155,8 +155,8 @@ class CcmMode(object):
self._t = None
# Allowed transitions after initialization
- self._next = [self.update, self.encrypt, self.decrypt,
- self.digest, self.verify]
+ self._next = ["update", "encrypt", "decrypt",
+ "digest", "verify"]
# Cumulative lengths
self._cumul_assoc_len = 0
@@ -252,12 +252,12 @@ class CcmMode(object):
A piece of associated data. There are no restrictions on its size.
"""
- if self.update not in self._next:
+ if "update" not in self._next:
raise TypeError("update() can only be called"
" immediately after initialization")
- self._next = [self.update, self.encrypt, self.decrypt,
- self.digest, self.verify]
+ self._next = ["update", "encrypt", "decrypt",
+ "digest", "verify"]
self._cumul_assoc_len += len(assoc_data)
if self._assoc_len is not None and \
@@ -336,10 +336,10 @@ class CcmMode(object):
Otherwise, ``None``.
"""
- if self.encrypt not in self._next:
+ if "encrypt" not in self._next:
raise TypeError("encrypt() can only be called after"
" initialization or an update()")
- self._next = [self.encrypt, self.digest]
+ self._next = ["encrypt", "digest"]
# No more associated data allowed from now
if self._assoc_len is None:
@@ -356,7 +356,7 @@ class CcmMode(object):
if self._msg_len is None:
self._msg_len = len(plaintext)
self._start_mac()
- self._next = [self.digest]
+ self._next = ["digest"]
self._cumul_msg_len += len(plaintext)
if self._cumul_msg_len > self._msg_len:
@@ -409,10 +409,10 @@ class CcmMode(object):
Otherwise, ``None``.
"""
- if self.decrypt not in self._next:
+ if "decrypt" not in self._next:
raise TypeError("decrypt() can only be called"
" after initialization or an update()")
- self._next = [self.decrypt, self.verify]
+ self._next = ["decrypt", "verify"]
# No more associated data allowed from now
if self._assoc_len is None:
@@ -429,7 +429,7 @@ class CcmMode(object):
if self._msg_len is None:
self._msg_len = len(ciphertext)
self._start_mac()
- self._next = [self.verify]
+ self._next = ["verify"]
self._cumul_msg_len += len(ciphertext)
if self._cumul_msg_len > self._msg_len:
@@ -461,10 +461,10 @@ class CcmMode(object):
:Return: the MAC, as a byte string.
"""
- if self.digest not in self._next:
+ if "digest" not in self._next:
raise TypeError("digest() cannot be called when decrypting"
" or validating a message")
- self._next = [self.digest]
+ self._next = ["digest"]
return self._digest()
def _digest(self):
@@ -523,10 +523,10 @@ class CcmMode(object):
or the key is incorrect.
"""
- if self.verify not in self._next:
+ if "verify" not in self._next:
raise TypeError("verify() cannot be called"
" when encrypting a message")
- self._next = [self.verify]
+ self._next = ["verify"]
self._digest()
secret = get_random_bytes(16)
diff --git a/frozen_deps/Cryptodome/Cipher/_mode_cfb.py b/frozen_deps/Cryptodome/Cipher/_mode_cfb.py
index b790dd4..1b1b6c3 100644
--- a/frozen_deps/Cryptodome/Cipher/_mode_cfb.py
+++ b/frozen_deps/Cryptodome/Cipher/_mode_cfb.py
@@ -119,7 +119,7 @@ class CfbMode(object):
self.IV = self.iv
"""Alias for `iv`"""
- self._next = [ self.encrypt, self.decrypt ]
+ self._next = ["encrypt", "decrypt"]
def encrypt(self, plaintext, output=None):
"""Encrypt data with the key and the parameters set at initialization.
@@ -154,18 +154,18 @@ class CfbMode(object):
Otherwise, ``None``.
"""
- if self.encrypt not in self._next:
+ if "encrypt" not in self._next:
raise TypeError("encrypt() cannot be called after decrypt()")
- self._next = [ self.encrypt ]
-
+ 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))
@@ -215,10 +215,10 @@ class CfbMode(object):
Otherwise, ``None``.
"""
- if self.decrypt not in self._next:
+ if "decrypt" not in self._next:
raise TypeError("decrypt() cannot be called after encrypt()")
- self._next = [ self.decrypt ]
-
+ self._next = ["decrypt"]
+
if output is None:
plaintext = create_string_buffer(len(ciphertext))
else:
@@ -226,11 +226,11 @@ class CfbMode(object):
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),
diff --git a/frozen_deps/Cryptodome/Cipher/_mode_ctr.py b/frozen_deps/Cryptodome/Cipher/_mode_ctr.py
index 74783ec..9ce357f 100644
--- a/frozen_deps/Cryptodome/Cipher/_mode_ctr.py
+++ b/frozen_deps/Cryptodome/Cipher/_mode_ctr.py
@@ -146,7 +146,7 @@ class CtrMode(object):
self.block_size = len(initial_counter_block)
"""The block size of the underlying cipher, in bytes."""
- self._next = [self.encrypt, self.decrypt]
+ self._next = ["encrypt", "decrypt"]
def encrypt(self, plaintext, output=None):
"""Encrypt data with the key and the parameters set at initialization.
@@ -181,9 +181,9 @@ class CtrMode(object):
Otherwise, ``None``.
"""
- if self.encrypt not in self._next:
+ if "encrypt" not in self._next:
raise TypeError("encrypt() cannot be called after decrypt()")
- self._next = [self.encrypt]
+ self._next = ["encrypt"]
if output is None:
ciphertext = create_string_buffer(len(plaintext))
@@ -245,9 +245,9 @@ class CtrMode(object):
Otherwise, ``None``.
"""
- if self.decrypt not in self._next:
+ if "decrypt" not in self._next:
raise TypeError("decrypt() cannot be called after encrypt()")
- self._next = [self.decrypt]
+ self._next = ["decrypt"]
if output is None:
plaintext = create_string_buffer(len(ciphertext))
diff --git a/frozen_deps/Cryptodome/Cipher/_mode_eax.py b/frozen_deps/Cryptodome/Cipher/_mode_eax.py
index 8efb77a..44ef21f 100644
--- a/frozen_deps/Cryptodome/Cipher/_mode_eax.py
+++ b/frozen_deps/Cryptodome/Cipher/_mode_eax.py
@@ -90,12 +90,12 @@ class EaxMode(object):
self._mac_tag = None # Cache for MAC tag
# Allowed transitions after initialization
- self._next = [self.update, self.encrypt, self.decrypt,
- self.digest, self.verify]
+ self._next = ["update", "encrypt", "decrypt",
+ "digest", "verify"]
# MAC tag length
- if not (4 <= self._mac_len <= self.block_size):
- raise ValueError("Parameter 'mac_len' must not be larger than %d"
+ 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
@@ -145,12 +145,12 @@ class EaxMode(object):
A piece of associated data. There are no restrictions on its size.
"""
- if self.update not in self._next:
+ if "update" not in self._next:
raise TypeError("update() can only be called"
" immediately after initialization")
- self._next = [self.update, self.encrypt, self.decrypt,
- self.digest, self.verify]
+ self._next = ["update", "encrypt", "decrypt",
+ "digest", "verify"]
self._signer.update(assoc_data)
return self
@@ -188,10 +188,10 @@ class EaxMode(object):
Otherwise, ``None``.
"""
- if self.encrypt not in self._next:
+ if "encrypt" not in self._next:
raise TypeError("encrypt() can only be called after"
" initialization or an update()")
- self._next = [self.encrypt, self.digest]
+ self._next = ["encrypt", "digest"]
ct = self._cipher.encrypt(plaintext, output=output)
if output is None:
self._omac[2].update(ct)
@@ -232,10 +232,10 @@ class EaxMode(object):
Otherwise, ``None``.
"""
- if self.decrypt not in self._next:
+ if "decrypt" not in self._next:
raise TypeError("decrypt() can only be called"
" after initialization or an update()")
- self._next = [self.decrypt, self.verify]
+ self._next = ["decrypt", "verify"]
self._omac[2].update(ciphertext)
return self._cipher.decrypt(ciphertext, output=output)
@@ -250,10 +250,10 @@ class EaxMode(object):
:Return: the MAC, as a byte string.
"""
- if self.digest not in self._next:
+ if "digest" not in self._next:
raise TypeError("digest() cannot be called when decrypting"
" or validating a message")
- self._next = [self.digest]
+ self._next = ["digest"]
if not self._mac_tag:
tag = b'\x00' * self.block_size
@@ -289,10 +289,10 @@ class EaxMode(object):
or the key is incorrect.
"""
- if self.verify not in self._next:
+ if "verify" not in self._next:
raise TypeError("verify() cannot be called"
" when encrypting a message")
- self._next = [self.verify]
+ self._next = ["verify"]
if not self._mac_tag:
tag = b'\x00' * self.block_size
diff --git a/frozen_deps/Cryptodome/Cipher/_mode_gcm.py b/frozen_deps/Cryptodome/Cipher/_mode_gcm.py
index c90061b..9914400 100644
--- a/frozen_deps/Cryptodome/Cipher/_mode_gcm.py
+++ b/frozen_deps/Cryptodome/Cipher/_mode_gcm.py
@@ -186,7 +186,7 @@ class GcmMode(object):
if len(nonce) == 0:
raise ValueError("Nonce cannot be empty")
-
+
if not is_buffer(nonce):
raise TypeError("Nonce must be bytes, bytearray or memoryview")
@@ -207,8 +207,8 @@ class GcmMode(object):
raise ValueError("Parameter 'mac_len' must be in the range 4..16")
# Allowed transitions after initialization
- self._next = [self.update, self.encrypt, self.decrypt,
- self.digest, self.verify]
+ self._next = ["update", "encrypt", "decrypt",
+ "digest", "verify"]
self._no_more_assoc_data = False
@@ -229,10 +229,10 @@ class GcmMode(object):
if len(self.nonce) == 12:
j0 = self.nonce + b"\x00\x00\x00\x01"
else:
- fill = (16 - (len(nonce) % 16)) % 16 + 8
+ fill = (16 - (len(self.nonce) % 16)) % 16 + 8
ghash_in = (self.nonce +
b'\x00' * fill +
- long_to_bytes(8 * len(nonce), 8))
+ 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
@@ -282,12 +282,12 @@ class GcmMode(object):
A piece of associated data. There are no restrictions on its size.
"""
- if self.update not in self._next:
+ if "update" not in self._next:
raise TypeError("update() can only be called"
" immediately after initialization")
- self._next = [self.update, self.encrypt, self.decrypt,
- self.digest, self.verify]
+ self._next = ["update", "encrypt", "decrypt",
+ "digest", "verify"]
self._update(assoc_data)
self._auth_len += len(assoc_data)
@@ -364,10 +364,10 @@ class GcmMode(object):
Otherwise, ``None``.
"""
- if self.encrypt not in self._next:
+ if "encrypt" not in self._next:
raise TypeError("encrypt() can only be called after"
" initialization or an update()")
- self._next = [self.encrypt, self.digest]
+ self._next = ["encrypt", "digest"]
ciphertext = self._cipher.encrypt(plaintext, output=output)
@@ -417,10 +417,10 @@ class GcmMode(object):
Otherwise, ``None``.
"""
- if self.decrypt not in self._next:
+ if "decrypt" not in self._next:
raise TypeError("decrypt() can only be called"
" after initialization or an update()")
- self._next = [self.decrypt, self.verify]
+ self._next = ["decrypt", "verify"]
if self._status == MacStatus.PROCESSING_AUTH_DATA:
self._pad_cache_and_update()
@@ -442,10 +442,10 @@ class GcmMode(object):
:Return: the MAC, as a byte string.
"""
- if self.digest not in self._next:
+ if "digest" not in self._next:
raise TypeError("digest() cannot be called when decrypting"
" or validating a message")
- self._next = [self.digest]
+ self._next = ["digest"]
return self._compute_mac()
@@ -492,10 +492,10 @@ class GcmMode(object):
or the key is incorrect.
"""
- if self.verify not in self._next:
+ if "verify" not in self._next:
raise TypeError("verify() cannot be called"
" when encrypting a message")
- self._next = [self.verify]
+ self._next = ["verify"]
secret = get_random_bytes(16)
diff --git a/frozen_deps/Cryptodome/Cipher/_mode_ocb.py b/frozen_deps/Cryptodome/Cipher/_mode_ocb.py
index 27c2797..1295e61 100644
--- a/frozen_deps/Cryptodome/Cipher/_mode_ocb.py
+++ b/frozen_deps/Cryptodome/Cipher/_mode_ocb.py
@@ -71,7 +71,7 @@ Example:
import struct
from binascii import unhexlify
-from Cryptodome.Util.py3compat import bord, _copy_bytes
+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
@@ -142,15 +142,22 @@ class OcbMode(object):
self._cache_P = b""
# Allowed transitions after initialization
- self._next = [self.update, self.encrypt, self.decrypt,
- self.digest, self.verify]
+ self._next = ["update", "encrypt", "decrypt",
+ "digest", "verify"]
# Compute Offset_0
params_without_key = dict(cipher_params)
key = params_without_key.pop("key")
- nonce = (struct.pack('B', self._mac_len << 4 & 0xFF) +
- b'\x00' * (14 - len(nonce)) +
- b'\x01' + self.nonce)
+
+ 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
@@ -217,12 +224,12 @@ class OcbMode(object):
A piece of associated data.
"""
- if self.update not in self._next:
+ if "update" not in self._next:
raise TypeError("update() can only be called"
" immediately after initialization")
- self._next = [self.encrypt, self.decrypt, self.digest,
- self.verify, self.update]
+ self._next = ["encrypt", "decrypt", "digest",
+ "verify", "update"]
if len(self._cache_A) > 0:
filler = min(16 - len(self._cache_A), len(assoc_data))
@@ -316,14 +323,14 @@ class OcbMode(object):
Its length may not match the length of the *plaintext*.
"""
- if self.encrypt not in self._next:
+ if "encrypt" not in self._next:
raise TypeError("encrypt() can only be called after"
" initialization or an update()")
if plaintext is None:
- self._next = [self.digest]
+ self._next = ["digest"]
else:
- self._next = [self.encrypt]
+ self._next = ["encrypt"]
return self._transcrypt(plaintext, _raw_ocb_lib.OCB_encrypt, "encrypt")
def decrypt(self, ciphertext=None):
@@ -345,14 +352,14 @@ class OcbMode(object):
Its length may not match the length of the *ciphertext*.
"""
- if self.decrypt not in self._next:
+ if "decrypt" not in self._next:
raise TypeError("decrypt() can only be called after"
" initialization or an update()")
if ciphertext is None:
- self._next = [self.verify]
+ self._next = ["verify"]
else:
- self._next = [self.decrypt]
+ self._next = ["decrypt"]
return self._transcrypt(ciphertext,
_raw_ocb_lib.OCB_decrypt,
"decrypt")
@@ -388,12 +395,12 @@ class OcbMode(object):
:Return: the MAC, as a byte string.
"""
- if self.digest not in self._next:
+ if "digest" not in self._next:
raise TypeError("digest() cannot be called now for this cipher")
assert(len(self._cache_P) == 0)
- self._next = [self.digest]
+ self._next = ["digest"]
if self._mac_tag is None:
self._compute_mac_tag()
@@ -423,12 +430,12 @@ class OcbMode(object):
or the key is incorrect.
"""
- if self.verify not in self._next:
+ if "verify" not in self._next:
raise TypeError("verify() cannot be called now for this cipher")
assert(len(self._cache_P) == 0)
- self._next = [self.verify]
+ self._next = ["verify"]
if self._mac_tag is None:
self._compute_mac_tag()
diff --git a/frozen_deps/Cryptodome/Cipher/_mode_ofb.py b/frozen_deps/Cryptodome/Cipher/_mode_ofb.py
index 04aaccf..8c0ccf6 100644
--- a/frozen_deps/Cryptodome/Cipher/_mode_ofb.py
+++ b/frozen_deps/Cryptodome/Cipher/_mode_ofb.py
@@ -116,7 +116,7 @@ class OfbMode(object):
self.IV = self.iv
"""Alias for `iv`"""
- self._next = [ self.encrypt, self.decrypt ]
+ self._next = ["encrypt", "decrypt"]
def encrypt(self, plaintext, output=None):
"""Encrypt data with the key and the parameters set at initialization.
@@ -151,18 +151,18 @@ class OfbMode(object):
Otherwise, ``None``.
"""
- if self.encrypt not in self._next:
+ if "encrypt" not in self._next:
raise TypeError("encrypt() cannot be called after decrypt()")
- self._next = [ self.encrypt ]
-
+ 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))
@@ -212,10 +212,10 @@ class OfbMode(object):
Otherwise, ``None``.
"""
- if self.decrypt not in self._next:
+ if "decrypt" not in self._next:
raise TypeError("decrypt() cannot be called after encrypt()")
- self._next = [ self.decrypt ]
-
+ self._next = ["decrypt"]
+
if output is None:
plaintext = create_string_buffer(len(ciphertext))
else:
@@ -223,7 +223,7 @@ class OfbMode(object):
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))
diff --git a/frozen_deps/Cryptodome/Cipher/_mode_siv.py b/frozen_deps/Cryptodome/Cipher/_mode_siv.py
index d10c4dc..4a76ad6 100644
--- a/frozen_deps/Cryptodome/Cipher/_mode_siv.py
+++ b/frozen_deps/Cryptodome/Cipher/_mode_siv.py
@@ -123,8 +123,8 @@ class SivMode(object):
factory.new(key[:subkey_size], factory.MODE_ECB, **kwargs)
# Allowed transitions after initialization
- self._next = [self.update, self.encrypt, self.decrypt,
- self.digest, self.verify]
+ self._next = ["update", "encrypt", "decrypt",
+ "digest", "verify"]
def _create_ctr_cipher(self, v):
"""Create a new CTR cipher from V in SIV mode"""
@@ -164,12 +164,12 @@ class SivMode(object):
The next associated data component.
"""
- if self.update not in self._next:
+ if "update" not in self._next:
raise TypeError("update() can only be called"
" immediately after initialization")
- self._next = [self.update, self.encrypt, self.decrypt,
- self.digest, self.verify]
+ self._next = ["update", "encrypt", "decrypt",
+ "digest", "verify"]
return self._kdf.update(component)
@@ -206,10 +206,10 @@ class SivMode(object):
:Return: the MAC, as a byte string.
"""
- if self.digest not in self._next:
+ if "digest" not in self._next:
raise TypeError("digest() cannot be called when decrypting"
" or validating a message")
- self._next = [self.digest]
+ self._next = ["digest"]
if self._mac_tag is None:
self._mac_tag = self._kdf.derive()
return self._mac_tag
@@ -240,10 +240,10 @@ class SivMode(object):
or the key is incorrect.
"""
- if self.verify not in self._next:
+ if "verify" not in self._next:
raise TypeError("verify() cannot be called"
" when encrypting a message")
- self._next = [self.verify]
+ self._next = ["verify"]
if self._mac_tag is None:
self._mac_tag = self._kdf.derive()
@@ -290,19 +290,19 @@ class SivMode(object):
The first item becomes ``None`` when the ``output`` parameter
specified a location for the result.
"""
-
- if self.encrypt not in self._next:
+
+ if "encrypt" not in self._next:
raise TypeError("encrypt() can only be called after"
" initialization or an update()")
- self._next = [ self.digest ]
+ 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
@@ -336,10 +336,10 @@ class SivMode(object):
or the key is incorrect.
"""
- if self.decrypt not in self._next:
+ if "decrypt" not in self._next:
raise TypeError("decrypt() can only be called"
" after initialization or an update()")
- self._next = [ self.verify ]
+ self._next = ["verify"]
# Take the MAC and start the cipher for decryption
self._cipher = self._create_ctr_cipher(mac_tag)
@@ -350,7 +350,7 @@ class SivMode(object):
self._kdf.update(self.nonce)
self._kdf.update(plaintext if output is None else output)
self.verify(mac_tag)
-
+
return plaintext
diff --git a/frozen_deps/Cryptodome/Cipher/_pkcs1_decode.abi3.so b/frozen_deps/Cryptodome/Cipher/_pkcs1_decode.abi3.so
index cbb4a6f..71cd311 100755
--- a/frozen_deps/Cryptodome/Cipher/_pkcs1_decode.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_pkcs1_decode.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_pkcs1_oaep_decode.py b/frozen_deps/Cryptodome/Cipher/_pkcs1_oaep_decode.py
new file mode 100644
index 0000000..82bdaa7
--- /dev/null
+++ b/frozen_deps/Cryptodome/Cipher/_pkcs1_oaep_decode.py
@@ -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
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_aes.abi3.so b/frozen_deps/Cryptodome/Cipher/_raw_aes.abi3.so
index 883fc94..b37dd95 100755
--- a/frozen_deps/Cryptodome/Cipher/_raw_aes.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_raw_aes.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_aes.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Cipher/_raw_aes.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 027ed17..0000000
--- a/frozen_deps/Cryptodome/Cipher/_raw_aes.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_aesni.abi3.so b/frozen_deps/Cryptodome/Cipher/_raw_aesni.abi3.so
index 8e971c8..5f08fe7 100755
--- a/frozen_deps/Cryptodome/Cipher/_raw_aesni.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_raw_aesni.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_aesni.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Cipher/_raw_aesni.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 1ec22d9..0000000
--- a/frozen_deps/Cryptodome/Cipher/_raw_aesni.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_arc2.abi3.so b/frozen_deps/Cryptodome/Cipher/_raw_arc2.abi3.so
index 2370b62..2287d2e 100755
--- a/frozen_deps/Cryptodome/Cipher/_raw_arc2.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_raw_arc2.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_arc2.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Cipher/_raw_arc2.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index d439cbc..0000000
--- a/frozen_deps/Cryptodome/Cipher/_raw_arc2.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_blowfish.abi3.so b/frozen_deps/Cryptodome/Cipher/_raw_blowfish.abi3.so
index 48af6a3..ad77ccb 100755
--- a/frozen_deps/Cryptodome/Cipher/_raw_blowfish.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_raw_blowfish.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_blowfish.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Cipher/_raw_blowfish.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 158eed5..0000000
--- a/frozen_deps/Cryptodome/Cipher/_raw_blowfish.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_cast.abi3.so b/frozen_deps/Cryptodome/Cipher/_raw_cast.abi3.so
index 7efb7e7..730e178 100755
--- a/frozen_deps/Cryptodome/Cipher/_raw_cast.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_raw_cast.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_cast.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Cipher/_raw_cast.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index f416c8d..0000000
--- a/frozen_deps/Cryptodome/Cipher/_raw_cast.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_cbc.abi3.so b/frozen_deps/Cryptodome/Cipher/_raw_cbc.abi3.so
index 0696380..847d824 100755
--- a/frozen_deps/Cryptodome/Cipher/_raw_cbc.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_raw_cbc.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_cbc.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Cipher/_raw_cbc.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index fd0fa43..0000000
--- a/frozen_deps/Cryptodome/Cipher/_raw_cbc.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_cfb.abi3.so b/frozen_deps/Cryptodome/Cipher/_raw_cfb.abi3.so
index 32d333a..2c9b852 100755
--- a/frozen_deps/Cryptodome/Cipher/_raw_cfb.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_raw_cfb.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_cfb.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Cipher/_raw_cfb.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 7bb29c0..0000000
--- a/frozen_deps/Cryptodome/Cipher/_raw_cfb.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_ctr.abi3.so b/frozen_deps/Cryptodome/Cipher/_raw_ctr.abi3.so
index 1810b56..761cd36 100755
--- a/frozen_deps/Cryptodome/Cipher/_raw_ctr.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_raw_ctr.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_ctr.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Cipher/_raw_ctr.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index f70ad97..0000000
--- a/frozen_deps/Cryptodome/Cipher/_raw_ctr.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_des.abi3.so b/frozen_deps/Cryptodome/Cipher/_raw_des.abi3.so
index 01a2495..7f1f824 100755
--- a/frozen_deps/Cryptodome/Cipher/_raw_des.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_raw_des.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_des.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Cipher/_raw_des.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 622e436..0000000
--- a/frozen_deps/Cryptodome/Cipher/_raw_des.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_des3.abi3.so b/frozen_deps/Cryptodome/Cipher/_raw_des3.abi3.so
index ec932c1..b475c52 100755
--- a/frozen_deps/Cryptodome/Cipher/_raw_des3.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_raw_des3.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_des3.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Cipher/_raw_des3.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index d1b6042..0000000
--- a/frozen_deps/Cryptodome/Cipher/_raw_des3.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_ecb.abi3.so b/frozen_deps/Cryptodome/Cipher/_raw_ecb.abi3.so
index 7dc6a67..91e8126 100755
--- a/frozen_deps/Cryptodome/Cipher/_raw_ecb.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_raw_ecb.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_ecb.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Cipher/_raw_ecb.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index be15667..0000000
--- a/frozen_deps/Cryptodome/Cipher/_raw_ecb.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_eksblowfish.abi3.so b/frozen_deps/Cryptodome/Cipher/_raw_eksblowfish.abi3.so
index 43734c9..c3c45d5 100755
--- a/frozen_deps/Cryptodome/Cipher/_raw_eksblowfish.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_raw_eksblowfish.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_eksblowfish.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Cipher/_raw_eksblowfish.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index c003ada..0000000
--- a/frozen_deps/Cryptodome/Cipher/_raw_eksblowfish.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_ocb.abi3.so b/frozen_deps/Cryptodome/Cipher/_raw_ocb.abi3.so
index 50e0016..9685971 100755
--- a/frozen_deps/Cryptodome/Cipher/_raw_ocb.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_raw_ocb.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_ocb.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Cipher/_raw_ocb.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index fa682a1..0000000
--- a/frozen_deps/Cryptodome/Cipher/_raw_ocb.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_ofb.abi3.so b/frozen_deps/Cryptodome/Cipher/_raw_ofb.abi3.so
index e0db6db..a4a629a 100755
--- a/frozen_deps/Cryptodome/Cipher/_raw_ofb.abi3.so
+++ b/frozen_deps/Cryptodome/Cipher/_raw_ofb.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Cipher/_raw_ofb.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Cipher/_raw_ofb.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 12b870c..0000000
--- a/frozen_deps/Cryptodome/Cipher/_raw_ofb.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/BLAKE2b.py b/frozen_deps/Cryptodome/Hash/BLAKE2b.py
index d7e968f..85da887 100644
--- a/frozen_deps/Cryptodome/Hash/BLAKE2b.py
+++ b/frozen_deps/Cryptodome/Hash/BLAKE2b.py
@@ -233,13 +233,13 @@ def new(**kwargs):
raise ValueError("'digest_bytes' not in range 1..64")
else:
if not (8 <= digest_bits <= 512) or (digest_bits % 8):
- raise ValueError("'digest_bytes' not in range 8..512, "
+ 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("BLAKE2s key cannot exceed 64 bytes")
+ raise ValueError("BLAKE2b key cannot exceed 64 bytes")
if kwargs:
raise TypeError("Unknown parameters: " + str(kwargs))
diff --git a/frozen_deps/Cryptodome/Hash/BLAKE2s.py b/frozen_deps/Cryptodome/Hash/BLAKE2s.py
index a16b515..43be5c4 100644
--- a/frozen_deps/Cryptodome/Hash/BLAKE2s.py
+++ b/frozen_deps/Cryptodome/Hash/BLAKE2s.py
@@ -233,7 +233,7 @@ def new(**kwargs):
raise ValueError("'digest_bytes' not in range 1..32")
else:
if not (8 <= digest_bits <= 256) or (digest_bits % 8):
- raise ValueError("'digest_bytes' not in range 8..256, "
+ raise ValueError("'digest_bits' not in range 8..256, "
"with steps of 8")
digest_bytes = digest_bits // 8
diff --git a/frozen_deps/Cryptodome/Hash/CMAC.py b/frozen_deps/Cryptodome/Hash/CMAC.py
index e831700..8feb79f 100644
--- a/frozen_deps/Cryptodome/Hash/CMAC.py
+++ b/frozen_deps/Cryptodome/Hash/CMAC.py
@@ -242,11 +242,15 @@ class CMAC(object):
raise ValueError("MAC check failed")
def hexverify(self, hex_mac_tag):
- """Return the **printable** MAC tag of the message authenticated so far.
+ """Verify that a given **printable** MAC (computed by another party)
+ is valid.
- :return: The MAC tag, computed over the data processed so far.
- Hexadecimal encoded.
- :rtype: string
+ 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)))
diff --git a/frozen_deps/Cryptodome/Hash/HMAC.py b/frozen_deps/Cryptodome/Hash/HMAC.py
index 165dd83..615056a 100644
--- a/frozen_deps/Cryptodome/Hash/HMAC.py
+++ b/frozen_deps/Cryptodome/Hash/HMAC.py
@@ -35,13 +35,28 @@ from Cryptodome.Util.py3compat import bord, tobytes
from binascii import unhexlify
-from Cryptodome.Hash import MD5
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.
@@ -49,11 +64,15 @@ class HMAC(object):
: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:
@@ -64,6 +83,12 @@ class HMAC(object):
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()
diff --git a/frozen_deps/Cryptodome/Hash/KangarooTwelve.py b/frozen_deps/Cryptodome/Hash/KangarooTwelve.py
index 44d935f..60ced57 100644
--- a/frozen_deps/Cryptodome/Hash/KangarooTwelve.py
+++ b/frozen_deps/Cryptodome/Hash/KangarooTwelve.py
@@ -28,16 +28,10 @@
# POSSIBILITY OF SUCH DAMAGE.
# ===================================================================
-from Cryptodome.Util._raw_api import (VoidPointer, SmartPointer,
- create_string_buffer,
- get_raw_buffer, c_size_t,
- c_uint8_ptr, c_ubyte)
-
from Cryptodome.Util.number import long_to_bytes
from Cryptodome.Util.py3compat import bchr
-from .keccak import _raw_keccak_lib
-
+from . import TurboSHAKE128
def _length_encode(x):
if x == 0:
@@ -70,7 +64,8 @@ class K12_XOF(object):
self._padding = None # Final padding is only decided in read()
# Internal hash that consumes FinalNode
- self._hash1 = self._create_keccak()
+ # 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)
@@ -83,42 +78,6 @@ class K12_XOF(object):
if data:
self.update(data)
- def _create_keccak(self):
- state = VoidPointer()
- result = _raw_keccak_lib.keccak_init(state.address_of(),
- c_size_t(32), # 32 bytes of capacity (256 bits)
- c_ubyte(12)) # Reduced number of rounds
- if result:
- raise ValueError("Error %d while instantiating KangarooTwelve"
- % result)
- return SmartPointer(state.get(), _raw_keccak_lib.keccak_destroy)
-
- def _update(self, data, hash_obj):
- result = _raw_keccak_lib.keccak_absorb(hash_obj.get(),
- c_uint8_ptr(data),
- c_size_t(len(data)))
- if result:
- raise ValueError("Error %d while updating KangarooTwelve state"
- % result)
-
- def _squeeze(self, hash_obj, length, padding):
- bfr = create_string_buffer(length)
- result = _raw_keccak_lib.keccak_squeeze(hash_obj.get(),
- bfr,
- c_size_t(length),
- c_ubyte(padding))
- if result:
- raise ValueError("Error %d while extracting from KangarooTwelve"
- % result)
-
- return get_raw_buffer(bfr)
-
- def _reset(self, hash_obj):
- result = _raw_keccak_lib.keccak_reset(hash_obj.get())
- if result:
- raise ValueError("Error %d while resetting KangarooTwelve state"
- % result)
-
def update(self, data):
"""Hash the next piece of data.
@@ -127,7 +86,7 @@ class K12_XOF(object):
Args:
data (byte string/byte array/memoryview): The next chunk of the
- message to hash.
+ message to hash.
"""
if self._state == SQUEEZING:
@@ -138,7 +97,7 @@ class K12_XOF(object):
if next_length + len(self._custom) <= 8192:
self._length1 = next_length
- self._update(data, self._hash1)
+ self._hash1.update(data)
return self
# Switch to tree hashing
@@ -148,7 +107,7 @@ class K12_XOF(object):
data_mem = memoryview(data)
assert(self._length1 < 8192)
dtc = min(len(data), 8192 - self._length1)
- self._update(data_mem[:dtc], self._hash1)
+ self._hash1.update(data_mem[:dtc])
self._length1 += dtc
if self._length1 < 8192:
@@ -158,10 +117,10 @@ class K12_XOF(object):
assert(self._length1 == 8192)
divider = b'\x03' + b'\x00' * 7
- self._update(divider, self._hash1)
+ self._hash1.update(divider)
self._length1 += 8
- self._hash2 = self._create_keccak()
+ self._hash2 = TurboSHAKE128.new(domain=0x0B)
self._length2 = 0
self._ctr = 1
@@ -178,15 +137,15 @@ class K12_XOF(object):
while index < len_data:
new_index = min(index + 8192 - self._length2, len_data)
- self._update(data_mem[index:new_index], self._hash2)
+ self._hash2.update(data_mem[index:new_index])
self._length2 += new_index - index
index = new_index
if self._length2 == 8192:
- cv_i = self._squeeze(self._hash2, 32, 0x0B)
- self._update(cv_i, self._hash1)
+ cv_i = self._hash2.read(32)
+ self._hash1.update(cv_i)
self._length1 += 32
- self._reset(self._hash2)
+ self._hash2._reset()
self._length2 = 0
self._ctr += 1
@@ -210,7 +169,7 @@ class K12_XOF(object):
custom_was_consumed = False
if self._state == SHORT_MSG:
- self._update(self._custom, self._hash1)
+ self._hash1.update(self._custom)
self._padding = 0x07
self._state = SQUEEZING
@@ -225,20 +184,21 @@ class K12_XOF(object):
# Is there still some leftover data in hash2?
if self._length2 > 0:
- cv_i = self._squeeze(self._hash2, 32, 0x0B)
- self._update(cv_i, self._hash1)
+ cv_i = self._hash2.read(32)
+ self._hash1.update(cv_i)
self._length1 += 32
- self._reset(self._hash2)
+ self._hash2._reset()
self._length2 = 0
self._ctr += 1
trailer = _length_encode(self._ctr - 1) + b'\xFF\xFF'
- self._update(trailer, self._hash1)
+ self._hash1.update(trailer)
self._padding = 0x06
self._state = SQUEEZING
- return self._squeeze(self._hash1, length, self._padding)
+ self._hash1._domain = self._padding
+ return self._hash1.read(length)
def new(self, data=None, custom=b''):
return type(self)(data, custom)
diff --git a/frozen_deps/Cryptodome/Hash/TupleHash128.py b/frozen_deps/Cryptodome/Hash/TupleHash128.py
index 5c910e4..49aeccc 100644
--- a/frozen_deps/Cryptodome/Hash/TupleHash128.py
+++ b/frozen_deps/Cryptodome/Hash/TupleHash128.py
@@ -47,20 +47,21 @@ class TupleHash(object):
self._cshake = cshake._new(b'', custom, b'TupleHash')
self._digest = None
- def update(self, data):
- """Authenticate the next byte string in the tuple.
+ def update(self, *data):
+ """Authenticate the next tuple of byte strings.
+ TupleHash guarantees the logical separation between each byte string.
Args:
- data (bytes/bytearray/memoryview): The next byte string.
+ data (bytes/bytearray/memoryview): One or more items to hash.
"""
if self._digest is not None:
raise TypeError("You cannot call 'update' after 'digest' or 'hexdigest'")
- if not is_bytes(data):
- raise TypeError("You can only call 'update' on bytes")
-
- self._cshake.update(_encode_str(tobytes(data)))
+ for item in data:
+ if not is_bytes(item):
+ raise TypeError("You can only call 'update' on bytes" )
+ self._cshake.update(_encode_str(item))
return self
@@ -132,7 +133,4 @@ def new(**kwargs):
custom = kwargs.pop("custom", b'')
- if kwargs:
- raise TypeError("Unknown parameters: " + str(kwargs))
-
return TupleHash(custom, cSHAKE128, digest_bytes)
diff --git a/frozen_deps/Cryptodome/Hash/TupleHash128.pyi b/frozen_deps/Cryptodome/Hash/TupleHash128.pyi
index 3b1e81e..2e0ea83 100644
--- a/frozen_deps/Cryptodome/Hash/TupleHash128.pyi
+++ b/frozen_deps/Cryptodome/Hash/TupleHash128.pyi
@@ -1,4 +1,4 @@
-from typing import Any, Union
+from typing import Any, Union, List, Tuple
from types import ModuleType
Buffer = Union[bytes, bytearray, memoryview]
@@ -9,7 +9,7 @@ class TupleHash(object):
custom: bytes,
cshake: ModuleType,
digest_size: int) -> None: ...
- def update(self, data: Buffer) -> TupleHash: ...
+ def update(self, *data: Buffer) -> TupleHash: ...
def digest(self) -> bytes: ...
def hexdigest(self) -> str: ...
def new(self,
diff --git a/frozen_deps/Cryptodome/Hash/TupleHash256.py b/frozen_deps/Cryptodome/Hash/TupleHash256.py
index 9b4fba0..40a824a 100644
--- a/frozen_deps/Cryptodome/Hash/TupleHash256.py
+++ b/frozen_deps/Cryptodome/Hash/TupleHash256.py
@@ -67,7 +67,4 @@ def new(**kwargs):
custom = kwargs.pop("custom", b'')
- if kwargs:
- raise TypeError("Unknown parameters: " + str(kwargs))
-
return TupleHash(custom, cSHAKE256, digest_bytes)
diff --git a/frozen_deps/Cryptodome/Hash/TurboSHAKE128.py b/frozen_deps/Cryptodome/Hash/TurboSHAKE128.py
new file mode 100644
index 0000000..92ac59e
--- /dev/null
+++ b/frozen_deps/Cryptodome/Hash/TurboSHAKE128.py
@@ -0,0 +1,112 @@
+from Cryptodome.Util._raw_api import (VoidPointer, SmartPointer,
+ create_string_buffer,
+ get_raw_buffer, c_size_t,
+ c_uint8_ptr, c_ubyte)
+
+from Cryptodome.Util.number import long_to_bytes
+from Cryptodome.Util.py3compat import bchr
+
+from .keccak import _raw_keccak_lib
+
+
+class TurboSHAKE(object):
+ """A TurboSHAKE hash object.
+ Do not instantiate directly.
+ Use the :func:`new` function.
+ """
+
+ def __init__(self, capacity, domain_separation, data):
+
+ state = VoidPointer()
+ result = _raw_keccak_lib.keccak_init(state.address_of(),
+ c_size_t(capacity),
+ c_ubyte(12)) # Reduced number of rounds
+ if result:
+ raise ValueError("Error %d while instantiating TurboSHAKE"
+ % result)
+ self._state = SmartPointer(state.get(), _raw_keccak_lib.keccak_destroy)
+
+ self._is_squeezing = False
+ self._capacity = capacity
+ self._domain = domain_separation
+
+ 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._is_squeezing:
+ raise TypeError("You cannot call 'update' after the first 'read'")
+
+ result = _raw_keccak_lib.keccak_absorb(self._state.get(),
+ c_uint8_ptr(data),
+ c_size_t(len(data)))
+ if result:
+ raise ValueError("Error %d while updating TurboSHAKE state"
+ % result)
+ return self
+
+ def read(self, length):
+ """
+ Compute the next piece of XOF output.
+
+ .. 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
+ """
+
+ self._is_squeezing = True
+ bfr = create_string_buffer(length)
+ result = _raw_keccak_lib.keccak_squeeze(self._state.get(),
+ bfr,
+ c_size_t(length),
+ c_ubyte(self._domain))
+ if result:
+ raise ValueError("Error %d while extracting from TurboSHAKE"
+ % result)
+
+ return get_raw_buffer(bfr)
+
+ def new(self, data=None):
+ return type(self)(self._capacity, self._domain, data)
+
+ def _reset(self):
+ result = _raw_keccak_lib.keccak_reset(self._state.get())
+ if result:
+ raise ValueError("Error %d while resetting TurboSHAKE state"
+ % result)
+ self._is_squeezing = False
+
+
+def new(**kwargs):
+ """Create a new TurboSHAKE128 object.
+
+ Args:
+ domain (integer):
+ Optional - A domain separation byte, between 0x01 and 0x7F.
+ The default value is 0x1F.
+ data (bytes/bytearray/memoryview):
+ Optional - The very first chunk of the message to hash.
+ It is equivalent to an early call to :meth:`update`.
+
+ :Return: A :class:`TurboSHAKE` object
+ """
+
+ domain_separation = kwargs.get('domain', 0x1F)
+ if not (0x01 <= domain_separation <= 0x7F):
+ raise ValueError("Incorrect domain separation value (%d)" %
+ domain_separation)
+ data = kwargs.get('data')
+ return TurboSHAKE(32, domain_separation, data=data)
diff --git a/frozen_deps/Cryptodome/Hash/TurboSHAKE128.pyi b/frozen_deps/Cryptodome/Hash/TurboSHAKE128.pyi
new file mode 100644
index 0000000..d74c9c0
--- /dev/null
+++ b/frozen_deps/Cryptodome/Hash/TurboSHAKE128.pyi
@@ -0,0 +1,17 @@
+from typing import Union, Optional
+from typing_extensions import TypedDict, Unpack, NotRequired
+
+Buffer = Union[bytes, bytearray, memoryview]
+
+class TurboSHAKE(object):
+
+ def __init__(self, capacity: int, domain_separation: int, data: Union[Buffer, None]) -> None: ...
+ def update(self, data: Buffer) -> TurboSHAKE : ...
+ def read(self, length: int) -> bytes: ...
+ def new(self, data: Optional[Buffer]=None) -> TurboSHAKE: ...
+
+class Args(TypedDict):
+ domain: NotRequired[int]
+ data: NotRequired[Buffer]
+
+def new(**kwargs: Unpack[Args]) -> TurboSHAKE: ...
diff --git a/frozen_deps/Cryptodome/Hash/TurboSHAKE256.py b/frozen_deps/Cryptodome/Hash/TurboSHAKE256.py
new file mode 100644
index 0000000..ce27a48
--- /dev/null
+++ b/frozen_deps/Cryptodome/Hash/TurboSHAKE256.py
@@ -0,0 +1,22 @@
+from .TurboSHAKE128 import TurboSHAKE
+
+def new(**kwargs):
+ """Create a new TurboSHAKE256 object.
+
+ Args:
+ domain (integer):
+ Optional - A domain separation byte, between 0x01 and 0x7F.
+ The default value is 0x1F.
+ data (bytes/bytearray/memoryview):
+ Optional - The very first chunk of the message to hash.
+ It is equivalent to an early call to :meth:`update`.
+
+ :Return: A :class:`TurboSHAKE` object
+ """
+
+ domain_separation = kwargs.get('domain', 0x1F)
+ if not (0x01 <= domain_separation <= 0x7F):
+ raise ValueError("Incorrect domain separation value (%d)" %
+ domain_separation)
+ data = kwargs.get('data')
+ return TurboSHAKE(64, domain_separation, data=data)
diff --git a/frozen_deps/Cryptodome/Hash/TurboSHAKE256.pyi b/frozen_deps/Cryptodome/Hash/TurboSHAKE256.pyi
new file mode 100644
index 0000000..561e946
--- /dev/null
+++ b/frozen_deps/Cryptodome/Hash/TurboSHAKE256.pyi
@@ -0,0 +1,12 @@
+from typing import Union
+from typing_extensions import TypedDict, Unpack, NotRequired
+
+from .TurboSHAKE128 import TurboSHAKE
+
+Buffer = Union[bytes, bytearray, memoryview]
+
+class Args(TypedDict):
+ domain: NotRequired[int]
+ data: NotRequired[Buffer]
+
+def new(**kwargs: Unpack[Args]) -> TurboSHAKE: ...
diff --git a/frozen_deps/Cryptodome/Hash/_BLAKE2b.abi3.so b/frozen_deps/Cryptodome/Hash/_BLAKE2b.abi3.so
index dfdf331..40cf664 100755
--- a/frozen_deps/Cryptodome/Hash/_BLAKE2b.abi3.so
+++ b/frozen_deps/Cryptodome/Hash/_BLAKE2b.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_BLAKE2b.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Hash/_BLAKE2b.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 7338d66..0000000
--- a/frozen_deps/Cryptodome/Hash/_BLAKE2b.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_BLAKE2s.abi3.so b/frozen_deps/Cryptodome/Hash/_BLAKE2s.abi3.so
index 26e69e8..04a1ace 100755
--- a/frozen_deps/Cryptodome/Hash/_BLAKE2s.abi3.so
+++ b/frozen_deps/Cryptodome/Hash/_BLAKE2s.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_BLAKE2s.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Hash/_BLAKE2s.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index db4ebde..0000000
--- a/frozen_deps/Cryptodome/Hash/_BLAKE2s.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_MD2.abi3.so b/frozen_deps/Cryptodome/Hash/_MD2.abi3.so
index 576ba1e..1573ca3 100755
--- a/frozen_deps/Cryptodome/Hash/_MD2.abi3.so
+++ b/frozen_deps/Cryptodome/Hash/_MD2.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_MD2.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Hash/_MD2.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index e56703c..0000000
--- a/frozen_deps/Cryptodome/Hash/_MD2.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_MD4.abi3.so b/frozen_deps/Cryptodome/Hash/_MD4.abi3.so
index 0afc5ca..8f41e31 100755
--- a/frozen_deps/Cryptodome/Hash/_MD4.abi3.so
+++ b/frozen_deps/Cryptodome/Hash/_MD4.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_MD4.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Hash/_MD4.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index fbf60b8..0000000
--- a/frozen_deps/Cryptodome/Hash/_MD4.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_MD5.abi3.so b/frozen_deps/Cryptodome/Hash/_MD5.abi3.so
index 38caf8d..b22cf36 100755
--- a/frozen_deps/Cryptodome/Hash/_MD5.abi3.so
+++ b/frozen_deps/Cryptodome/Hash/_MD5.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_MD5.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Hash/_MD5.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index dbe7d60..0000000
--- a/frozen_deps/Cryptodome/Hash/_MD5.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_RIPEMD160.abi3.so b/frozen_deps/Cryptodome/Hash/_RIPEMD160.abi3.so
index 2c02e71..78faa00 100755
--- a/frozen_deps/Cryptodome/Hash/_RIPEMD160.abi3.so
+++ b/frozen_deps/Cryptodome/Hash/_RIPEMD160.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_RIPEMD160.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Hash/_RIPEMD160.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 6d3560a..0000000
--- a/frozen_deps/Cryptodome/Hash/_RIPEMD160.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_SHA1.abi3.so b/frozen_deps/Cryptodome/Hash/_SHA1.abi3.so
index 2d86b06..acd08ad 100755
--- a/frozen_deps/Cryptodome/Hash/_SHA1.abi3.so
+++ b/frozen_deps/Cryptodome/Hash/_SHA1.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_SHA1.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Hash/_SHA1.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 49b0829..0000000
--- a/frozen_deps/Cryptodome/Hash/_SHA1.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_SHA224.abi3.so b/frozen_deps/Cryptodome/Hash/_SHA224.abi3.so
index c462c9b..9cf3ef6 100755
--- a/frozen_deps/Cryptodome/Hash/_SHA224.abi3.so
+++ b/frozen_deps/Cryptodome/Hash/_SHA224.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_SHA224.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Hash/_SHA224.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index ebaa441..0000000
--- a/frozen_deps/Cryptodome/Hash/_SHA224.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_SHA256.abi3.so b/frozen_deps/Cryptodome/Hash/_SHA256.abi3.so
index c51c162..6dffb17 100755
--- a/frozen_deps/Cryptodome/Hash/_SHA256.abi3.so
+++ b/frozen_deps/Cryptodome/Hash/_SHA256.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_SHA256.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Hash/_SHA256.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index af2b809..0000000
--- a/frozen_deps/Cryptodome/Hash/_SHA256.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_SHA384.abi3.so b/frozen_deps/Cryptodome/Hash/_SHA384.abi3.so
index 4a4237e..7c72fd0 100755
--- a/frozen_deps/Cryptodome/Hash/_SHA384.abi3.so
+++ b/frozen_deps/Cryptodome/Hash/_SHA384.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_SHA384.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Hash/_SHA384.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index ae78f57..0000000
--- a/frozen_deps/Cryptodome/Hash/_SHA384.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_SHA512.abi3.so b/frozen_deps/Cryptodome/Hash/_SHA512.abi3.so
index ff9a01f..058653c 100755
--- a/frozen_deps/Cryptodome/Hash/_SHA512.abi3.so
+++ b/frozen_deps/Cryptodome/Hash/_SHA512.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_SHA512.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Hash/_SHA512.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 4565097..0000000
--- a/frozen_deps/Cryptodome/Hash/_SHA512.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/__init__.py b/frozen_deps/Cryptodome/Hash/__init__.py
index 4bda084..80446e4 100644
--- a/frozen_deps/Cryptodome/Hash/__init__.py
+++ b/frozen_deps/Cryptodome/Hash/__init__.py
@@ -19,6 +19,51 @@
# ===================================================================
__all__ = ['HMAC', 'MD2', 'MD4', 'MD5', 'RIPEMD160', 'SHA1',
- 'SHA224', 'SHA256', 'SHA384', 'SHA512', 'CMAC', 'Poly1305',
+ 'SHA224', 'SHA256', 'SHA384', 'SHA512',
+ 'SHA3_224', 'SHA3_256', 'SHA3_384', 'SHA3_512',
+ 'CMAC', 'Poly1305',
'cSHAKE128', 'cSHAKE256', 'KMAC128', 'KMAC256',
- 'TupleHash128', 'TupleHash256', 'KangarooTwelve']
+ 'TupleHash128', 'TupleHash256', 'KangarooTwelve',
+ 'TurboSHAKE128', 'TurboSHAKE256']
+
+def new(name):
+ """Return a new hash instance, based on its name or
+ on its ASN.1 Object ID"""
+
+ name = name.upper()
+ if name in ("1.3.14.3.2.26", "SHA1", "SHA-1"):
+ from . import SHA1
+ return SHA1.new()
+ if name in ("2.16.840.1.101.3.4.2.4", "SHA224", "SHA-224"):
+ from . import SHA224
+ return SHA224.new()
+ if name in ("2.16.840.1.101.3.4.2.1", "SHA256", "SHA-256"):
+ from . import SHA256
+ return SHA256.new()
+ if name in ("2.16.840.1.101.3.4.2.2", "SHA384", "SHA-384"):
+ from . import SHA384
+ return SHA384.new()
+ if name in ("2.16.840.1.101.3.4.2.3", "SHA512", "SHA-512"):
+ from . import SHA512
+ return SHA512.new()
+ if name in ("2.16.840.1.101.3.4.2.5", "SHA512-224", "SHA-512-224"):
+ from . import SHA512
+ return SHA512.new(truncate='224')
+ if name in ("2.16.840.1.101.3.4.2.6", "SHA512-256", "SHA-512-256"):
+ from . import SHA512
+ return SHA512.new(truncate='256')
+ if name in ("2.16.840.1.101.3.4.2.7", "SHA3-224", "SHA-3-224"):
+ from . import SHA3_224
+ return SHA3_224.new()
+ if name in ("2.16.840.1.101.3.4.2.8", "SHA3-256", "SHA-3-256"):
+ from . import SHA3_256
+ return SHA3_256.new()
+ if name in ("2.16.840.1.101.3.4.2.9", "SHA3-384", "SHA-3-384"):
+ from . import SHA3_384
+ return SHA3_384.new()
+ if name in ("2.16.840.1.101.3.4.2.10", "SHA3-512", "SHA-3-512"):
+ from . import SHA3_512
+ return SHA3_512.new()
+ else:
+ raise ValueError("Unknown hash %s" % str(name))
+
diff --git a/frozen_deps/Cryptodome/Hash/__init__.pyi b/frozen_deps/Cryptodome/Hash/__init__.pyi
index e69de29..b072157 100644
--- a/frozen_deps/Cryptodome/Hash/__init__.pyi
+++ b/frozen_deps/Cryptodome/Hash/__init__.pyi
@@ -0,0 +1,57 @@
+from typing import overload
+from typing_extensions import Literal
+
+from Cryptodome.Hash.SHA1 import SHA1Hash
+from Cryptodome.Hash.SHA224 import SHA224Hash
+from Cryptodome.Hash.SHA256 import SHA256Hash
+from Cryptodome.Hash.SHA384 import SHA384Hash
+from Cryptodome.Hash.SHA512 import SHA512Hash
+from Cryptodome.Hash.SHA3_224 import SHA3_224_Hash
+from Cryptodome.Hash.SHA3_256 import SHA3_256_Hash
+from Cryptodome.Hash.SHA3_384 import SHA3_384_Hash
+from Cryptodome.Hash.SHA3_512 import SHA3_512_Hash
+
+@overload
+def new(name: Literal["1.3.14.3.2.26"]) -> SHA1Hash: ...
+@overload
+def new(name: Literal["SHA1"]) -> SHA1Hash: ...
+@overload
+def new(name: Literal["2.16.840.1.101.3.4.2.4"]) -> SHA224Hash: ...
+@overload
+def new(name: Literal["SHA224"]) -> SHA224Hash: ...
+@overload
+def new(name: Literal["2.16.840.1.101.3.4.2.1"]) -> SHA256Hash: ...
+@overload
+def new(name: Literal["SHA256"]) -> SHA256Hash: ...
+@overload
+def new(name: Literal["2.16.840.1.101.3.4.2.2"]) -> SHA384Hash: ...
+@overload
+def new(name: Literal["SHA384"]) -> SHA384Hash: ...
+@overload
+def new(name: Literal["2.16.840.1.101.3.4.2.3"]) -> SHA512Hash: ...
+@overload
+def new(name: Literal["SHA512"]) -> SHA512Hash: ...
+@overload
+def new(name: Literal["2.16.840.1.101.3.4.2.5"]) -> SHA512Hash: ...
+@overload
+def new(name: Literal["SHA512-224"]) -> SHA512Hash: ...
+@overload
+def new(name: Literal["2.16.840.1.101.3.4.2.6"]) -> SHA512Hash: ...
+@overload
+def new(name: Literal["SHA512-256"]) -> SHA512Hash: ...
+@overload
+def new(name: Literal["2.16.840.1.101.3.4.2.7"]) -> SHA3_224_Hash: ...
+@overload
+def new(name: Literal["SHA3-224"]) -> SHA3_224_Hash: ...
+@overload
+def new(name: Literal["2.16.840.1.101.3.4.2.8"]) -> SHA3_256_Hash: ...
+@overload
+def new(name: Literal["SHA3-256"]) -> SHA3_256_Hash: ...
+@overload
+def new(name: Literal["2.16.840.1.101.3.4.2.9"]) -> SHA3_384_Hash: ...
+@overload
+def new(name: Literal["SHA3-384"]) -> SHA3_384_Hash: ...
+@overload
+def new(name: Literal["2.16.840.1.101.3.4.2.10"]) -> SHA3_512_Hash: ...
+@overload
+def new(name: Literal["SHA3-512"]) -> SHA3_512_Hash: ...
diff --git a/frozen_deps/Cryptodome/Hash/_ghash_clmul.abi3.so b/frozen_deps/Cryptodome/Hash/_ghash_clmul.abi3.so
index 248bdb7..d13832c 100755
--- a/frozen_deps/Cryptodome/Hash/_ghash_clmul.abi3.so
+++ b/frozen_deps/Cryptodome/Hash/_ghash_clmul.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_ghash_clmul.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Hash/_ghash_clmul.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 74005c5..0000000
--- a/frozen_deps/Cryptodome/Hash/_ghash_clmul.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_ghash_portable.abi3.so b/frozen_deps/Cryptodome/Hash/_ghash_portable.abi3.so
index 292f45d..555c6fc 100755
--- a/frozen_deps/Cryptodome/Hash/_ghash_portable.abi3.so
+++ b/frozen_deps/Cryptodome/Hash/_ghash_portable.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_ghash_portable.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Hash/_ghash_portable.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index dbed009..0000000
--- a/frozen_deps/Cryptodome/Hash/_ghash_portable.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_keccak.abi3.so b/frozen_deps/Cryptodome/Hash/_keccak.abi3.so
index b251995..4e494b0 100755
--- a/frozen_deps/Cryptodome/Hash/_keccak.abi3.so
+++ b/frozen_deps/Cryptodome/Hash/_keccak.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_keccak.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Hash/_keccak.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index f4e20c7..0000000
--- a/frozen_deps/Cryptodome/Hash/_keccak.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_poly1305.abi3.so b/frozen_deps/Cryptodome/Hash/_poly1305.abi3.so
index e8da59e..901b8c2 100755
--- a/frozen_deps/Cryptodome/Hash/_poly1305.abi3.so
+++ b/frozen_deps/Cryptodome/Hash/_poly1305.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/_poly1305.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Hash/_poly1305.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 99ca9c3..0000000
--- a/frozen_deps/Cryptodome/Hash/_poly1305.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Hash/cSHAKE128.py b/frozen_deps/Cryptodome/Hash/cSHAKE128.py
index 7c2f30a..064b3d6 100644
--- a/frozen_deps/Cryptodome/Hash/cSHAKE128.py
+++ b/frozen_deps/Cryptodome/Hash/cSHAKE128.py
@@ -28,7 +28,7 @@
# POSSIBILITY OF SUCH DAMAGE.
# ===================================================================
-from Cryptodome.Util.py3compat import bchr
+from Cryptodome.Util.py3compat import bchr, concat_buffers
from Cryptodome.Util._raw_api import (VoidPointer, SmartPointer,
create_string_buffer,
@@ -69,13 +69,13 @@ def _encode_str(x):
if bitlen >= (1 << 2040):
raise ValueError("String too large to encode in cSHAKE")
- return _left_encode(bitlen) + x
+ return concat_buffers(_left_encode(bitlen), x)
def _bytepad(x, length):
"""Zero pad byte string as defined in NIST SP 800-185"""
- to_pad = _left_encode(length) + x
+ to_pad = concat_buffers(_left_encode(length), x)
# Note: this implementation works with byte aligned strings,
# hence no additional bit padding is needed at this point.
diff --git a/frozen_deps/Cryptodome/IO/PKCS8.py b/frozen_deps/Cryptodome/IO/PKCS8.py
index d02aed9..3041545 100644
--- a/frozen_deps/Cryptodome/IO/PKCS8.py
+++ b/frozen_deps/Cryptodome/IO/PKCS8.py
@@ -53,44 +53,29 @@ def wrap(private_key, key_oid, passphrase=None, protection=None,
Args:
- private_key (byte string):
+ private_key (bytes):
The private key encoded in binary form. The actual encoding is
algorithm specific. In most cases, it is DER.
key_oid (string):
The object identifier (OID) of the private key to wrap.
- It is a dotted string, like ``1.2.840.113549.1.1.1`` (for RSA keys).
+ It is a dotted string, like ``'1.2.840.113549.1.1.1'`` (for RSA keys)
+ or ``'1.2.840.10045.2.1'`` (for ECC keys).
- passphrase (bytes string or string):
+ Keyword Args:
+
+ passphrase (bytes or string):
The secret passphrase from which the wrapping key is derived.
Set it only if encryption is required.
protection (string):
The identifier of the algorithm to use for securely wrapping the key.
- The default value is ``PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC``.
+ Refer to :ref:`the encryption parameters<enc_params>` .
+ The default value is ``'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC'``.
prot_params (dictionary):
- Parameters for the protection algorithm.
-
- +------------------+-----------------------------------------------+
- | Key | Description |
- +==================+===============================================+
- | iteration_count | The KDF algorithm is repeated several times to|
- | | slow down brute force attacks on passwords |
- | | (called *N* or CPU/memory cost in scrypt). |
- | | The default value for PBKDF2 is 1000. |
- | | The default value for scrypt is 16384. |
- +------------------+-----------------------------------------------+
- | salt_size | Salt is used to thwart dictionary and rainbow |
- | | attacks on passwords. The default value is 8 |
- | | bytes. |
- +------------------+-----------------------------------------------+
- | block_size | *(scrypt only)* Memory-cost (r). The default |
- | | value is 8. |
- +------------------+-----------------------------------------------+
- | parallelization | *(scrypt only)* CPU-cost (p). The default |
- | | value is 1. |
- +------------------+-----------------------------------------------+
+ Parameters for the key derivation function (KDF).
+ Refer to :ref:`the encryption parameters<enc_params>` .
key_params (DER object or None):
The ``parameters`` field to use in the ``AlgorithmIdentifier``
@@ -103,8 +88,8 @@ def wrap(private_key, key_oid, passphrase=None, protection=None,
If not specified, a new RNG will be instantiated
from :mod:`Cryptodome.Random`.
- Return:
- The PKCS#8-wrapped private key (possibly encrypted), as a byte string.
+ Returns:
+ bytes: The PKCS#8-wrapped private key (possibly encrypted).
"""
#
@@ -145,8 +130,10 @@ def unwrap(p8_private_key, passphrase=None):
"""Unwrap a private key from a PKCS#8 blob (clear or encrypted).
Args:
- p8_private_key (byte string):
- The private key wrapped into a PKCS#8 blob, DER encoded.
+ p8_private_key (bytes):
+ The private key wrapped into a PKCS#8 container, DER encoded.
+
+ Keyword Args:
passphrase (byte string or string):
The passphrase to use to decrypt the blob (if it is encrypted).
@@ -154,8 +141,8 @@ def unwrap(p8_private_key, passphrase=None):
A tuple containing
#. the algorithm identifier of the wrapped key (OID, dotted string)
- #. the private key (byte string, DER encoded)
- #. the associated parameters (byte string, DER encoded) or ``None``
+ #. the private key (bytes, DER encoded)
+ #. the associated parameters (bytes, DER encoded) or ``None``
Raises:
ValueError : if decoding fails
diff --git a/frozen_deps/Cryptodome/IO/PKCS8.pyi b/frozen_deps/Cryptodome/IO/PKCS8.pyi
index be716af..c8d0c10 100644
--- a/frozen_deps/Cryptodome/IO/PKCS8.pyi
+++ b/frozen_deps/Cryptodome/IO/PKCS8.pyi
@@ -1,14 +1,17 @@
-from typing import Dict, Tuple, Optional, Union, Callable
+from typing import Tuple, Optional, Union, Callable
+from typing_extensions import NotRequired
from Cryptodome.Util.asn1 import DerObject
+from Cryptodome.IO._PBES import ProtParams
+
def wrap(private_key: bytes,
key_oid: str,
- passphrase: Union[bytes, str] = ...,
- protection: str = ...,
- prot_params: Dict = ...,
- key_params: Optional[DerObject] = ...,
- randfunc: Optional[Callable[[int],str]] = ...) -> bytes: ...
+ passphrase: Union[bytes, str] = ...,
+ protection: str = ...,
+ prot_params: Optional[ProtParams] = ...,
+ key_params: Optional[DerObject] = ...,
+ randfunc: Optional[Callable[[int], str]] = ...) -> bytes: ...
def unwrap(p8_private_key: bytes, passphrase: Optional[Union[bytes, str]] = ...) -> Tuple[str, bytes, Optional[bytes]]: ...
diff --git a/frozen_deps/Cryptodome/IO/_PBES.py b/frozen_deps/Cryptodome/IO/_PBES.py
index 9ee5385..75d8cde 100644
--- a/frozen_deps/Cryptodome/IO/_PBES.py
+++ b/frozen_deps/Cryptodome/IO/_PBES.py
@@ -31,15 +31,17 @@
# POSSIBILITY OF SUCH DAMAGE.
# ===================================================================
+import re
+
+from Cryptodome import Hash
from Cryptodome import Random
from Cryptodome.Util.asn1 import (
DerSequence, DerOctetString,
DerObjectId, DerInteger,
)
+from Cryptodome.Cipher import AES
from Cryptodome.Util.Padding import pad, unpad
-from Cryptodome.Hash import MD5, SHA1, SHA224, SHA256, SHA384, SHA512
-from Cryptodome.Cipher import DES, ARC2, DES3, AES
from Cryptodome.Protocol.KDF import PBKDF1, PBKDF2, scrypt
_OID_PBE_WITH_MD5_AND_DES_CBC = "1.2.840.113549.1.5.3"
@@ -53,16 +55,14 @@ _OID_PBKDF2 = "1.2.840.113549.1.5.12"
_OID_SCRYPT = "1.3.6.1.4.1.11591.4.11"
_OID_HMAC_SHA1 = "1.2.840.113549.2.7"
-_OID_HMAC_SHA224 = "1.2.840.113549.2.8"
-_OID_HMAC_SHA256 = "1.2.840.113549.2.9"
-_OID_HMAC_SHA384 = "1.2.840.113549.2.10"
-_OID_HMAC_SHA512 = "1.2.840.113549.2.11"
_OID_DES_EDE3_CBC = "1.2.840.113549.3.7"
_OID_AES128_CBC = "2.16.840.1.101.3.4.1.2"
_OID_AES192_CBC = "2.16.840.1.101.3.4.1.22"
_OID_AES256_CBC = "2.16.840.1.101.3.4.1.42"
-
+_OID_AES128_GCM = "2.16.840.1.101.3.4.1.6"
+_OID_AES192_GCM = "2.16.840.1.101.3.4.1.26"
+_OID_AES256_GCM = "2.16.840.1.101.3.4.1.46"
class PbesError(ValueError):
pass
@@ -103,6 +103,16 @@ class PbesError(ValueError):
# prf AlgorithmIdentifier {{PBKDF2-PRFs}} DEFAULT algid-hmacWithSHA1
# }
#
+# PBKDF2-PRFs ALGORITHM-IDENTIFIER ::= {
+# {NULL IDENTIFIED BY id-hmacWithSHA1},
+# {NULL IDENTIFIED BY id-hmacWithSHA224},
+# {NULL IDENTIFIED BY id-hmacWithSHA256},
+# {NULL IDENTIFIED BY id-hmacWithSHA384},
+# {NULL IDENTIFIED BY id-hmacWithSHA512},
+# {NULL IDENTIFIED BY id-hmacWithSHA512-224},
+# {NULL IDENTIFIED BY id-hmacWithSHA512-256},
+# ...
+# }
# scrypt-params ::= SEQUENCE {
# salt OCTET STRING,
# costParameter INTEGER (1..MAX),
@@ -111,6 +121,7 @@ class PbesError(ValueError):
# keyLength INTEGER (1..MAX) OPTIONAL
# }
+
class PBES1(object):
"""Deprecated encryption scheme with password-based key derivation
(originally defined in PKCS#5 v1.5, but still present in `v2.0`__).
@@ -141,21 +152,29 @@ class PBES1(object):
cipher_params = {}
if pbe_oid == _OID_PBE_WITH_MD5_AND_DES_CBC:
# PBE_MD5_DES_CBC
+ from Cryptodome.Hash import MD5
+ from Cryptodome.Cipher import DES
hashmod = MD5
- ciphermod = DES
+ module = DES
elif pbe_oid == _OID_PBE_WITH_MD5_AND_RC2_CBC:
# PBE_MD5_RC2_CBC
+ from Cryptodome.Hash import MD5
+ from Cryptodome.Cipher import ARC2
hashmod = MD5
- ciphermod = ARC2
+ module = ARC2
cipher_params['effective_keylen'] = 64
elif pbe_oid == _OID_PBE_WITH_SHA1_AND_DES_CBC:
# PBE_SHA1_DES_CBC
+ from Cryptodome.Hash import SHA1
+ from Cryptodome.Cipher import DES
hashmod = SHA1
- ciphermod = DES
+ module = DES
elif pbe_oid == _OID_PBE_WITH_SHA1_AND_RC2_CBC:
# PBE_SHA1_RC2_CBC
+ from Cryptodome.Hash import SHA1
+ from Cryptodome.Cipher import ARC2
hashmod = SHA1
- ciphermod = ARC2
+ module = ARC2
cipher_params['effective_keylen'] = 64
else:
raise PbesError("Unknown OID for PBES1")
@@ -167,7 +186,7 @@ class PBES1(object):
key_iv = PBKDF1(passphrase, salt, 16, iterations, hashmod)
key, iv = key_iv[:8], key_iv[8:]
- cipher = ciphermod.new(key, ciphermod.MODE_CBC, iv, **cipher_params)
+ cipher = module.new(key, module.MODE_CBC, iv, **cipher_params)
pt = cipher.decrypt(encrypted_data)
return unpad(pt, cipher.block_size)
@@ -231,49 +250,103 @@ class PBES2(object):
if randfunc is None:
randfunc = Random.new().read
- if protection == 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC':
+ pattern = re.compile(r'^(PBKDF2WithHMAC-([0-9A-Z-]+)|scrypt)And([0-9A-Z-]+)$')
+ res = pattern.match(protection)
+ if res is None:
+ raise ValueError("Unknown protection %s" % protection)
+
+ if protection.startswith("PBKDF"):
+ pbkdf = "pbkdf2"
+ pbkdf2_hmac_algo = res.group(2)
+ enc_algo = res.group(3)
+ else:
+ pbkdf = "scrypt"
+ enc_algo = res.group(3)
+
+ aead = False
+ if enc_algo == 'DES-EDE3-CBC':
+ from Cryptodome.Cipher import DES3
key_size = 24
module = DES3
cipher_mode = DES3.MODE_CBC
enc_oid = _OID_DES_EDE3_CBC
- elif protection in ('PBKDF2WithHMAC-SHA1AndAES128-CBC',
- 'scryptAndAES128-CBC'):
+ enc_param = {'iv': randfunc(8)}
+ elif enc_algo == 'AES128-CBC':
key_size = 16
module = AES
cipher_mode = AES.MODE_CBC
enc_oid = _OID_AES128_CBC
- elif protection in ('PBKDF2WithHMAC-SHA1AndAES192-CBC',
- 'scryptAndAES192-CBC'):
+ enc_param = {'iv': randfunc(16)}
+ elif enc_algo == 'AES192-CBC':
key_size = 24
module = AES
cipher_mode = AES.MODE_CBC
enc_oid = _OID_AES192_CBC
- elif protection in ('PBKDF2WithHMAC-SHA1AndAES256-CBC',
- 'scryptAndAES256-CBC'):
+ enc_param = {'iv': randfunc(16)}
+ elif enc_algo == 'AES256-CBC':
key_size = 32
module = AES
cipher_mode = AES.MODE_CBC
enc_oid = _OID_AES256_CBC
+ enc_param = {'iv': randfunc(16)}
+ elif enc_algo == 'AES128-GCM':
+ key_size = 16
+ module = AES
+ cipher_mode = AES.MODE_GCM
+ enc_oid = _OID_AES128_GCM
+ enc_param = {'nonce': randfunc(12)}
+ aead = True
+ elif enc_algo == 'AES192-GCM':
+ key_size = 24
+ module = AES
+ cipher_mode = AES.MODE_GCM
+ enc_oid = _OID_AES192_GCM
+ enc_param = {'nonce': randfunc(12)}
+ aead = True
+ elif enc_algo == 'AES256-GCM':
+ key_size = 32
+ module = AES
+ cipher_mode = AES.MODE_GCM
+ enc_oid = _OID_AES256_GCM
+ enc_param = {'nonce': randfunc(12)}
+ aead = True
else:
- raise ValueError("Unknown PBES2 mode")
+ raise ValueError("Unknown encryption mode '%s'" % enc_algo)
- # Get random data
- iv = randfunc(module.block_size)
+ iv_nonce = list(enc_param.values())[0]
salt = randfunc(prot_params.get("salt_size", 8))
# Derive key from password
- if protection.startswith('PBKDF2'):
+ if pbkdf == 'pbkdf2':
+
count = prot_params.get("iteration_count", 1000)
- key = PBKDF2(passphrase, salt, key_size, count)
+ digestmod = Hash.new(pbkdf2_hmac_algo)
+
+ key = PBKDF2(passphrase,
+ salt,
+ key_size,
+ count,
+ hmac_hash_module=digestmod)
+
+ pbkdf2_params = DerSequence([
+ DerOctetString(salt),
+ DerInteger(count)
+ ])
+
+ if pbkdf2_hmac_algo != 'SHA1':
+ try:
+ hmac_oid = Hash.HMAC.new(b'', digestmod=digestmod).oid
+ except KeyError:
+ raise ValueError("No OID for HMAC hash algorithm")
+ pbkdf2_params.append(DerSequence([DerObjectId(hmac_oid)]))
+
kdf_info = DerSequence([
DerObjectId(_OID_PBKDF2), # PBKDF2
- DerSequence([
- DerOctetString(salt),
- DerInteger(count)
- ])
+ pbkdf2_params
])
- else:
- # It must be scrypt
+
+ elif pbkdf == 'scrypt':
+
count = prot_params.get("iteration_count", 16384)
scrypt_r = prot_params.get('block_size', 8)
scrypt_p = prot_params.get('parallelization', 1)
@@ -289,12 +362,19 @@ class PBES2(object):
])
])
+ else:
+ raise ValueError("Unknown KDF " + res.group(1))
+
# Create cipher and use it
- cipher = module.new(key, cipher_mode, iv)
- encrypted_data = cipher.encrypt(pad(data, cipher.block_size))
+ cipher = module.new(key, cipher_mode, **enc_param)
+ if aead:
+ ct, tag = cipher.encrypt_and_digest(data)
+ encrypted_data = ct + tag
+ else:
+ encrypted_data = cipher.encrypt(pad(data, cipher.block_size))
enc_info = DerSequence([
DerObjectId(enc_oid),
- DerOctetString(iv)
+ DerOctetString(iv_nonce)
])
# Result
@@ -336,7 +416,7 @@ class PBES2(object):
pbes2_params = DerSequence().decode(enc_algo[1], nr_elements=2)
- ### Key Derivation Function selection
+ # Key Derivation Function selection
kdf_info = DerSequence().decode(pbes2_params[0], nr_elements=2)
kdf_oid = DerObjectId().decode(kdf_info[0]).value
@@ -354,14 +434,16 @@ class PBES2(object):
if left > 0:
try:
+ # Check if it's an INTEGER
kdf_key_length = pbkdf2_params[idx] - 0
left -= 1
idx += 1
except TypeError:
+ # keyLength is not present
pass
# Default is HMAC-SHA1
- pbkdf2_prf_oid = "1.2.840.113549.2.7"
+ pbkdf2_prf_oid = _OID_HMAC_SHA1
if left > 0:
pbkdf2_prf_algo_id = DerSequence().decode(pbkdf2_params[idx])
pbkdf2_prf_oid = DerObjectId().decode(pbkdf2_prf_algo_id[0]).value
@@ -379,57 +461,86 @@ class PBES2(object):
else:
raise PbesError("Unsupported PBES2 KDF")
- ### Cipher selection
+ # Cipher selection
enc_info = DerSequence().decode(pbes2_params[1])
enc_oid = DerObjectId().decode(enc_info[0]).value
+ aead = False
if enc_oid == _OID_DES_EDE3_CBC:
# DES_EDE3_CBC
- ciphermod = DES3
+ from Cryptodome.Cipher import DES3
+ module = DES3
+ cipher_mode = DES3.MODE_CBC
key_size = 24
+ cipher_param = 'iv'
elif enc_oid == _OID_AES128_CBC:
- # AES128_CBC
- ciphermod = AES
+ module = AES
+ cipher_mode = AES.MODE_CBC
key_size = 16
+ cipher_param = 'iv'
elif enc_oid == _OID_AES192_CBC:
- # AES192_CBC
- ciphermod = AES
+ module = AES
+ cipher_mode = AES.MODE_CBC
key_size = 24
+ cipher_param = 'iv'
elif enc_oid == _OID_AES256_CBC:
- # AES256_CBC
- ciphermod = AES
+ module = AES
+ cipher_mode = AES.MODE_CBC
+ key_size = 32
+ cipher_param = 'iv'
+ elif enc_oid == _OID_AES128_GCM:
+ module = AES
+ cipher_mode = AES.MODE_GCM
+ key_size = 16
+ cipher_param = 'nonce'
+ aead = True
+ elif enc_oid == _OID_AES192_GCM:
+ module = AES
+ cipher_mode = AES.MODE_GCM
+ key_size = 24
+ cipher_param = 'nonce'
+ aead = True
+ elif enc_oid == _OID_AES256_GCM:
+ module = AES
+ cipher_mode = AES.MODE_GCM
key_size = 32
+ cipher_param = 'nonce'
+ aead = True
else:
- raise PbesError("Unsupported PBES2 cipher")
+ raise PbesError("Unsupported PBES2 cipher " + enc_algo)
if kdf_key_length and kdf_key_length != key_size:
raise PbesError("Mismatch between PBES2 KDF parameters"
" and selected cipher")
- IV = DerOctetString().decode(enc_info[1]).payload
+ iv_nonce = DerOctetString().decode(enc_info[1]).payload
# Create cipher
if kdf_oid == _OID_PBKDF2:
- if pbkdf2_prf_oid == _OID_HMAC_SHA1:
- hmac_hash_module = SHA1
- elif pbkdf2_prf_oid == _OID_HMAC_SHA224:
- hmac_hash_module = SHA224
- elif pbkdf2_prf_oid == _OID_HMAC_SHA256:
- hmac_hash_module = SHA256
- elif pbkdf2_prf_oid == _OID_HMAC_SHA384:
- hmac_hash_module = SHA384
- elif pbkdf2_prf_oid == _OID_HMAC_SHA512:
- hmac_hash_module = SHA512
- else:
+
+ try:
+ hmac_hash_module_oid = Hash.HMAC._hmac2hash_oid[pbkdf2_prf_oid]
+ except KeyError:
raise PbesError("Unsupported HMAC %s" % pbkdf2_prf_oid)
+ hmac_hash_module = Hash.new(hmac_hash_module_oid)
key = PBKDF2(passphrase, salt, key_size, iteration_count,
hmac_hash_module=hmac_hash_module)
else:
key = scrypt(passphrase, salt, key_size, iteration_count,
scrypt_r, scrypt_p)
- cipher = ciphermod.new(key, ciphermod.MODE_CBC, IV)
+ cipher = module.new(key, cipher_mode, **{cipher_param:iv_nonce})
# Decrypt data
- pt = cipher.decrypt(encrypted_data)
- return unpad(pt, cipher.block_size)
+ if len(encrypted_data) < cipher.block_size:
+ raise ValueError("Too little data to decrypt")
+
+ if aead:
+ tag_len = cipher.block_size
+ pt = cipher.decrypt_and_verify(encrypted_data[:-tag_len],
+ encrypted_data[-tag_len:])
+ else:
+ pt_padded = cipher.decrypt(encrypted_data)
+ pt = unpad(pt_padded, cipher.block_size)
+
+ return pt
diff --git a/frozen_deps/Cryptodome/IO/_PBES.pyi b/frozen_deps/Cryptodome/IO/_PBES.pyi
index a8a34ce..0673364 100644
--- a/frozen_deps/Cryptodome/IO/_PBES.pyi
+++ b/frozen_deps/Cryptodome/IO/_PBES.pyi
@@ -1,4 +1,5 @@
-from typing import Dict, Optional, Callable
+from typing import Optional, Callable, TypedDict
+from typing_extensions import NotRequired
class PbesError(ValueError):
...
@@ -7,13 +8,19 @@ class PBES1(object):
@staticmethod
def decrypt(data: bytes, passphrase: bytes) -> bytes: ...
+class ProtParams(TypedDict):
+ iteration_count: NotRequired[int]
+ salt_size: NotRequired[int]
+ block_size: NotRequired[int]
+ parallelization: NotRequired[int]
+
class PBES2(object):
@staticmethod
def encrypt(data: bytes,
passphrase: bytes,
- protection: str,
- prot_params: Optional[Dict] = ...,
- randfunc: Optional[Callable[[int],bytes]] = ...) -> bytes: ...
+ protection: str,
+ prot_params: Optional[ProtParams] = ...,
+ randfunc: Optional[Callable[[int],bytes]] = ...) -> bytes: ...
@staticmethod
def decrypt(data:bytes, passphrase: bytes) -> bytes: ...
diff --git a/frozen_deps/Cryptodome/Math/Numbers.pyi b/frozen_deps/Cryptodome/Math/Numbers.pyi
index 2285a3b..b0206ca 100644
--- a/frozen_deps/Cryptodome/Math/Numbers.pyi
+++ b/frozen_deps/Cryptodome/Math/Numbers.pyi
@@ -1,4 +1,2 @@
-from Cryptodome.Math._IntegerBase import IntegerBase
-
-class Integer(IntegerBase):
- pass
+from Cryptodome.Math._IntegerBase import IntegerBase as Integer
+__all__ = ['Integer']
diff --git a/frozen_deps/Cryptodome/Math/_IntegerBase.py b/frozen_deps/Cryptodome/Math/_IntegerBase.py
index 7d78c4b..03dd591 100644
--- a/frozen_deps/Cryptodome/Math/_IntegerBase.py
+++ b/frozen_deps/Cryptodome/Math/_IntegerBase.py
@@ -390,3 +390,23 @@ class IntegerBase(ABC):
)
return norm_candidate + min_inclusive
+ @staticmethod
+ @abc.abstractmethod
+ def _mult_modulo_bytes(term1, term2, modulus):
+ """Multiply two integers, take the modulo, and encode as big endian.
+ This specialized method is used for RSA decryption.
+
+ Args:
+ term1 : integer
+ The first term of the multiplication, non-negative.
+ term2 : integer
+ The second term of the multiplication, non-negative.
+ modulus: integer
+ The modulus, a positive odd number.
+ :Returns:
+ A byte string, with the result of the modular multiplication
+ encoded in big endian mode.
+ It is as long as the modulus would be, with zero padding
+ on the left if needed.
+ """
+ pass
diff --git a/frozen_deps/Cryptodome/Math/_IntegerBase.pyi b/frozen_deps/Cryptodome/Math/_IntegerBase.pyi
index 362c512..ea23532 100644
--- a/frozen_deps/Cryptodome/Math/_IntegerBase.pyi
+++ b/frozen_deps/Cryptodome/Math/_IntegerBase.pyi
@@ -4,6 +4,8 @@ RandFunc = Callable[[int],int]
class IntegerBase:
+ def __init__(self, value: Union[IntegerBase, int]): ...
+
def __int__(self) -> int: ...
def __str__(self) -> str: ...
def __repr__(self) -> str: ...
@@ -58,4 +60,8 @@ class IntegerBase:
def random(cls, **kwargs: Union[int,RandFunc]) -> IntegerBase : ...
@classmethod
def random_range(cls, **kwargs: Union[int,RandFunc]) -> IntegerBase : ...
+ @staticmethod
+ def _mult_modulo_bytes(term1: Union[IntegerBase, int],
+ term2: Union[IntegerBase, int],
+ modulus: Union[IntegerBase, int]) -> bytes: ...
diff --git a/frozen_deps/Cryptodome/Math/_IntegerCustom.py b/frozen_deps/Cryptodome/Math/_IntegerCustom.py
index 0e23152..20eadca 100644
--- a/frozen_deps/Cryptodome/Math/_IntegerCustom.py
+++ b/frozen_deps/Cryptodome/Math/_IntegerCustom.py
@@ -41,12 +41,18 @@ from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib,
from Cryptodome.Random.random import getrandbits
c_defs = """
-int monty_pow(const uint8_t *base,
- const uint8_t *exp,
- const uint8_t *modulus,
- uint8_t *out,
- size_t len,
- uint64_t seed);
+int monty_pow(uint8_t *out,
+ const uint8_t *base,
+ const uint8_t *exp,
+ const uint8_t *modulus,
+ size_t len,
+ uint64_t seed);
+
+int monty_multiply(uint8_t *out,
+ const uint8_t *term1,
+ const uint8_t *term2,
+ const uint8_t *modulus,
+ size_t len);
"""
@@ -116,3 +122,41 @@ class IntegerCustom(IntegerNative):
result = bytes_to_long(get_raw_buffer(out))
self._value = result
return self
+
+ @staticmethod
+ def _mult_modulo_bytes(term1, term2, modulus):
+
+ # With modular reduction
+ mod_value = int(modulus)
+ if mod_value < 0:
+ raise ValueError("Modulus must be positive")
+ if mod_value == 0:
+ raise ZeroDivisionError("Modulus cannot be zero")
+
+ # C extension only works with odd moduli
+ if (mod_value & 1) == 0:
+ raise ValueError("Odd modulus is required")
+
+ # C extension only works with non-negative terms smaller than modulus
+ if term1 >= mod_value or term1 < 0:
+ term1 %= mod_value
+ if term2 >= mod_value or term2 < 0:
+ term2 %= mod_value
+
+ modulus_b = long_to_bytes(mod_value)
+ numbers_len = len(modulus_b)
+ term1_b = long_to_bytes(term1, numbers_len)
+ term2_b = long_to_bytes(term2, numbers_len)
+ out = create_string_buffer(numbers_len)
+
+ error = _raw_montgomery.monty_multiply(
+ out,
+ term1_b,
+ term2_b,
+ modulus_b,
+ c_size_t(numbers_len)
+ )
+ if error:
+ raise ValueError("monty_multiply failed with error: %d" % error)
+
+ return get_raw_buffer(out)
diff --git a/frozen_deps/Cryptodome/Math/_IntegerGMP.py b/frozen_deps/Cryptodome/Math/_IntegerGMP.py
index 3ab7c59..f58f044 100644
--- a/frozen_deps/Cryptodome/Math/_IntegerGMP.py
+++ b/frozen_deps/Cryptodome/Math/_IntegerGMP.py
@@ -749,6 +749,26 @@ class IntegerGMP(IntegerBase):
raise ValueError("n must be positive odd for the Jacobi symbol")
return _gmp.mpz_jacobi(a._mpz_p, n._mpz_p)
+ @staticmethod
+ def _mult_modulo_bytes(term1, term2, modulus):
+ if not isinstance(term1, IntegerGMP):
+ term1 = IntegerGMP(term1)
+ if not isinstance(term2, IntegerGMP):
+ term2 = IntegerGMP(term2)
+ if not isinstance(modulus, IntegerGMP):
+ modulus = IntegerGMP(modulus)
+
+ if modulus < 0:
+ raise ValueError("Modulus must be positive")
+ if modulus == 0:
+ raise ZeroDivisionError("Modulus cannot be zero")
+ if (modulus & 1) == 0:
+ raise ValueError("Odd modulus is required")
+
+ numbers_len = len(modulus.to_bytes())
+ result = ((term1 * term2) % modulus).to_bytes(numbers_len)
+ return result
+
# Clean-up
def __del__(self):
diff --git a/frozen_deps/Cryptodome/Math/_IntegerNative.py b/frozen_deps/Cryptodome/Math/_IntegerNative.py
index 9b857ea..5f768e2 100644
--- a/frozen_deps/Cryptodome/Math/_IntegerNative.py
+++ b/frozen_deps/Cryptodome/Math/_IntegerNative.py
@@ -30,7 +30,7 @@
from ._IntegerBase import IntegerBase
-from Cryptodome.Util.number import long_to_bytes, bytes_to_long
+from Cryptodome.Util.number import long_to_bytes, bytes_to_long, inverse, GCD
class IntegerNative(IntegerBase):
@@ -280,13 +280,7 @@ class IntegerNative(IntegerBase):
if self._value == 0:
return 1
- bit_size = 0
- tmp = self._value
- while tmp:
- tmp >>= 1
- bit_size += 1
-
- return bit_size
+ return self._value.bit_length()
def size_in_bytes(self):
return (self.size_in_bits() - 1) // 8 + 1
@@ -318,22 +312,7 @@ class IntegerNative(IntegerBase):
self._value = int(source)
def inplace_inverse(self, modulus):
- modulus = int(modulus)
- if modulus == 0:
- raise ZeroDivisionError("Modulus cannot be zero")
- if modulus < 0:
- raise ValueError("Modulus cannot be negative")
- r_p, r_n = self._value, modulus
- s_p, s_n = 1, 0
- while r_n > 0:
- q = r_p // r_n
- r_p, r_n = r_n, r_p - q * r_n
- s_p, s_n = s_n, s_p - q * s_n
- if r_p != 1:
- raise ValueError("No inverse value can be computed" + str(r_p))
- while s_p < 0:
- s_p += modulus
- self._value = s_p
+ self._value = inverse(self._value, int(modulus))
return self
def inverse(self, modulus):
@@ -342,11 +321,7 @@ class IntegerNative(IntegerBase):
return result
def gcd(self, term):
- r_p, r_n = abs(self._value), abs(int(term))
- while r_n > 0:
- q = r_p // r_n
- r_p, r_n = r_n, r_p - q * r_n
- return self.__class__(r_p)
+ return self.__class__(GCD(abs(self._value), abs(int(term))))
def lcm(self, term):
term = int(term)
@@ -393,3 +368,15 @@ class IntegerNative(IntegerBase):
n1 = n % a1
# Step 8
return s * IntegerNative.jacobi_symbol(n1, a1)
+
+ @staticmethod
+ def _mult_modulo_bytes(term1, term2, modulus):
+ if modulus < 0:
+ raise ValueError("Modulus must be positive")
+ if modulus == 0:
+ raise ZeroDivisionError("Modulus cannot be zero")
+ if (modulus & 1) == 0:
+ raise ValueError("Odd modulus is required")
+
+ number_len = len(long_to_bytes(modulus))
+ return long_to_bytes((term1 * term2) % modulus, number_len)
diff --git a/frozen_deps/Cryptodome/Math/_modexp.abi3.so b/frozen_deps/Cryptodome/Math/_modexp.abi3.so
index 3e0e3b2..d11de72 100755
--- a/frozen_deps/Cryptodome/Math/_modexp.abi3.so
+++ b/frozen_deps/Cryptodome/Math/_modexp.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Math/_modexp.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Math/_modexp.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index bb3667e..0000000
--- a/frozen_deps/Cryptodome/Math/_modexp.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Protocol/DH.py b/frozen_deps/Cryptodome/Protocol/DH.py
new file mode 100644
index 0000000..bb174f0
--- /dev/null
+++ b/frozen_deps/Cryptodome/Protocol/DH.py
@@ -0,0 +1,101 @@
+from Cryptodome.Util.number import long_to_bytes
+from Cryptodome.PublicKey.ECC import EccKey
+
+
+def _compute_ecdh(key_priv, key_pub):
+ # See Section 5.7.1.2 in NIST SP 800-56Ar3
+ pointP = key_pub.pointQ * key_priv.d
+ if pointP.is_point_at_infinity():
+ raise ValueError("Invalid ECDH point")
+ z = long_to_bytes(pointP.x, pointP.size_in_bytes())
+ return z
+
+
+def key_agreement(**kwargs):
+ """Perform a Diffie-Hellman key agreement.
+
+ Keywords:
+ kdf (callable):
+ A key derivation function that accepts ``bytes`` as input and returns
+ ``bytes``.
+ static_priv (EccKey):
+ The local static private key. Optional.
+ static_pub (EccKey):
+ The static public key that belongs to the peer. Optional.
+ eph_priv (EccKey):
+ The local ephemeral private key, generated for this session. Optional.
+ eph_pub (EccKey):
+ The ephemeral public key, received from the peer for this session. Optional.
+
+ At least two keys must be passed, of which one is a private key and one
+ a public key.
+
+ Returns (bytes):
+ The derived secret key material.
+ """
+
+ static_priv = kwargs.get('static_priv', None)
+ static_pub = kwargs.get('static_pub', None)
+ eph_priv = kwargs.get('eph_priv', None)
+ eph_pub = kwargs.get('eph_pub', None)
+ kdf = kwargs.get('kdf', None)
+
+ if kdf is None:
+ raise ValueError("'kdf' is mandatory")
+
+ count_priv = 0
+ count_pub = 0
+ curve = None
+
+ def check_curve(curve, key, name, private):
+ if not isinstance(key, EccKey):
+ raise TypeError("'%s' must be an ECC key" % name)
+ if private and not key.has_private():
+ raise TypeError("'%s' must be a private ECC key" % name)
+ if curve is None:
+ curve = key.curve
+ elif curve != key.curve:
+ raise TypeError("'%s' is defined on an incompatible curve" % name)
+ return curve
+
+ if static_priv is not None:
+ curve = check_curve(curve, static_priv, 'static_priv', True)
+ count_priv += 1
+
+ if static_pub is not None:
+ curve = check_curve(curve, static_pub, 'static_pub', False)
+ count_pub += 1
+
+ if eph_priv is not None:
+ curve = check_curve(curve, eph_priv, 'eph_priv', True)
+ count_priv += 1
+
+ if eph_pub is not None:
+ curve = check_curve(curve, eph_pub, 'eph_pub', False)
+ count_pub += 1
+
+ if (count_priv + count_pub) < 2 or count_priv == 0 or count_pub == 0:
+ raise ValueError("Too few keys for the ECDH key agreement")
+
+ Zs = b''
+ Ze = b''
+
+ if static_priv and static_pub:
+ # C(*, 2s)
+ Zs = _compute_ecdh(static_priv, static_pub)
+
+ if eph_priv and eph_pub:
+ # C(2e, 0s) or C(2e, 2s)
+ if bool(static_priv) != bool(static_pub):
+ raise ValueError("DH mode C(2e, 1s) is not supported")
+ Ze = _compute_ecdh(eph_priv, eph_pub)
+ elif eph_priv and static_pub:
+ # C(1e, 2s) or C(1e, 1s)
+ Ze = _compute_ecdh(eph_priv, static_pub)
+ elif eph_pub and static_priv:
+ # C(1e, 2s) or C(1e, 1s)
+ Ze = _compute_ecdh(static_priv, eph_pub)
+
+ Z = Ze + Zs
+
+ return kdf(Z)
diff --git a/frozen_deps/Cryptodome/Protocol/DH.pyi b/frozen_deps/Cryptodome/Protocol/DH.pyi
new file mode 100644
index 0000000..b1da888
--- /dev/null
+++ b/frozen_deps/Cryptodome/Protocol/DH.pyi
@@ -0,0 +1,15 @@
+from typing import TypedDict, Callable, TypeVar, Generic
+from typing_extensions import Unpack, NotRequired
+
+from Cryptodome.PublicKey.ECC import EccKey
+
+T = TypeVar('T')
+
+class RequestParams(TypedDict, Generic[T]):
+ kdf: Callable[[bytes|bytearray|memoryview], T]
+ static_priv: NotRequired[EccKey]
+ static_pub: NotRequired[EccKey]
+ eph_priv: NotRequired[EccKey]
+ eph_pub: NotRequired[EccKey]
+
+def key_agreement(**kwargs: Unpack[RequestParams[T]]) -> T: ...
diff --git a/frozen_deps/Cryptodome/Protocol/KDF.py b/frozen_deps/Cryptodome/Protocol/KDF.py
index 4baa276..b6d747e 100644
--- a/frozen_deps/Cryptodome/Protocol/KDF.py
+++ b/frozen_deps/Cryptodome/Protocol/KDF.py
@@ -27,7 +27,7 @@ import struct
from functools import reduce
from Cryptodome.Util.py3compat import (tobytes, bord, _copy_bytes, iter_range,
- tostr, bchr, bstr)
+ tostr, bchr, bstr)
from Cryptodome.Hash import SHA1, SHA256, HMAC, CMAC, BLAKE2s
from Cryptodome.Util.strxor import strxor
@@ -103,10 +103,16 @@ def PBKDF2(password, salt, dkLen=16, count=1000, prf=None, hmac_hash_module=None
Args:
password (string or byte string):
The secret password to generate the key from.
+
+ Strings will be encoded as ISO 8859-1 (also known as Latin-1),
+ which does not allow any characters with codepoints > 255.
salt (string or byte string):
A (byte) string to use for better protection from dictionary attacks.
This value does not need to be kept secret, but it should be randomly
chosen for each derivation. It is recommended to use at least 16 bytes.
+
+ Strings will be encoded as ISO 8859-1 (also known as Latin-1),
+ which does not allow any characters with codepoints > 255.
dkLen (integer):
The cumulative length of the keys to produce.
@@ -201,10 +207,10 @@ class _S2V(object):
self._key = _copy_bytes(None, None, key)
self._ciphermod = ciphermod
self._last_string = self._cache = b'\x00' * ciphermod.block_size
-
+
# Max number of update() call we can process
self._n_updates = ciphermod.block_size * 8 - 1
-
+
if cipher_params is None:
self._cipher_params = {}
else:
@@ -281,13 +287,13 @@ def HKDF(master, key_len, salt, hashmod, num_keys=1, context=None):
The unguessable value used by the KDF to generate the other keys.
It must be a high-entropy secret, though not necessarily uniform.
It must not be a password.
+ key_len (integer):
+ The length in bytes of every derived key.
salt (byte string):
A non-secret, reusable value that strengthens the randomness
extraction step.
Ideally, it is as long as the digest size of the chosen hash.
If empty, a string of zeroes in used.
- key_len (integer):
- The length in bytes of every derived key.
hashmod (module):
A cryptographic hash algorithm from :mod:`Cryptodome.Hash`.
:mod:`Cryptodome.Hash.SHA512` is a good choice.
@@ -346,7 +352,7 @@ def scrypt(password, salt, key_len, N, r, p, num_keys=1):
but it should be randomly chosen for each derivation.
It is recommended to be at least 16 bytes long.
key_len (integer):
- The length in bytes of every derived key.
+ The length in bytes of each derived key.
N (integer):
CPU/Memory cost parameter. It must be a power of 2 and less
than :math:`2^{32}`.
@@ -572,3 +578,65 @@ def bcrypt_check(password, bcrypt_hash):
mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=bcrypt_hash2).digest()
if mac1 != mac2:
raise ValueError("Incorrect bcrypt hash")
+
+
+def SP800_108_Counter(master, key_len, prf, num_keys=None, label=b'', context=b''):
+ """Derive one or more keys from a master secret using
+ a pseudorandom function in Counter Mode, as specified in
+ `NIST SP 800-108r1 <https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-108r1.pdf>`_.
+
+ Args:
+ master (byte string):
+ The secret value used by the KDF to derive the other keys.
+ It must not be a password.
+ The length on the secret must be consistent with the input expected by
+ the :data:`prf` function.
+ key_len (integer):
+ The length in bytes of each derived key.
+ prf (function):
+ A pseudorandom function that takes two byte strings as parameters:
+ the secret and an input. It returns another byte string.
+ num_keys (integer):
+ The number of keys to derive. Every key is :data:`key_len` bytes long.
+ By default, only 1 key is derived.
+ label (byte string):
+ Optional description of the purpose of the derived keys.
+ It must not contain zero bytes.
+ context (byte string):
+ Optional information pertaining to
+ the protocol that uses the keys, such as the identity of the
+ participants, nonces, session IDs, etc.
+ It must not contain zero bytes.
+
+ Return:
+ - a byte string (if ``num_keys`` is not specified), or
+ - a tuple of byte strings (if ``num_key`` is specified).
+ """
+
+ if num_keys is None:
+ num_keys = 1
+
+ if label.find(b'\x00') != -1:
+ raise ValueError("Null byte found in label")
+
+ if context.find(b'\x00') != -1:
+ raise ValueError("Null byte found in context")
+
+ key_len_enc = long_to_bytes(key_len * num_keys * 8, 4)
+ output_len = key_len * num_keys
+
+ i = 1
+ dk = b""
+ while len(dk) < output_len:
+ info = long_to_bytes(i, 4) + label + b'\x00' + context + key_len_enc
+ dk += prf(master, info)
+ i += 1
+ if i > 0xFFFFFFFF:
+ raise ValueError("Overflow in SP800 108 counter")
+
+ if num_keys == 1:
+ return dk[:key_len]
+ else:
+ kol = [dk[idx:idx + key_len]
+ for idx in iter_range(0, output_len, key_len)]
+ return kol
diff --git a/frozen_deps/Cryptodome/Protocol/KDF.pyi b/frozen_deps/Cryptodome/Protocol/KDF.pyi
index fb004bf..745f019 100644
--- a/frozen_deps/Cryptodome/Protocol/KDF.pyi
+++ b/frozen_deps/Cryptodome/Protocol/KDF.pyi
@@ -1,7 +1,11 @@
from types import ModuleType
-from typing import Optional, Callable, Tuple, Union, Dict, Any
+from typing import Optional, Callable, Tuple, Union, Dict, Any, overload
+from typing_extensions import Literal
+
+Buffer=bytes|bytearray|memoryview
RNG = Callable[[int], bytes]
+PRF = Callable[[bytes, bytes], bytes]
def PBKDF1(password: str, salt: bytes, dkLen: int, count: Optional[int]=1000, hashAlgo: Optional[ModuleType]=None) -> bytes: ...
def PBKDF2(password: str, salt: bytes, dkLen: Optional[int]=16, count: Optional[int]=1000, prf: Optional[RNG]=None, hmac_hash_module: Optional[ModuleType]=None) -> bytes: ...
@@ -22,3 +26,17 @@ def _bcrypt_decode(data: bytes) -> bytes: ...
def _bcrypt_hash(password:bytes , cost: int, salt: bytes, constant:bytes, invert:bool) -> bytes: ...
def bcrypt(password: Union[bytes, str], cost: int, salt: Optional[bytes]=None) -> bytes: ...
def bcrypt_check(password: Union[bytes, str], bcrypt_hash: Union[bytes, bytearray, str]) -> None: ...
+
+@overload
+def SP800_108_Counter(master: Buffer,
+ key_len: int,
+ prf: PRF,
+ num_keys: Literal[None] = None,
+ label: Buffer = b'', context: Buffer = b'') -> bytes: ...
+
+@overload
+def SP800_108_Counter(master: Buffer,
+ key_len: int,
+ prf: PRF,
+ num_keys: int,
+ label: Buffer = b'', context: Buffer = b'') -> Tuple[bytes]: ...
diff --git a/frozen_deps/Cryptodome/Protocol/__init__.py b/frozen_deps/Cryptodome/Protocol/__init__.py
index efdf034..76e22bf 100644
--- a/frozen_deps/Cryptodome/Protocol/__init__.py
+++ b/frozen_deps/Cryptodome/Protocol/__init__.py
@@ -28,4 +28,4 @@
# POSSIBILITY OF SUCH DAMAGE.
# ===================================================================
-__all__ = ['KDF', 'SecretSharing']
+__all__ = ['KDF', 'SecretSharing', 'DH']
diff --git a/frozen_deps/Cryptodome/Protocol/_scrypt.abi3.so b/frozen_deps/Cryptodome/Protocol/_scrypt.abi3.so
index 6ba8f35..baf83a8 100755
--- a/frozen_deps/Cryptodome/Protocol/_scrypt.abi3.so
+++ b/frozen_deps/Cryptodome/Protocol/_scrypt.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Protocol/_scrypt.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Protocol/_scrypt.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index c979025..0000000
--- a/frozen_deps/Cryptodome/Protocol/_scrypt.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/PublicKey/ECC.py b/frozen_deps/Cryptodome/PublicKey/ECC.py
index 84a4e07..4546742 100644
--- a/frozen_deps/Cryptodome/PublicKey/ECC.py
+++ b/frozen_deps/Cryptodome/PublicKey/ECC.py
@@ -101,7 +101,7 @@ int ed25519_neg(Point *p);
int ed25519_get_xy(uint8_t *xb, uint8_t *yb, size_t modsize, Point *p);
int ed25519_double(Point *p);
int ed25519_add(Point *P1, const Point *P2);
-int ed25519_scalar(Point *P, uint8_t *scalar, size_t scalar_len, uint64_t seed);
+int ed25519_scalar(Point *P, const uint8_t *scalar, size_t scalar_len, uint64_t seed);
""")
_ed448_lib = load_pycryptodome_raw_lib("Cryptodome.PublicKey._ed448", """
@@ -534,6 +534,9 @@ class EccPoint(object):
return self
def __eq__(self, point):
+ if not isinstance(point, EccPoint):
+ return False
+
cmp_func = lib_func(self, "cmp")
return 0 == cmp_func(self._point.get(), point._point.get())
@@ -753,7 +756,7 @@ class EccKey(object):
if curve_name not in _curves:
raise ValueError("Unsupported curve (%s)" % curve_name)
self._curve = _curves[curve_name]
- self.curve = curve_name
+ self.curve = self._curve.desc
count = int(self._d is not None) + int(self._seed is not None)
@@ -801,6 +804,9 @@ class EccKey(object):
return self._curve.desc in ("Ed25519", "Ed448")
def __eq__(self, other):
+ if not isinstance(other, EccKey):
+ return False
+
if other.has_private() != self.has_private():
return False
@@ -809,7 +815,7 @@ class EccKey(object):
def __repr__(self):
if self.has_private():
if self._is_eddsa():
- extra = ", seed=%s" % self._seed.hex()
+ extra = ", seed=%s" % tostr(binascii.hexlify(self._seed))
else:
extra = ", d=%d" % int(self._d)
else:
@@ -957,7 +963,7 @@ class EccKey(object):
from Cryptodome.IO import PKCS8
if kwargs.get('passphrase', None) is not None and 'protection' not in kwargs:
- raise ValueError("At least the 'protection' parameter should be present")
+ raise ValueError("At least the 'protection' parameter must be present")
if self._is_eddsa():
oid = self._curve.oid
@@ -1035,7 +1041,7 @@ class EccKey(object):
Args:
format (string):
- The format to use for encoding the key:
+ The output format:
- ``'DER'``. The key will be encoded in ASN.1 DER format (binary).
For a public key, the ASN.1 ``subjectPublicKeyInfo`` structure
@@ -1056,20 +1062,25 @@ class EccKey(object):
* For NIST P-curves: equivalent to ``'SEC1'``.
* For EdDSA curves: ``bytes`` in the format defined in `RFC8032`_.
- passphrase (byte string or string):
- The passphrase to use for protecting the private key.
+ passphrase (bytes or string):
+ (*Private keys only*) The passphrase to protect the
+ private key.
use_pkcs8 (boolean):
- Only relevant for private keys.
-
+ (*Private keys only*)
If ``True`` (default and recommended), the `PKCS#8`_ representation
will be used. It must be ``True`` for EdDSA curves.
+ If ``False`` and a passphrase is present, the obsolete PEM
+ encryption will be used.
+
protection (string):
When a private key is exported with password-protection
and PKCS#8 (both ``DER`` and ``PEM`` formats), this parameter MUST be
- present and be a valid algorithm supported by :mod:`Cryptodome.IO.PKCS8`.
- It is recommended to use ``PBKDF2WithHMAC-SHA1AndAES128-CBC``.
+ present,
+ For all possible protection schemes,
+ refer to :ref:`the encryption parameters of PKCS#8<enc_params>`.
+ It is recommended to use ``'PBKDF2WithHMAC-SHA5126AndAES128-CBC'``.
compress (boolean):
If ``True``, the method returns a more compact representation
@@ -1080,6 +1091,16 @@ class EccKey(object):
This parameter is ignored for EdDSA curves, as compression is
mandatory.
+ prot_params (dict):
+ When a private key is exported with password-protection
+ and PKCS#8 (both ``DER`` and ``PEM`` formats), this dictionary
+ contains the parameters to use to derive the encryption key
+ from the passphrase.
+ For all possible values,
+ refer to :ref:`the encryption parameters of PKCS#8<enc_params>`.
+ The recommendation is to use ``{'iteration_count':21000}`` for PBKDF2,
+ and ``{'iteration_count':131072}`` for scrypt.
+
.. warning::
If you don't provide a passphrase, the private key will be
exported in the clear!
@@ -1115,8 +1136,11 @@ class EccKey(object):
raise ValueError("Empty passphrase")
use_pkcs8 = args.pop("use_pkcs8", True)
- if not use_pkcs8 and self._is_eddsa():
- raise ValueError("'pkcs8' must be True for EdDSA curves")
+ if not use_pkcs8:
+ if self._is_eddsa():
+ raise ValueError("'pkcs8' must be True for EdDSA curves")
+ if 'protection' in args:
+ raise ValueError("'protection' is only supported for PKCS#8")
if ext_format == "PEM":
if use_pkcs8:
@@ -1390,8 +1414,8 @@ def _import_rfc5915_der(encoded, passphrase, curve_oid=None):
d = Integer.from_bytes(scalar_bytes)
# Decode public key (if any)
- if len(private_key) == 4:
- public_key_enc = DerBitString(explicit=1).decode(private_key[3]).value
+ if len(private_key) > 2:
+ public_key_enc = DerBitString(explicit=1).decode(private_key[-1]).value
public_key = _import_public_der(public_key_enc, curve_oid=curve_oid)
point_x = public_key.pointQ.x
point_y = public_key.pointQ.y
@@ -1766,7 +1790,7 @@ def import_key(encoded, passphrase=None, curve_name=None):
return _import_der(encoded, passphrase)
# SEC1
- if len(encoded) > 0 and bord(encoded[0]) in b'\x02\x03\x04':
+ if len(encoded) > 0 and bord(encoded[0]) in (0x02, 0x03, 0x04):
if curve_name is None:
raise ValueError("No curve name was provided")
return _import_public_der(encoded, curve_name=curve_name)
diff --git a/frozen_deps/Cryptodome/PublicKey/ECC.pyi b/frozen_deps/Cryptodome/PublicKey/ECC.pyi
index b0bfbec..e3c4ed5 100644
--- a/frozen_deps/Cryptodome/PublicKey/ECC.pyi
+++ b/frozen_deps/Cryptodome/PublicKey/ECC.pyi
@@ -1,12 +1,24 @@
-from typing import Union, Callable, Optional, NamedTuple, List, Tuple, Dict, NamedTuple, Any
+from __future__ import annotations
+
+from typing import Union, Callable, Optional, Tuple, Dict, NamedTuple, Any, overload, Literal
+from typing_extensions import TypedDict, Unpack, NotRequired
from Cryptodome.Math.Numbers import Integer
+from Cryptodome.IO._PBES import ProtParams
RNG = Callable[[int], bytes]
-class UnsupportedEccFeature(ValueError): ...
+
+class UnsupportedEccFeature(ValueError):
+ ...
+
+
class EccPoint(object):
- def __init__(self, x: Union[int, Integer], y: Union[int, Integer], curve: Optional[str] = ...) -> None: ...
+ def __init__(self,
+ x: Union[int, Integer],
+ y: Union[int, Integer],
+ curve: Optional[str] = ...) -> None: ...
+
def set(self, point: EccPoint) -> EccPoint: ...
def __eq__(self, point: object) -> bool: ...
def __neg__(self) -> EccPoint: ...
@@ -27,6 +39,15 @@ class EccPoint(object):
def __imul__(self, scalar: int) -> EccPoint: ...
def __mul__(self, scalar: int) -> EccPoint: ...
+
+class ExportParams(TypedDict):
+ passphrase: NotRequired[Union[bytes, str]]
+ use_pkcs8: NotRequired[bool]
+ protection: NotRequired[str]
+ compress: NotRequired[bool]
+ prot_params: NotRequired[ProtParams]
+
+
class EccKey(object):
curve: str
def __init__(self, *, curve: str = ..., d: int = ..., point: EccPoint = ...) -> None: ...
@@ -38,7 +59,18 @@ class EccKey(object):
@property
def pointQ(self) -> EccPoint: ...
def public_key(self) -> EccKey: ...
- def export_key(self, **kwargs: Union[str, bytes, bool]) -> Union[str,bytes]: ...
+
+ @overload
+ def export_key(self,
+ *,
+ format: Literal['PEM', 'OpenSSH'],
+ **kwargs: Unpack[ExportParams]) -> str: ...
+
+ @overload
+ def export_key(self,
+ *,
+ format: Literal['DER', 'SEC1', 'raw'],
+ **kwargs: Unpack[ExportParams]) -> bytes: ...
_Curve = NamedTuple("_Curve", [('p', Integer),
@@ -54,13 +86,17 @@ _Curve = NamedTuple("_Curve", [('p', Integer),
('openssh', Union[str, None]),
])
-_curves : Dict[str, _Curve]
+_curves: Dict[str, _Curve]
def generate(**kwargs: Union[str, RNG]) -> EccKey: ...
def construct(**kwargs: Union[str, int]) -> EccKey: ...
+
+
def import_key(encoded: Union[bytes, str],
- passphrase: Optional[str]=None,
- curve_name:Optional[str]=None) -> EccKey: ...
+ passphrase: Optional[str] = None,
+ curve_name: Optional[str] = None) -> EccKey: ...
+
+
def _import_ed25519_public_key(encoded: bytes) -> EccKey: ...
def _import_ed448_public_key(encoded: bytes) -> EccKey: ...
diff --git a/frozen_deps/Cryptodome/PublicKey/RSA.py b/frozen_deps/Cryptodome/PublicKey/RSA.py
index bafe036..9a27c36 100644
--- a/frozen_deps/Cryptodome/PublicKey/RSA.py
+++ b/frozen_deps/Cryptodome/PublicKey/RSA.py
@@ -38,6 +38,7 @@ import struct
from Cryptodome import Random
from Cryptodome.Util.py3compat import tobytes, bord, tostr
from Cryptodome.Util.asn1 import DerSequence, DerNull
+from Cryptodome.Util.number import bytes_to_long
from Cryptodome.Math.Numbers import Integer
from Cryptodome.Math.Primality import (test_probable_prime,
@@ -49,7 +50,7 @@ from Cryptodome.PublicKey import (_expand_subject_public_key_info,
class RsaKey(object):
- r"""Class defining an actual RSA key.
+ r"""Class defining an RSA key, private or public.
Do not instantiate directly.
Use :func:`generate`, :func:`construct` or :func:`import_key` instead.
@@ -68,10 +69,14 @@ class RsaKey(object):
:ivar q: Second factor of the RSA modulus
:vartype q: integer
- :ivar u: Chinese remainder component (:math:`p^{-1} \text{mod } q`)
- :vartype u: integer
+ :ivar invp: Chinese remainder component (:math:`p^{-1} \text{mod } q`)
+ :vartype invp: integer
+
+ :ivar invq: Chinese remainder component (:math:`q^{-1} \text{mod } p`)
+ :vartype invq: integer
- :undocumented: exportKey, publickey
+ :ivar u: Same as ``invp``
+ :vartype u: integer
"""
def __init__(self, **kwargs):
@@ -103,6 +108,7 @@ class RsaKey(object):
if input_set == private_set:
self._dp = self._d % (self._p - 1) # = (e⁻¹) mod (p-1)
self._dq = self._d % (self._q - 1) # = (e⁻¹) mod (q-1)
+ self._invq = None # will be computed on demand
@property
def n(self):
@@ -131,6 +137,30 @@ class RsaKey(object):
return int(self._q)
@property
+ def dp(self):
+ if not self.has_private():
+ raise AttributeError("No CRT component 'dp' available for public keys")
+ return int(self._dp)
+
+ @property
+ def dq(self):
+ if not self.has_private():
+ raise AttributeError("No CRT component 'dq' available for public keys")
+ return int(self._dq)
+
+ @property
+ def invq(self):
+ if not self.has_private():
+ raise AttributeError("No CRT component 'invq' available for public keys")
+ if self._invq is None:
+ self._invq = self._q.inverse(self._p)
+ return int(self._invq)
+
+ @property
+ def invp(self):
+ return self.u
+
+ @property
def u(self):
if not self.has_private():
raise AttributeError("No CRT component 'u' available for public keys")
@@ -149,7 +179,7 @@ class RsaKey(object):
raise ValueError("Plaintext too large")
return int(pow(Integer(plaintext), self._e, self._n))
- def _decrypt(self, ciphertext):
+ def _decrypt_to_bytes(self, ciphertext):
if not 0 <= ciphertext < self._n:
raise ValueError("Ciphertext too large")
if not self.has_private():
@@ -167,12 +197,18 @@ class RsaKey(object):
h = ((m2 - m1) * self._u) % self._q
mp = h * self._p + m1
# Step 4: Compute m = m' * (r**(-1)) mod n
- result = (r.inverse(self._n) * mp) % self._n
- # Verify no faults occurred
- if ciphertext != pow(result, self._e, self._n):
- raise ValueError("Fault detected in RSA decryption")
+ # then encode into a big endian byte string
+ result = Integer._mult_modulo_bytes(
+ r.inverse(self._n),
+ mp,
+ self._n)
return result
+ def _decrypt(self, ciphertext):
+ """Legacy private method"""
+
+ return bytes_to_long(self._decrypt_to_bytes(ciphertext))
+
def has_private(self):
"""Whether this is an RSA private key"""
@@ -225,67 +261,76 @@ class RsaKey(object):
return "%s RSA key at 0x%X" % (key_type, id(self))
def export_key(self, format='PEM', passphrase=None, pkcs=1,
- protection=None, randfunc=None):
+ protection=None, randfunc=None, prot_params=None):
"""Export this RSA key.
- Args:
+ Keyword Args:
format (string):
- The format to use for wrapping the key:
+ The desired output format:
- - *'PEM'*. (*Default*) Text encoding, done according to `RFC1421`_/`RFC1423`_.
- - *'DER'*. Binary encoding.
- - *'OpenSSH'*. Textual encoding, done according to OpenSSH specification.
+ - ``'PEM'``. (default) Text output, according to `RFC1421`_/`RFC1423`_.
+ - ``'DER'``. Binary output.
+ - ``'OpenSSH'``. Text output, according to the OpenSSH specification.
Only suitable for public keys (not private keys).
- passphrase (string):
- (*For private keys only*) The pass phrase used for protecting the output.
+ Note that PEM contains a DER structure.
+
+ passphrase (bytes or string):
+ (*Private keys only*) The passphrase to protect the
+ private key.
pkcs (integer):
- (*For private keys only*) The ASN.1 structure to use for
- serializing the key. Note that even in case of PEM
- encoding, there is an inner ASN.1 DER structure.
+ (*Private keys only*) The standard to use for
+ serializing the key: PKCS#1 or PKCS#8.
- With ``pkcs=1`` (*default*), the private key is encoded in a
- simple `PKCS#1`_ structure (``RSAPrivateKey``).
+ With ``pkcs=1`` (*default*), the private key is encoded with a
+ simple `PKCS#1`_ structure (``RSAPrivateKey``). The key cannot be
+ securely encrypted.
- With ``pkcs=8``, the private key is encoded in a `PKCS#8`_ structure
- (``PrivateKeyInfo``).
+ With ``pkcs=8``, the private key is encoded with a `PKCS#8`_ structure
+ (``PrivateKeyInfo``). PKCS#8 offers the best ways to securely
+ encrypt the key.
.. note::
This parameter is ignored for a public key.
- For DER and PEM, an ASN.1 DER ``SubjectPublicKeyInfo``
- structure is always used.
+ For DER and PEM, the output is always an
+ ASN.1 DER ``SubjectPublicKeyInfo`` structure.
protection (string):
(*For private keys only*)
- The encryption scheme to use for protecting the private key.
+ The encryption scheme to use for protecting the private key
+ using the passphrase.
- If ``None`` (default), the behavior depends on :attr:`format`:
+ You can only specify a value if ``pkcs=8``.
+ For all possible protection schemes,
+ refer to :ref:`the encryption parameters of PKCS#8<enc_params>`.
+ The recommended value is
+ ``'PBKDF2WithHMAC-SHA512AndAES256-CBC'``.
- - For *'DER'*, the *PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC*
- scheme is used. The following operations are performed:
+ If ``None`` (default), the behavior depends on :attr:`format`:
- 1. A 16 byte Triple DES key is derived from the passphrase
- using :func:`Cryptodome.Protocol.KDF.PBKDF2` with 8 bytes salt,
- and 1 000 iterations of :mod:`Cryptodome.Hash.HMAC`.
- 2. The private key is encrypted using CBC.
- 3. The encrypted key is encoded according to PKCS#8.
+ - if ``format='PEM'``, the obsolete PEM encryption scheme is used.
+ It is based on MD5 for key derivation, and 3DES for encryption.
- - For *'PEM'*, the obsolete PEM encryption scheme is used.
- It is based on MD5 for key derivation, and Triple DES for encryption.
+ - if ``format='DER'``, the ``'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC'``
+ scheme is used.
- Specifying a value for :attr:`protection` is only meaningful for PKCS#8
- (that is, ``pkcs=8``) and only if a pass phrase is present too.
+ prot_params (dict):
+ (*For private keys only*)
- The supported schemes for PKCS#8 are listed in the
- :mod:`Cryptodome.IO.PKCS8` module (see :attr:`wrap_algo` parameter).
+ The parameters to use to derive the encryption key
+ from the passphrase. ``'protection'`` must be also specified.
+ For all possible values,
+ refer to :ref:`the encryption parameters of PKCS#8<enc_params>`.
+ The recommendation is to use ``{'iteration_count':21000}`` for PBKDF2,
+ and ``{'iteration_count':131072}`` for scrypt.
randfunc (callable):
A function that provides random bytes. Only used for PEM encoding.
The default is :func:`Cryptodome.Random.get_random_bytes`.
Returns:
- byte string: the encoded key
+ bytes: the encoded key
Raises:
ValueError:when the format is unknown or when you try to encrypt a private
@@ -344,9 +389,12 @@ class RsaKey(object):
else:
key_type = 'ENCRYPTED PRIVATE KEY'
if not protection:
+ if prot_params:
+ raise ValueError("'protection' parameter must be set")
protection = 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC'
binary_key = PKCS8.wrap(binary_key, oid,
passphrase, protection,
+ prot_params=prot_params,
key_params=DerNull())
passphrase = None
else:
@@ -368,29 +416,41 @@ class RsaKey(object):
raise ValueError("Unknown key format '%s'. Cannot export the RSA key." % format)
# Backward compatibility
- exportKey = export_key
- publickey = public_key
+ def exportKey(self, *args, **kwargs):
+ """:meta private:"""
+ return self.export_key(*args, **kwargs)
+
+ def publickey(self):
+ """:meta private:"""
+ return self.public_key()
# Methods defined in PyCryptodome that we don't support anymore
def sign(self, M, K):
+ """:meta private:"""
raise NotImplementedError("Use module Cryptodome.Signature.pkcs1_15 instead")
def verify(self, M, signature):
+ """:meta private:"""
raise NotImplementedError("Use module Cryptodome.Signature.pkcs1_15 instead")
def encrypt(self, plaintext, K):
+ """:meta private:"""
raise NotImplementedError("Use module Cryptodome.Cipher.PKCS1_OAEP instead")
def decrypt(self, ciphertext):
+ """:meta private:"""
raise NotImplementedError("Use module Cryptodome.Cipher.PKCS1_OAEP instead")
def blind(self, M, B):
+ """:meta private:"""
raise NotImplementedError
def unblind(self, M, B):
+ """:meta private:"""
raise NotImplementedError
def size(self):
+ """:meta private:"""
raise NotImplementedError
@@ -408,6 +468,7 @@ def generate(bits, randfunc=None, e=65537):
Key length, or size (in bits) of the RSA modulus.
It must be at least 1024, but **2048 is recommended.**
The FIPS standard only defines 1024, 2048 and 3072.
+ Keyword Args:
randfunc (callable):
Function that returns random bytes.
The default is :func:`Cryptodome.Random.get_random_bytes`.
@@ -505,6 +566,7 @@ def construct(rsa_components, consistency_check=True):
5. Second factor of *n* (*q*). Optional.
6. CRT coefficient *q*, that is :math:`p^{-1} \text{mod }q`. Optional.
+ Keyword Args:
consistency_check (boolean):
If ``True``, the library will verify that the provided components
fulfil the main RSA properties.
diff --git a/frozen_deps/Cryptodome/PublicKey/RSA.pyi b/frozen_deps/Cryptodome/PublicKey/RSA.pyi
index d436acf..85f6c4a 100644
--- a/frozen_deps/Cryptodome/PublicKey/RSA.pyi
+++ b/frozen_deps/Cryptodome/PublicKey/RSA.pyi
@@ -1,4 +1,7 @@
-from typing import Callable, Union, Tuple, Optional
+from typing import Callable, Union, Tuple, Optional, overload, Literal
+
+from Cryptodome.Math.Numbers import Integer
+from Cryptodome.IO._PBES import ProtParams
__all__ = ['generate', 'construct', 'import_key',
'RsaKey', 'oid']
@@ -7,6 +10,7 @@ RNG = Callable[[int], bytes]
class RsaKey(object):
def __init__(self, **kwargs: int) -> None: ...
+
@property
def n(self) -> int: ...
@property
@@ -19,6 +23,11 @@ class RsaKey(object):
def q(self) -> int: ...
@property
def u(self) -> int: ...
+ @property
+ def invp(self) -> int: ...
+ @property
+ def invq(self) -> int: ...
+
def size_in_bits(self) -> int: ...
def size_in_bytes(self) -> int: ...
def has_private(self) -> bool: ...
@@ -30,18 +39,36 @@ class RsaKey(object):
def __getstate__(self) -> None: ...
def __repr__(self) -> str: ...
def __str__(self) -> str: ...
- def export_key(self, format: Optional[str]="PEM", passphrase: Optional[str]=None, pkcs: Optional[int]=1,
- protection: Optional[str]=None, randfunc: Optional[RNG]=None) -> bytes: ...
+
+ @overload
+ def export_key(self,
+ format: Optional[str]="PEM",
+ passphrase: Optional[str]=None,
+ pkcs: Optional[int]=1,
+ protection: Optional[str]=None,
+ randfunc: Optional[RNG]=None
+ ) -> bytes: ...
+ @overload
+ def export_key(self, *,
+ format: Optional[str]="PEM",
+ passphrase: str,
+ pkcs: Literal[8],
+ protection: str,
+ randfunc: Optional[RNG]=None,
+ prot_params: ProtParams,
+ ) -> bytes: ...
# Backward compatibility
exportKey = export_key
publickey = public_key
+Int = Union[int, Integer]
+
def generate(bits: int, randfunc: Optional[RNG]=None, e: Optional[int]=65537) -> RsaKey: ...
-def construct(rsa_components: Union[Tuple[int, int], # n, e
- Tuple[int, int, int], # n, e, d
- Tuple[int, int, int, int, int], # n, e, d, p, q
- Tuple[int, int, int, int, int, int]], # n, e, d, p, q, crt_q
+def construct(rsa_components: Union[Tuple[Int, Int], # n, e
+ Tuple[Int, Int, Int], # n, e, d
+ Tuple[Int, Int, Int, Int, Int], # n, e, d, p, q
+ Tuple[Int, Int, Int, Int, Int, Int]], # n, e, d, p, q, crt_q
consistency_check: Optional[bool]=True) -> RsaKey: ...
def import_key(extern_key: Union[str, bytes], passphrase: Optional[str]=None) -> RsaKey: ...
diff --git a/frozen_deps/Cryptodome/PublicKey/_ec_ws.abi3.so b/frozen_deps/Cryptodome/PublicKey/_ec_ws.abi3.so
index b6fd404..b1272d2 100755
--- a/frozen_deps/Cryptodome/PublicKey/_ec_ws.abi3.so
+++ b/frozen_deps/Cryptodome/PublicKey/_ec_ws.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/PublicKey/_ec_ws.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/PublicKey/_ec_ws.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 4cb470d..0000000
--- a/frozen_deps/Cryptodome/PublicKey/_ec_ws.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/PublicKey/_ed25519.abi3.so b/frozen_deps/Cryptodome/PublicKey/_ed25519.abi3.so
index bd8bcc5..e047bcb 100755
--- a/frozen_deps/Cryptodome/PublicKey/_ed25519.abi3.so
+++ b/frozen_deps/Cryptodome/PublicKey/_ed25519.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/PublicKey/_ed448.abi3.so b/frozen_deps/Cryptodome/PublicKey/_ed448.abi3.so
index ee47399..da7209a 100755
--- a/frozen_deps/Cryptodome/PublicKey/_ed448.abi3.so
+++ b/frozen_deps/Cryptodome/PublicKey/_ed448.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/PublicKey/_x25519.abi3.so b/frozen_deps/Cryptodome/PublicKey/_x25519.abi3.so
index bbdc726..dbb00d5 100755
--- a/frozen_deps/Cryptodome/PublicKey/_x25519.abi3.so
+++ b/frozen_deps/Cryptodome/PublicKey/_x25519.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Random/random.pyi b/frozen_deps/Cryptodome/Random/random.pyi
index f873c4a..9b7cf7e 100644
--- a/frozen_deps/Cryptodome/Random/random.pyi
+++ b/frozen_deps/Cryptodome/Random/random.pyi
@@ -1,13 +1,15 @@
-from typing import Callable, Tuple, Union, Sequence, Any, Optional
+from typing import Callable, Tuple, Union, Sequence, Any, Optional, TypeVar
__all__ = ['StrongRandom', 'getrandbits', 'randrange', 'randint', 'choice', 'shuffle', 'sample']
+T = TypeVar('T')
+
class StrongRandom(object):
def __init__(self, rng: Optional[Any]=None, randfunc: Optional[Callable]=None) -> None: ... # TODO What is rng?
def getrandbits(self, k: int) -> int: ...
def randrange(self, start: int, stop: int = ..., step: int = ...) -> int: ...
def randint(self, a: int, b: int) -> int: ...
- def choice(self, seq: Sequence) -> object: ...
+ def choice(self, seq: Sequence[T]) -> T: ...
def shuffle(self, x: Sequence) -> None: ...
def sample(self, population: Sequence, k: int) -> list: ...
diff --git a/frozen_deps/Cryptodome/Signature/PKCS1_PSS.pyi b/frozen_deps/Cryptodome/Signature/PKCS1_PSS.pyi
index 7ed68e6..e7424f5 100644
--- a/frozen_deps/Cryptodome/Signature/PKCS1_PSS.pyi
+++ b/frozen_deps/Cryptodome/Signature/PKCS1_PSS.pyi
@@ -1,7 +1,28 @@
-from typing import Optional, Callable
+from typing import Union, Callable, Optional
+from typing_extensions import Protocol
from Cryptodome.PublicKey.RSA import RsaKey
-from Cryptodome.Signature.pss import PSS_SigScheme
-def new(rsa_key: RsaKey, mgfunc: Optional[Callable]=None, saltLen: Optional[int]=None, randfunc: Optional[Callable]=None) -> PSS_SigScheme: ...
+class Hash(Protocol):
+ def digest(self) -> bytes: ...
+ def update(self, bytes) -> None: ...
+
+
+class HashModule(Protocol):
+ @staticmethod
+ def new(data: Optional[bytes]) -> Hash: ...
+
+
+MaskFunction = Callable[[bytes, int, Union[Hash, HashModule]], bytes]
+RndFunction = Callable[[int], bytes]
+
+class PSS_SigScheme:
+ def __init__(self, key: RsaKey, mgfunc: MaskFunction, saltLen: int, randfunc: RndFunction) -> None: ...
+ def can_sign(self) -> bool: ...
+ def sign(self, msg_hash: Hash) -> bytes: ...
+ def verify(self, msg_hash: Hash, signature: bytes) -> bool: ...
+
+
+
+def new(rsa_key: RsaKey, mgfunc: Optional[MaskFunction]=None, saltLen: Optional[int]=None, randfunc: Optional[RndFunction]=None) -> PSS_SigScheme: ...
diff --git a/frozen_deps/Cryptodome/Signature/PKCS1_v1_5.pyi b/frozen_deps/Cryptodome/Signature/PKCS1_v1_5.pyi
index 5851e5b..d02555c 100644
--- a/frozen_deps/Cryptodome/Signature/PKCS1_v1_5.pyi
+++ b/frozen_deps/Cryptodome/Signature/PKCS1_v1_5.pyi
@@ -1,6 +1,16 @@
+from typing import Optional
+from typing_extensions import Protocol
+
from Cryptodome.PublicKey.RSA import RsaKey
-from Cryptodome.Signature.pkcs1_15 import PKCS115_SigScheme
+class Hash(Protocol):
+ def digest(self) -> bytes: ...
+
+class PKCS115_SigScheme:
+ def __init__(self, rsa_key: RsaKey) -> None: ...
+ def can_sign(self) -> bool: ...
+ def sign(self, msg_hash: Hash) -> bytes: ...
+ def verify(self, msg_hash: Hash, signature: bytes) -> bool: ...
-def new(rsa_key: RsaKey) -> PKCS115_SigScheme: ... \ No newline at end of file
+def new(rsa_key: RsaKey) -> PKCS115_SigScheme: ...
diff --git a/frozen_deps/Cryptodome/Signature/eddsa.py b/frozen_deps/Cryptodome/Signature/eddsa.py
index e80a866..638b96b 100644
--- a/frozen_deps/Cryptodome/Signature/eddsa.py
+++ b/frozen_deps/Cryptodome/Signature/eddsa.py
@@ -39,8 +39,9 @@ from Cryptodome.PublicKey.ECC import (EccKey,
def import_public_key(encoded):
- """Import an EdDSA ECC public key, when encoded as raw ``bytes`` as described
- in RFC8032.
+ """Create a new Ed25519 or Ed448 public key object,
+ starting from the key encoded as raw ``bytes``,
+ in the format described in RFC8032.
Args:
encoded (bytes):
@@ -66,8 +67,9 @@ def import_public_key(encoded):
def import_private_key(encoded):
- """Import an EdDSA ECC private key, when encoded as raw ``bytes`` as described
- in RFC8032.
+ """Create a new Ed25519 or Ed448 private key object,
+ starting from the key encoded as raw ``bytes``,
+ in the format described in RFC8032.
Args:
encoded (bytes):
@@ -313,7 +315,7 @@ def new(key, mode, context=None):
can perform or verify an EdDSA signature.
Args:
- key (:class:`Cryptodome.PublicKey.ECC` object:
+ key (:class:`Cryptodome.PublicKey.ECC` object):
The key to use for computing the signature (*private* keys only)
or for verifying one.
The key must be on the curve ``Ed25519`` or ``Ed448``.
diff --git a/frozen_deps/Cryptodome/Signature/eddsa.pyi b/frozen_deps/Cryptodome/Signature/eddsa.pyi
index bf985c4..809a7ad 100644
--- a/frozen_deps/Cryptodome/Signature/eddsa.pyi
+++ b/frozen_deps/Cryptodome/Signature/eddsa.pyi
@@ -18,4 +18,4 @@ class EdDSASigScheme(object):
def sign(self, msg_or_hash: Union[bytes, Hash, XOF]) -> bytes: ...
def verify(self, msg_or_hash: Union[bytes, Hash, XOF], signature: bytes) -> None: ...
-def new(key: EccKey, mode: bytes, context: Optional[bytes]=None) -> EdDSASigScheme: ...
+def new(key: EccKey, mode: str, context: Optional[bytes]=None) -> EdDSASigScheme: ...
diff --git a/frozen_deps/Cryptodome/Signature/pkcs1_15.py b/frozen_deps/Cryptodome/Signature/pkcs1_15.py
index ae9257e..bdde78a 100644
--- a/frozen_deps/Cryptodome/Signature/pkcs1_15.py
+++ b/frozen_deps/Cryptodome/Signature/pkcs1_15.py
@@ -77,10 +77,11 @@ class PKCS115_SigScheme:
em = _EMSA_PKCS1_V1_5_ENCODE(msg_hash, k)
# Step 2a (OS2IP)
em_int = bytes_to_long(em)
- # Step 2b (RSASP1)
- m_int = self._key._decrypt(em_int)
- # Step 2c (I2OSP)
- signature = long_to_bytes(m_int, k)
+ # Step 2b (RSASP1) and Step 2c (I2OSP)
+ signature = self._key._decrypt_to_bytes(em_int)
+ # Verify no faults occurred
+ if em_int != pow(bytes_to_long(signature), self._key.e, self._key.n):
+ raise ValueError("Fault detected in RSA private key operation")
return signature
def verify(self, msg_hash, signature):
@@ -202,7 +203,7 @@ def _EMSA_PKCS1_V1_5_ENCODE(msg_hash, emLen, with_hash_parameters=True):
# We need at least 11 bytes for the remaining data: 3 fixed bytes and
# at least 8 bytes of padding).
if emLen<len(digestInfo)+11:
- raise TypeError("Selected hash algorithm has a too long digest (%d bytes)." % len(digest))
+ raise TypeError("DigestInfo is too long for this RSA key (%d bytes)." % len(digestInfo))
PS = b'\xFF' * (emLen - len(digestInfo) - 3)
return b'\x00\x01' + PS + b'\x00' + digestInfo
diff --git a/frozen_deps/Cryptodome/Signature/pss.py b/frozen_deps/Cryptodome/Signature/pss.py
index 0b05ed2..b929e26 100644
--- a/frozen_deps/Cryptodome/Signature/pss.py
+++ b/frozen_deps/Cryptodome/Signature/pss.py
@@ -107,10 +107,11 @@ class PSS_SigScheme:
em = _EMSA_PSS_ENCODE(msg_hash, modBits-1, self._randfunc, mgf, sLen)
# Step 2a (OS2IP)
em_int = bytes_to_long(em)
- # Step 2b (RSASP1)
- m_int = self._key._decrypt(em_int)
- # Step 2c (I2OSP)
- signature = long_to_bytes(m_int, k)
+ # Step 2b (RSASP1) and Step 2c (I2OSP)
+ signature = self._key._decrypt_to_bytes(em_int)
+ # Verify no faults occurred
+ if em_int != pow(bytes_to_long(signature), self._key.e, self._key.n):
+ raise ValueError("Fault detected in RSA private key operation")
return signature
def verify(self, msg_hash, signature):
@@ -178,7 +179,7 @@ def MGF1(mgfSeed, maskLen, hash_gen):
:return: the mask, as a *byte string*
"""
-
+
T = b""
for counter in iter_range(ceil_div(maskLen, hash_gen.digest_size)):
c = long_to_bytes(counter, 4)
diff --git a/frozen_deps/Cryptodome/Signature/pss.pyi b/frozen_deps/Cryptodome/Signature/pss.pyi
index 9ca19ea..84a960e 100644
--- a/frozen_deps/Cryptodome/Signature/pss.pyi
+++ b/frozen_deps/Cryptodome/Signature/pss.pyi
@@ -18,7 +18,7 @@ MaskFunction = Callable[[bytes, int, Union[Hash, HashModule]], bytes]
RndFunction = Callable[[int], bytes]
class PSS_SigScheme:
- def __init__(self, key: RsaKey, mgfunc: RndFunction, saltLen: int, randfunc: RndFunction) -> None: ...
+ def __init__(self, key: RsaKey, mgfunc: MaskFunction, saltLen: int, randfunc: RndFunction) -> None: ...
def can_sign(self) -> bool: ...
def sign(self, msg_hash: Hash) -> bytes: ...
def verify(self, msg_hash: Hash, signature: bytes) -> None: ...
diff --git a/frozen_deps/Cryptodome/Util/Counter.py b/frozen_deps/Cryptodome/Util/Counter.py
index c67bc95..269b5a7 100644
--- a/frozen_deps/Cryptodome/Util/Counter.py
+++ b/frozen_deps/Cryptodome/Util/Counter.py
@@ -51,6 +51,8 @@ def new(nbits, prefix=b"", suffix=b"", initial_value=1, little_endian=False, all
If ``False`` (default), in big endian format.
allow_wraparound (boolean):
This parameter is ignored.
+ An ``OverflowError`` exception is always raised when the counter wraps
+ around to zero.
Returns:
An object that can be passed with the :data:`counter` parameter to a CTR mode
cipher.
diff --git a/frozen_deps/Cryptodome/Util/_cpuid_c.abi3.so b/frozen_deps/Cryptodome/Util/_cpuid_c.abi3.so
index 60f1e26..51e31b7 100755
--- a/frozen_deps/Cryptodome/Util/_cpuid_c.abi3.so
+++ b/frozen_deps/Cryptodome/Util/_cpuid_c.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Util/_cpuid_c.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Util/_cpuid_c.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 718bec8..0000000
--- a/frozen_deps/Cryptodome/Util/_cpuid_c.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Util/_raw_api.py b/frozen_deps/Cryptodome/Util/_raw_api.py
index c2e0187..cd64ac8 100644
--- a/frozen_deps/Cryptodome/Util/_raw_api.py
+++ b/frozen_deps/Cryptodome/Util/_raw_api.py
@@ -76,6 +76,12 @@ try:
if '__pypy__' not in sys.builtin_module_names and sys.flags.optimize == 2:
raise ImportError("CFFI with optimize=2 fails due to pycparser bug.")
+ # cffi still uses PyUnicode_GetSize, which was removed in Python 3.12
+ # thus leading to a crash on cffi.dlopen()
+ # See https://groups.google.com/u/1/g/python-cffi/c/oZkOIZ_zi5k
+ if sys.version_info >= (3, 12) and os.name == "nt":
+ raise ImportError("CFFI is not compatible with Python 3.12 on Windows")
+
from cffi import FFI
ffi = FFI()
diff --git a/frozen_deps/Cryptodome/Util/_strxor.abi3.so b/frozen_deps/Cryptodome/Util/_strxor.abi3.so
index c028978..f0f3784 100755
--- a/frozen_deps/Cryptodome/Util/_strxor.abi3.so
+++ b/frozen_deps/Cryptodome/Util/_strxor.abi3.so
Binary files differ
diff --git a/frozen_deps/Cryptodome/Util/_strxor.cpython-39-x86_64-linux-gnu.so b/frozen_deps/Cryptodome/Util/_strxor.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index dd3fb45..0000000
--- a/frozen_deps/Cryptodome/Util/_strxor.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/Cryptodome/Util/asn1.py b/frozen_deps/Cryptodome/Util/asn1.py
index a88f087..36f2d72 100644
--- a/frozen_deps/Cryptodome/Util/asn1.py
+++ b/frozen_deps/Cryptodome/Util/asn1.py
@@ -22,13 +22,20 @@
import struct
-from Cryptodome.Util.py3compat import byte_string, b, bchr, bord
+from Cryptodome.Util.py3compat import byte_string, bchr, bord
from Cryptodome.Util.number import long_to_bytes, bytes_to_long
-__all__ = ['DerObject', 'DerInteger', 'DerOctetString', 'DerNull',
- 'DerSequence', 'DerObjectId', 'DerBitString', 'DerSetOf']
+__all__ = ['DerObject', 'DerInteger', 'DerBoolean', 'DerOctetString',
+ 'DerNull', 'DerSequence', 'DerObjectId', 'DerBitString', 'DerSetOf']
+# Useful references:
+# - https://luca.ntop.org/Teaching/Appunti/asn1.html
+# - https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/
+# - https://www.zytrax.com/tech/survival/asn1.html
+# - https://www.oss.com/asn1/resources/books-whitepapers-pubs/larmouth-asn1-book.pdf
+# - https://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf
+# - https://misc.daniel-marschall.de/asn.1/oid-converter/online.php
def _is_number(x, only_non_negative=False):
test = 0
@@ -46,7 +53,7 @@ class BytesIO_EOF(object):
def __init__(self, initial_bytes):
self._buffer = initial_bytes
self._index = 0
- self._bookmark = None
+ self._bookmark = None
def set_bookmark(self):
self._bookmark = self._index
@@ -82,7 +89,7 @@ class DerObject(object):
"""Initialize the DER object according to a specific ASN.1 type.
:Parameters:
- asn1Id : integer
+ asn1Id : integer or byte
The universal DER tag number for this object
(e.g. 0x10 for a SEQUENCE).
If None, the tag is not known yet.
@@ -92,16 +99,20 @@ class DerObject(object):
the content octets).
If not specified, the payload is empty.
- implicit : integer
- The IMPLICIT tag number to use for the encoded object.
+ implicit : integer or byte
+ The IMPLICIT tag number (< 0x1F) to use for the encoded object.
It overrides the universal tag *asn1Id*.
+ It cannot be combined with the ``explicit`` parameter.
+ By default, there is no IMPLICIT tag.
constructed : bool
True when the ASN.1 type is *constructed*.
- False when it is *primitive*.
+ False when it is *primitive* (default).
- explicit : integer
- The EXPLICIT tag number to use for the encoded object.
+ explicit : integer or byte
+ The EXPLICIT tag number (< 0x1F) to use for the encoded object.
+ It cannot be combined with the ``implicit`` parameter.
+ By default, there is no EXPLICIT tag.
"""
if asn1Id is None:
@@ -125,23 +136,26 @@ class DerObject(object):
# context-spec | 1 0 (default for IMPLICIT/EXPLICIT)
# private | 1 1
#
+
+ constructed_bit = 0x20 if constructed else 0x00
+
if None not in (explicit, implicit):
raise ValueError("Explicit and implicit tags are"
" mutually exclusive")
if implicit is not None:
- self._tag_octet = 0x80 | 0x20 * constructed | self._convertTag(implicit)
- return
-
- if explicit is not None:
- self._tag_octet = 0xA0 | self._convertTag(explicit)
- self._inner_tag_octet = 0x20 * constructed | asn1Id
- return
-
- self._tag_octet = 0x20 * constructed | asn1Id
+ # IMPLICIT tag overrides asn1Id
+ self._tag_octet = 0x80 | constructed_bit | self._convertTag(implicit)
+ elif explicit is not None:
+ # 'constructed bit' is always asserted for an EXPLICIT tag
+ self._tag_octet = 0x80 | 0x20 | self._convertTag(explicit)
+ self._inner_tag_octet = constructed_bit | asn1Id
+ else:
+ # Neither IMPLICIT nor EXPLICIT
+ self._tag_octet = constructed_bit | asn1Id
def _convertTag(self, tag):
- """Check if *tag* is a real DER tag.
+ """Check if *tag* is a real DER tag (5 bits).
Convert it from a character to number if necessary.
"""
if not _is_number(tag):
@@ -306,7 +320,7 @@ class DerInteger(DerObject):
return DerObject.encode(self)
def decode(self, der_encoded, strict=False):
- """Decode a complete DER INTEGER DER, and re-initializes this
+ """Decode a DER-encoded INTEGER, and re-initializes this
object with it.
Args:
@@ -341,6 +355,89 @@ class DerInteger(DerObject):
self.value -= bits
+class DerBoolean(DerObject):
+ """Class to model a DER-encoded BOOLEAN.
+
+ An example of encoding is::
+
+ >>> from Cryptodome.Util.asn1 import DerBoolean
+ >>> bool_der = DerBoolean(True)
+ >>> print(bool_der.encode().hex())
+
+ which will show ``0101ff``, the DER encoding of True.
+
+ And for decoding::
+
+ >>> s = bytes.fromhex('0101ff')
+ >>> try:
+ >>> bool_der = DerBoolean()
+ >>> bool_der.decode(s)
+ >>> print(bool_der.value)
+ >>> except ValueError:
+ >>> print "Not a valid DER BOOLEAN"
+
+ the output will be ``True``.
+
+ :ivar value: The boolean value
+ :vartype value: boolean
+ """
+ def __init__(self, value=False, implicit=None, explicit=None):
+ """Initialize the DER object as a BOOLEAN.
+
+ Args:
+ value (boolean):
+ The value of the boolean. Default is False.
+
+ implicit (integer or byte):
+ The IMPLICIT tag number (< 0x1F) to use for the encoded object.
+ It overrides the universal tag for BOOLEAN (1).
+ It cannot be combined with the ``explicit`` parameter.
+ By default, there is no IMPLICIT tag.
+
+ explicit (integer or byte):
+ The EXPLICIT tag number (< 0x1F) to use for the encoded object.
+ It cannot be combined with the ``implicit`` parameter.
+ By default, there is no EXPLICIT tag.
+ """
+
+ DerObject.__init__(self, 0x01, b'', implicit, False, explicit)
+ self.value = value # The boolean value
+
+ def encode(self):
+ """Return the DER BOOLEAN, fully encoded as a binary string."""
+
+ self.payload = b'\xFF' if self.value else b'\x00'
+ return DerObject.encode(self)
+
+ def decode(self, der_encoded, strict=False):
+ """Decode a DER-encoded BOOLEAN, and re-initializes this object with it.
+
+ Args:
+ der_encoded (byte string): A DER-encoded BOOLEAN.
+
+ Raises:
+ ValueError: in case of parsing errors.
+ """
+
+ return DerObject.decode(self, der_encoded, strict)
+
+ def _decodeFromStream(self, s, strict):
+ """Decode a DER-encoded BOOLEAN from a file."""
+
+ # Fill up self.payload
+ DerObject._decodeFromStream(self, s, strict)
+
+ if len(self.payload) != 1:
+ raise ValueError("Invalid encoding for DER BOOLEAN: payload is not 1 byte")
+
+ if bord(self.payload[0]) == 0:
+ self.value = False
+ elif bord(self.payload[0]) == 0xFF:
+ self.value = True
+ else:
+ raise ValueError("Invalid payload for DER BOOLEAN")
+
+
class DerSequence(DerObject):
"""Class to model a DER SEQUENCE.
@@ -384,7 +481,7 @@ class DerSequence(DerObject):
"""
- def __init__(self, startSeq=None, implicit=None):
+ def __init__(self, startSeq=None, implicit=None, explicit=None):
"""Initialize the DER object as a SEQUENCE.
:Parameters:
@@ -392,12 +489,19 @@ class DerSequence(DerObject):
A sequence whose element are either integers or
other DER objects.
- implicit : integer
- The IMPLICIT tag to use for the encoded object.
+ implicit : integer or byte
+ The IMPLICIT tag number (< 0x1F) to use for the encoded object.
It overrides the universal tag for SEQUENCE (16).
+ It cannot be combined with the ``explicit`` parameter.
+ By default, there is no IMPLICIT tag.
+
+ explicit : integer or byte
+ The EXPLICIT tag number (< 0x1F) to use for the encoded object.
+ It cannot be combined with the ``implicit`` parameter.
+ By default, there is no EXPLICIT tag.
"""
- DerObject.__init__(self, 0x10, b'', implicit, True)
+ DerObject.__init__(self, 0x10, b'', implicit, True, explicit)
if startSeq is None:
self._seq = []
else:
@@ -434,6 +538,10 @@ class DerSequence(DerObject):
self._seq.append(item)
return self
+ def insert(self, index, item):
+ self._seq.insert(index, item)
+ return self
+
def hasInts(self, only_non_negative=True):
"""Return the number of items in this sequence that are
integers.
@@ -527,7 +635,6 @@ class DerSequence(DerObject):
self._seq.append(p.data_since_bookmark())
else:
derInt = DerInteger()
- #import pdb; pdb.set_trace()
data = p.data_since_bookmark()
derInt.decode(data, strict=strict)
self._seq.append(derInt.value)
@@ -648,19 +755,25 @@ class DerObjectId(DerObject):
binary string."""
comps = [int(x) for x in self.value.split(".")]
+
if len(comps) < 2:
raise ValueError("Not a valid Object Identifier string")
- self.payload = bchr(40*comps[0]+comps[1])
- for v in comps[2:]:
- if v == 0:
- enc = [0]
- else:
- enc = []
- while v:
- enc.insert(0, (v & 0x7F) | 0x80)
- v >>= 7
- enc[-1] &= 0x7F
- self.payload += b''.join([bchr(x) for x in enc])
+ if comps[0] > 2:
+ raise ValueError("First component must be 0, 1 or 2")
+ if comps[0] < 2 and comps[1] > 39:
+ raise ValueError("Second component must be 39 at most")
+
+ subcomps = [40 * comps[0] + comps[1]] + comps[2:]
+
+ encoding = []
+ for v in reversed(subcomps):
+ encoding.append(v & 0x7F)
+ v >>= 7
+ while v:
+ encoding.append((v & 0x7F) | 0x80)
+ v >>= 7
+
+ self.payload = b''.join([bchr(x) for x in reversed(encoding)])
return DerObject.encode(self)
def decode(self, der_encoded, strict=False):
@@ -687,15 +800,27 @@ class DerObjectId(DerObject):
# Derive self.value from self.payload
p = BytesIO_EOF(self.payload)
- comps = [str(x) for x in divmod(p.read_byte(), 40)]
+
+ subcomps = []
v = 0
while p.remaining_data():
c = p.read_byte()
- v = v*128 + (c & 0x7F)
+ v = (v << 7) + (c & 0x7F)
if not (c & 0x80):
- comps.append(str(v))
+ subcomps.append(v)
v = 0
- self.value = '.'.join(comps)
+
+ if len(subcomps) == 0:
+ raise ValueError("Empty payload")
+
+ if subcomps[0] < 40:
+ subcomps[:1] = [0, subcomps[0]]
+ elif subcomps[0] < 80:
+ subcomps[:1] = [1, subcomps[0] - 40]
+ else:
+ subcomps[:1] = [2, subcomps[0] - 80]
+
+ self.value = ".".join([str(x) for x in subcomps])
class DerBitString(DerObject):
@@ -736,7 +861,7 @@ class DerBitString(DerObject):
If not specified, the bit string is empty.
implicit : integer
The IMPLICIT tag to use for the encoded object.
- It overrides the universal tag for OCTET STRING (3).
+ It overrides the universal tag for BIT STRING (3).
explicit : integer
The EXPLICIT tag to use for the encoded object.
"""
diff --git a/frozen_deps/Cryptodome/Util/asn1.pyi b/frozen_deps/Cryptodome/Util/asn1.pyi
index dac023b..ee4891c 100644
--- a/frozen_deps/Cryptodome/Util/asn1.pyi
+++ b/frozen_deps/Cryptodome/Util/asn1.pyi
@@ -19,13 +19,19 @@ class DerObject:
def __init__(self, asn1Id: Optional[int]=None, payload: Optional[bytes]=..., implicit: Optional[int]=None,
constructed: Optional[bool]=False, explicit: Optional[int]=None) -> None: ...
def encode(self) -> bytes: ...
- def decode(self, der_encoded: bytes, strict: Optional[bool]=False) -> DerObject: ...
+ def decode(self, der_encoded: bytes, strict: bool=...) -> DerObject: ...
class DerInteger(DerObject):
value: int
def __init__(self, value: Optional[int]= 0, implicit: Optional[int]=None, explicit: Optional[int]=None) -> None: ...
def encode(self) -> bytes: ...
- def decode(self, der_encoded: bytes, strict: Optional[bool]=False) -> DerInteger: ...
+ def decode(self, der_encoded: bytes, strict: bool=...) -> DerInteger: ...
+
+class DerBoolean(DerObject):
+ value: bool
+ def __init__(self, value: bool=..., implicit: Optional[Union[int, bytes]]=..., explicit: Optional[Union[int, bytes]]=...) -> None: ...
+ def encode(self) -> bytes: ...
+ def decode(self, der_encoded: bytes, strict: bool=...) -> DerBoolean: ...
class DerSequence(DerObject):
def __init__(self, startSeq: Optional[Sequence[Union[int, DerInteger, DerObject]]]=None, implicit: Optional[int]=None) -> None: ...
@@ -41,7 +47,7 @@ class DerSequence(DerObject):
def hasInts(self, only_non_negative: Optional[bool]=True) -> int: ...
def hasOnlyInts(self, only_non_negative: Optional[bool]=True) -> bool: ...
def encode(self) -> bytes: ...
- def decode(self, der_encoded: bytes, strict: Optional[bool]=False, nr_elements: Optional[int]=None, only_ints_expected: Optional[bool]=False) -> DerSequence: ...
+ def decode(self, der_encoded: bytes, strict: bool=..., nr_elements: Optional[int]=None, only_ints_expected: Optional[bool]=False) -> DerSequence: ...
class DerOctetString(DerObject):
payload: bytes
@@ -54,13 +60,13 @@ class DerObjectId(DerObject):
value: str
def __init__(self, value: Optional[str]=..., implicit: Optional[int]=None, explicit: Optional[int]=None) -> None: ...
def encode(self) -> bytes: ...
- def decode(self, der_encoded: bytes, strict: Optional[bool]=False) -> DerObjectId: ...
+ def decode(self, der_encoded: bytes, strict: bool=...) -> DerObjectId: ...
class DerBitString(DerObject):
value: bytes
def __init__(self, value: Optional[bytes]=..., implicit: Optional[int]=None, explicit: Optional[int]=None) -> None: ...
def encode(self) -> bytes: ...
- def decode(self, der_encoded: bytes, strict: Optional[bool]=False) -> DerBitString: ...
+ def decode(self, der_encoded: bytes, strict: bool=...) -> DerBitString: ...
DerSetElement = Union[bytes, int]
@@ -70,5 +76,5 @@ class DerSetOf(DerObject):
def __iter__(self) -> Iterable: ...
def __len__(self) -> int: ...
def add(self, elem: DerSetElement) -> None: ...
- def decode(self, der_encoded: bytes, strict: Optional[bool]=False) -> DerObject: ...
+ def decode(self, der_encoded: bytes, strict: bool=...) -> DerObject: ...
def encode(self) -> bytes: ...
diff --git a/frozen_deps/Cryptodome/Util/number.py b/frozen_deps/Cryptodome/Util/number.py
index 5af85a3..6d59fd9 100644
--- a/frozen_deps/Cryptodome/Util/number.py
+++ b/frozen_deps/Cryptodome/Util/number.py
@@ -51,12 +51,8 @@ def size (N):
"""Returns the size of the number N in bits."""
if N < 0:
- raise ValueError("Size in bits only avialable for non-negative numbers")
-
- bits = 0
- while N >> bits:
- bits += 1
- return bits
+ raise ValueError("Size in bits only available for non-negative numbers")
+ return N.bit_length()
def getRandomInteger(N, randfunc=None):
@@ -113,27 +109,56 @@ def getRandomNBitInteger(N, randfunc=None):
assert size(value) >= N
return value
-def GCD(x,y):
- """Greatest Common Denominator of :data:`x` and :data:`y`.
- """
- x = abs(x) ; y = abs(y)
- while x > 0:
- x, y = y % x, x
- return y
+if sys.version_info[:2] >= (3, 5):
+
+ GCD = math.gcd
+
+else:
+
+ def GCD(x,y):
+ """Greatest Common Denominator of :data:`x` and :data:`y`.
+ """
+
+ x = abs(x) ; y = abs(y)
+ while x > 0:
+ x, y = y % x, x
+ return y
+
-def inverse(u, v):
- """The inverse of :data:`u` *mod* :data:`v`."""
+if sys.version_info[:2] >= (3, 8):
- u3, v3 = u, v
- u1, v1 = 1, 0
- while v3 > 0:
- q = u3 // v3
- u1, v1 = v1, u1 - v1*q
- u3, v3 = v3, u3 - v3*q
- while u1<0:
- u1 = u1 + v
- return u1
+ def inverse(u, v):
+ """The inverse of :data:`u` *mod* :data:`v`."""
+
+ if v == 0:
+ raise ZeroDivisionError("Modulus cannot be zero")
+ if v < 0:
+ raise ValueError("Modulus cannot be negative")
+
+ return pow(u, -1, v)
+
+else:
+
+ def inverse(u, v):
+ """The inverse of :data:`u` *mod* :data:`v`."""
+
+ if v == 0:
+ raise ZeroDivisionError("Modulus cannot be zero")
+ if v < 0:
+ raise ValueError("Modulus cannot be negative")
+
+ u3, v3 = u, v
+ u1, v1 = 1, 0
+ while v3 > 0:
+ q = u3 // v3
+ u1, v1 = v1, u1 - v1*q
+ u3, v3 = v3, u3 - v3*q
+ if u3 != 1:
+ raise ValueError("No inverse value can be computed")
+ while u1<0:
+ u1 = u1 + v
+ return u1
# Given a number of bits to generate and a random generation function,
# find a prime number of the appropriate size.
@@ -259,7 +284,7 @@ def getStrongPrime(N, e=0, false_positive_prob=1e-6, randfunc=None):
# calculate range for X
# lower_bound = sqrt(2) * 2^{511 + 128*x}
# upper_bound = 2^{512 + 128*x} - 1
- x = (N - 512) >> 7;
+ x = (N - 512) >> 7
# We need to approximate the sqrt(2) in the lower_bound by an integer
# expression because floating point math overflows with these numbers
lower_bound = (14142135623730950489 * (2 ** (511 + 128*x))) // 10000000000000000000
@@ -366,12 +391,12 @@ def isPrime(N, false_positive_prob=1e-6, randfunc=None):
return N == 2
for p in sieve_base:
if N == p:
- return 1
+ return True
if N % p == 0:
- return 0
+ return False
rounds = int(math.ceil(-math.log(false_positive_prob)/math.log(4)))
- return _rabinMillerTest(N, rounds, randfunc)
+ return bool(_rabinMillerTest(N, rounds, randfunc))
# Improved conversion functions contributed by Barry Warsaw, after
diff --git a/frozen_deps/Cryptodome/Util/py3compat.py b/frozen_deps/Cryptodome/Util/py3compat.py
index 9a982e9..3294b66 100644
--- a/frozen_deps/Cryptodome/Util/py3compat.py
+++ b/frozen_deps/Cryptodome/Util/py3compat.py
@@ -87,6 +87,14 @@ if sys.version_info[0] == 2:
def byte_string(s):
return isinstance(s, str)
+ # In Python 2, a memoryview does not support concatenation
+ def concat_buffers(a, b):
+ if isinstance(a, memoryview):
+ a = a.tobytes()
+ if isinstance(b, memoryview):
+ b = b.tobytes()
+ return a + b
+
from StringIO import StringIO
BytesIO = StringIO
@@ -137,6 +145,9 @@ else:
def byte_string(s):
return isinstance(s, bytes)
+ def concat_buffers(a, b):
+ return a + b
+
from io import BytesIO
from io import StringIO
from sys import maxsize as maxint
diff --git a/frozen_deps/Cryptodome/__init__.py b/frozen_deps/Cryptodome/__init__.py
index 9c2f83b..c33481e 100644
--- a/frozen_deps/Cryptodome/__init__.py
+++ b/frozen_deps/Cryptodome/__init__.py
@@ -1,6 +1,6 @@
__all__ = ['Cipher', 'Hash', 'Protocol', 'PublicKey', 'Util', 'Signature',
'IO', 'Math']
-version_info = (3, 15, '0')
+version_info = (3, 20, '0')
__version__ = ".".join([str(x) for x in version_info])
diff --git a/frozen_deps/_pysha3.cpython-310-x86_64-linux-gnu.so b/frozen_deps/_pysha3.cpython-310-x86_64-linux-gnu.so
index dd659ee..b075af6 100755
--- a/frozen_deps/_pysha3.cpython-310-x86_64-linux-gnu.so
+++ b/frozen_deps/_pysha3.cpython-310-x86_64-linux-gnu.so
Binary files differ
diff --git a/frozen_deps/_pysha3.cpython-38-x86_64-linux-gnu.so b/frozen_deps/_pysha3.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index 0d09638..0000000
--- a/frozen_deps/_pysha3.cpython-38-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/_pysha3.cpython-39-x86_64-linux-gnu.so b/frozen_deps/_pysha3.cpython-39-x86_64-linux-gnu.so
deleted file mode 100755
index 833c72b..0000000
--- a/frozen_deps/_pysha3.cpython-39-x86_64-linux-gnu.so
+++ /dev/null
Binary files differ
diff --git a/frozen_deps/base58-2.0.1.dist-info/COPYING b/frozen_deps/base58-2.0.1.dist-info/COPYING
deleted file mode 100644
index 342bd62..0000000
--- a/frozen_deps/base58-2.0.1.dist-info/COPYING
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2015 David Keijser
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-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.
diff --git a/frozen_deps/base58-2.0.1.dist-info/INSTALLER b/frozen_deps/base58-2.0.1.dist-info/INSTALLER
deleted file mode 100644
index a1b589e..0000000
--- a/frozen_deps/base58-2.0.1.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/frozen_deps/base58-2.0.1.dist-info/METADATA b/frozen_deps/base58-2.0.1.dist-info/METADATA
deleted file mode 100644
index 22a37ad..0000000
--- a/frozen_deps/base58-2.0.1.dist-info/METADATA
+++ /dev/null
@@ -1,20 +0,0 @@
-Metadata-Version: 2.1
-Name: base58
-Version: 2.0.1
-Summary: Base58 and Base58Check implementation
-Home-page: https://github.com/keis/base58
-Author: David Keijser
-Author-email: [email protected]
-License: MIT
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: Natural Language :: English
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3
-Requires-Python: >=3.5
-
-UNKNOWN
-
-
diff --git a/frozen_deps/base58-2.0.1.dist-info/RECORD b/frozen_deps/base58-2.0.1.dist-info/RECORD
deleted file mode 100644
index d20c1c2..0000000
--- a/frozen_deps/base58-2.0.1.dist-info/RECORD
+++ /dev/null
@@ -1,13 +0,0 @@
-../../bin/base58,sha256=WWCKVkDRfe64OQtfsxf-b0PQGIclDIn84xO8gkjjWcY,213
-base58-2.0.1.dist-info/COPYING,sha256=z0aU8EC3oxzY7D280LWDpgHA1MN94Ba-eqCgbjpqOlQ,1057
-base58-2.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-base58-2.0.1.dist-info/METADATA,sha256=r4yScmUS3A8Yx7mmsSyaqfMSINg6FAIQK2ocWJO1tJw,540
-base58-2.0.1.dist-info/RECORD,,
-base58-2.0.1.dist-info/WHEEL,sha256=p46_5Uhzqz6AzeSosiOnxK-zmFja1i22CrQCjmYe8ec,92
-base58-2.0.1.dist-info/entry_points.txt,sha256=7WwcggBSeBwcC22-LkpqMOCaPdey0nOG3QEaKok403Y,49
-base58-2.0.1.dist-info/top_level.txt,sha256=BVSonMPECDcX_2XqQ7iILRqitlshZNNEmLCEWlpvUvI,7
-base58/__init__.py,sha256=ccX9CZMek4UC0edA_cHs71MgC4YqJCPBhvycuzhbucc,3085
-base58/__main__.py,sha256=OiE3DXq4vwYyAVYC3SM9Y0AQbMuS2IA0v2mvzwv96pk,1080
-base58/__pycache__/__init__.cpython-38.pyc,,
-base58/__pycache__/__main__.cpython-38.pyc,,
-base58/py.typed,sha256=dcrsqJrcYfTX-ckLFJMTaj6mD8aDe2u0tkQG-ZYxnEg,26
diff --git a/frozen_deps/base58-2.0.1.dist-info/WHEEL b/frozen_deps/base58-2.0.1.dist-info/WHEEL
deleted file mode 100644
index 3b5c403..0000000
--- a/frozen_deps/base58-2.0.1.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.33.6)
-Root-Is-Purelib: true
-Tag: py3-none-any
-
diff --git a/frozen_deps/base58-2.0.1.dist-info/entry_points.txt b/frozen_deps/base58-2.0.1.dist-info/entry_points.txt
deleted file mode 100644
index dc6d6a2..0000000
--- a/frozen_deps/base58-2.0.1.dist-info/entry_points.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-[console_scripts]
-base58 = base58.__main__:main
-
diff --git a/frozen_deps/base58-2.0.1.dist-info/top_level.txt b/frozen_deps/base58-2.0.1.dist-info/top_level.txt
deleted file mode 100644
index b4c9d71..0000000
--- a/frozen_deps/base58-2.0.1.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-base58
diff --git a/frozen_deps/base58-2.1.0.dist-info/COPYING b/frozen_deps/base58-2.1.0.dist-info/COPYING
deleted file mode 100644
index 342bd62..0000000
--- a/frozen_deps/base58-2.1.0.dist-info/COPYING
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2015 David Keijser
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-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.
diff --git a/frozen_deps/base58-2.1.0.dist-info/INSTALLER b/frozen_deps/base58-2.1.0.dist-info/INSTALLER
deleted file mode 100644
index a1b589e..0000000
--- a/frozen_deps/base58-2.1.0.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/frozen_deps/base58-2.1.0.dist-info/METADATA b/frozen_deps/base58-2.1.0.dist-info/METADATA
deleted file mode 100644
index 4ee2342..0000000
--- a/frozen_deps/base58-2.1.0.dist-info/METADATA
+++ /dev/null
@@ -1,85 +0,0 @@
-Metadata-Version: 2.1
-Name: base58
-Version: 2.1.0
-Summary: Base58 and Base58Check implementation.
-Home-page: https://github.com/keis/base58
-Author: David Keijser
-Author-email: [email protected]
-License: MIT
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3
-Requires-Python: >=3.5
-Description-Content-Type: text/markdown
-Provides-Extra: tests
-Requires-Dist: pytest (>=4.6) ; extra == 'tests'
-Requires-Dist: pytest-flake8 ; extra == 'tests'
-Requires-Dist: pytest-cov ; extra == 'tests'
-Requires-Dist: PyHamcrest (>=2.0.2) ; extra == 'tests'
-Requires-Dist: coveralls ; extra == 'tests'
-Requires-Dist: pytest-benchmark ; extra == 'tests'
-
-# base58
-
-[![PyPI Version][pypi-image]](https://pypi.python.org/pypi?name=base58&:action=display)
-[![PyPI Downloads][pypi-downloads-image]](https://pypi.python.org/pypi?name=base58&:action=display)
-[![Build Status][travis-image]](https://travis-ci.org/keis/base58)
-[![Coverage Status][coveralls-image]](https://coveralls.io/r/keis/base58?branch=master)
-
-Base58 and Base58Check implementation compatible with what is used by the
-bitcoin network. Any other alternative alphabet (like the XRP one) can be used.
-
-Starting from version 2.0.0 **python2 is no longer supported** the 1.x series
-will remain supported but no new features will be added.
-
-
-## Command line usage
-
- $ printf "hello world" | base58
- StV1DL6CwTryKyV
-
- $ printf "hello world" | base58 -c
- 3vQB7B6MrGQZaxCuFg4oh
-
- $ printf "3vQB7B6MrGQZaxCuFg4oh" | base58 -dc
- hello world
-
- $ printf "4vQB7B6MrGQZaxCuFg4oh" | base58 -dc
- Invalid checksum
-
-
-## Module usage
-
- >>> import base58
- >>> base58.b58encode(b'hello world')
- b'StV1DL6CwTryKyV'
- >>> base58.b58decode(b'StV1DL6CwTryKyV')
- b'hello world'
- >>> base58.b58encode_check(b'hello world')
- b'3vQB7B6MrGQZaxCuFg4oh'
- >>> base58.b58decode_check(b'3vQB7B6MrGQZaxCuFg4oh')
- b'hello world'
- >>> base58.b58decode_check(b'4vQB7B6MrGQZaxCuFg4oh')
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- File "base58.py", line 89, in b58decode_check
- raise ValueError("Invalid checksum")
- ValueError: Invalid checksum
- # Use another alphabet. Here, using the built-in XRP/Ripple alphabet.
- # RIPPLE_ALPHABET is provided as an option for compatibility with existing code
- # It is recommended to use XRP_ALPHABET instead
- >>> base58.b58encode(b'hello world', alphabet=base58.XRP_ALPHABET)
- b'StVrDLaUATiyKyV'
- >>> base58.b58decode(b'StVrDLaUATiyKyV', alphabet=base58.XRP_ALPHABET)
- b'hello world'
-
-
-[pypi-image]: https://img.shields.io/pypi/v/base58.svg?style=flat
-[pypi-downloads-image]: https://img.shields.io/pypi/dm/base58.svg?style=flat
-[travis-image]: https://img.shields.io/travis/keis/base58.svg?style=flat
-[coveralls-image]: https://img.shields.io/coveralls/keis/base58.svg?style=flat
-
-
diff --git a/frozen_deps/base58-2.1.0.dist-info/RECORD b/frozen_deps/base58-2.1.0.dist-info/RECORD
deleted file mode 100644
index 5fa7fae..0000000
--- a/frozen_deps/base58-2.1.0.dist-info/RECORD
+++ /dev/null
@@ -1,13 +0,0 @@
-../../bin/base58,sha256=WWCKVkDRfe64OQtfsxf-b0PQGIclDIn84xO8gkjjWcY,213
-base58-2.1.0.dist-info/COPYING,sha256=z0aU8EC3oxzY7D280LWDpgHA1MN94Ba-eqCgbjpqOlQ,1057
-base58-2.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-base58-2.1.0.dist-info/METADATA,sha256=rnc2PugyMJWJJs4oz7ckzIa-BHygXoRp-MRFvxtgR3s,3061
-base58-2.1.0.dist-info/RECORD,,
-base58-2.1.0.dist-info/WHEEL,sha256=p46_5Uhzqz6AzeSosiOnxK-zmFja1i22CrQCjmYe8ec,92
-base58-2.1.0.dist-info/entry_points.txt,sha256=7WwcggBSeBwcC22-LkpqMOCaPdey0nOG3QEaKok403Y,49
-base58-2.1.0.dist-info/top_level.txt,sha256=BVSonMPECDcX_2XqQ7iILRqitlshZNNEmLCEWlpvUvI,7
-base58/__init__.py,sha256=vIiuLEAvMrLNwZyO6b4NZa_a2KU3Tdsey0FmtXzJuOw,4068
-base58/__main__.py,sha256=3rysVZfdK6HC2DXk5XdRQntooSxBevh_yO1oi_Pqb4M,1183
-base58/__pycache__/__init__.cpython-39.pyc,,
-base58/__pycache__/__main__.cpython-39.pyc,,
-base58/py.typed,sha256=dcrsqJrcYfTX-ckLFJMTaj6mD8aDe2u0tkQG-ZYxnEg,26
diff --git a/frozen_deps/base58-2.1.0.dist-info/WHEEL b/frozen_deps/base58-2.1.0.dist-info/WHEEL
deleted file mode 100644
index 3b5c403..0000000
--- a/frozen_deps/base58-2.1.0.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.33.6)
-Root-Is-Purelib: true
-Tag: py3-none-any
-
diff --git a/frozen_deps/base58-2.1.0.dist-info/entry_points.txt b/frozen_deps/base58-2.1.0.dist-info/entry_points.txt
deleted file mode 100644
index dc6d6a2..0000000
--- a/frozen_deps/base58-2.1.0.dist-info/entry_points.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-[console_scripts]
-base58 = base58.__main__:main
-
diff --git a/frozen_deps/base58-2.1.0.dist-info/top_level.txt b/frozen_deps/base58-2.1.0.dist-info/top_level.txt
deleted file mode 100644
index b4c9d71..0000000
--- a/frozen_deps/base58-2.1.0.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-base58
diff --git a/frozen_deps/base58-2.1.1.dist-info/COPYING b/frozen_deps/base58-2.1.1.dist-info/COPYING
deleted file mode 100644
index 342bd62..0000000
--- a/frozen_deps/base58-2.1.1.dist-info/COPYING
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2015 David Keijser
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-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.
diff --git a/frozen_deps/base58-2.1.1.dist-info/INSTALLER b/frozen_deps/base58-2.1.1.dist-info/INSTALLER
deleted file mode 100644
index a1b589e..0000000
--- a/frozen_deps/base58-2.1.1.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/frozen_deps/base58-2.1.1.dist-info/METADATA b/frozen_deps/base58-2.1.1.dist-info/METADATA
deleted file mode 100644
index 8c2e644..0000000
--- a/frozen_deps/base58-2.1.1.dist-info/METADATA
+++ /dev/null
@@ -1,86 +0,0 @@
-Metadata-Version: 2.1
-Name: base58
-Version: 2.1.1
-Summary: Base58 and Base58Check implementation.
-Home-page: https://github.com/keis/base58
-Author: David Keijser
-Author-email: [email protected]
-License: MIT
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3
-Requires-Python: >=3.5
-Description-Content-Type: text/markdown
-License-File: COPYING
-Provides-Extra: tests
-Requires-Dist: mypy ; extra == 'tests'
-Requires-Dist: PyHamcrest (>=2.0.2) ; extra == 'tests'
-Requires-Dist: pytest (>=4.6) ; extra == 'tests'
-Requires-Dist: pytest-benchmark ; extra == 'tests'
-Requires-Dist: pytest-cov ; extra == 'tests'
-Requires-Dist: pytest-flake8 ; extra == 'tests'
-
-# base58
-
-[![PyPI Version][pypi-image]](https://pypi.python.org/pypi?name=base58&:action=display)
-[![PyPI Downloads][pypi-downloads-image]](https://pypi.python.org/pypi?name=base58&:action=display)
-[![Build Status][travis-image]](https://travis-ci.org/keis/base58)
-[![Coverage Status][coveralls-image]](https://coveralls.io/r/keis/base58?branch=master)
-
-Base58 and Base58Check implementation compatible with what is used by the
-bitcoin network. Any other alternative alphabet (like the XRP one) can be used.
-
-Starting from version 2.0.0 **python2 is no longer supported** the 1.x series
-will remain supported but no new features will be added.
-
-
-## Command line usage
-
- $ printf "hello world" | base58
- StV1DL6CwTryKyV
-
- $ printf "hello world" | base58 -c
- 3vQB7B6MrGQZaxCuFg4oh
-
- $ printf "3vQB7B6MrGQZaxCuFg4oh" | base58 -dc
- hello world
-
- $ printf "4vQB7B6MrGQZaxCuFg4oh" | base58 -dc
- Invalid checksum
-
-
-## Module usage
-
- >>> import base58
- >>> base58.b58encode(b'hello world')
- b'StV1DL6CwTryKyV'
- >>> base58.b58decode(b'StV1DL6CwTryKyV')
- b'hello world'
- >>> base58.b58encode_check(b'hello world')
- b'3vQB7B6MrGQZaxCuFg4oh'
- >>> base58.b58decode_check(b'3vQB7B6MrGQZaxCuFg4oh')
- b'hello world'
- >>> base58.b58decode_check(b'4vQB7B6MrGQZaxCuFg4oh')
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- File "base58.py", line 89, in b58decode_check
- raise ValueError("Invalid checksum")
- ValueError: Invalid checksum
- # Use another alphabet. Here, using the built-in XRP/Ripple alphabet.
- # RIPPLE_ALPHABET is provided as an option for compatibility with existing code
- # It is recommended to use XRP_ALPHABET instead
- >>> base58.b58encode(b'hello world', alphabet=base58.XRP_ALPHABET)
- b'StVrDLaUATiyKyV'
- >>> base58.b58decode(b'StVrDLaUATiyKyV', alphabet=base58.XRP_ALPHABET)
- b'hello world'
-
-
-[pypi-image]: https://img.shields.io/pypi/v/base58.svg?style=flat
-[pypi-downloads-image]: https://img.shields.io/pypi/dm/base58.svg?style=flat
-[travis-image]: https://img.shields.io/travis/keis/base58.svg?style=flat
-[coveralls-image]: https://img.shields.io/coveralls/keis/base58.svg?style=flat
-
-
diff --git a/frozen_deps/base58-2.1.1.dist-info/RECORD b/frozen_deps/base58-2.1.1.dist-info/RECORD
deleted file mode 100644
index e012c40..0000000
--- a/frozen_deps/base58-2.1.1.dist-info/RECORD
+++ /dev/null
@@ -1,13 +0,0 @@
-../../bin/base58,sha256=WWCKVkDRfe64OQtfsxf-b0PQGIclDIn84xO8gkjjWcY,213
-base58-2.1.1.dist-info/COPYING,sha256=z0aU8EC3oxzY7D280LWDpgHA1MN94Ba-eqCgbjpqOlQ,1057
-base58-2.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-base58-2.1.1.dist-info/METADATA,sha256=OMWrHqwTJgXypOcS0Tdx3XBESZ5Y4terXPUBfg07Vd0,3078
-base58-2.1.1.dist-info/RECORD,,
-base58-2.1.1.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92
-base58-2.1.1.dist-info/entry_points.txt,sha256=7WwcggBSeBwcC22-LkpqMOCaPdey0nOG3QEaKok403Y,49
-base58-2.1.1.dist-info/top_level.txt,sha256=BVSonMPECDcX_2XqQ7iILRqitlshZNNEmLCEWlpvUvI,7
-base58/__init__.py,sha256=7HvHX-In8vY_AJIGqPYhMRuibYkWNEU0yiquapCDKpw,4059
-base58/__main__.py,sha256=3rysVZfdK6HC2DXk5XdRQntooSxBevh_yO1oi_Pqb4M,1183
-base58/__pycache__/__init__.cpython-310.pyc,,
-base58/__pycache__/__main__.cpython-310.pyc,,
-base58/py.typed,sha256=dcrsqJrcYfTX-ckLFJMTaj6mD8aDe2u0tkQG-ZYxnEg,26
diff --git a/frozen_deps/base58-2.1.1.dist-info/WHEEL b/frozen_deps/base58-2.1.1.dist-info/WHEEL
deleted file mode 100644
index 5bad85f..0000000
--- a/frozen_deps/base58-2.1.1.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.37.0)
-Root-Is-Purelib: true
-Tag: py3-none-any
-
diff --git a/frozen_deps/base58-2.1.1.dist-info/entry_points.txt b/frozen_deps/base58-2.1.1.dist-info/entry_points.txt
deleted file mode 100644
index dc6d6a2..0000000
--- a/frozen_deps/base58-2.1.1.dist-info/entry_points.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-[console_scripts]
-base58 = base58.__main__:main
-
diff --git a/frozen_deps/base58-2.1.1.dist-info/top_level.txt b/frozen_deps/base58-2.1.1.dist-info/top_level.txt
deleted file mode 100644
index b4c9d71..0000000
--- a/frozen_deps/base58-2.1.1.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-base58
diff --git a/frozen_deps/bech32.py b/frozen_deps/bech32.py
deleted file mode 100644
index d450080..0000000
--- a/frozen_deps/bech32.py
+++ /dev/null
@@ -1,123 +0,0 @@
-# Copyright (c) 2017 Pieter Wuille
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# 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.
-
-"""Reference implementation for Bech32 and segwit addresses."""
-
-
-CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"
-
-
-def bech32_polymod(values):
- """Internal function that computes the Bech32 checksum."""
- generator = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3]
- chk = 1
- for value in values:
- top = chk >> 25
- chk = (chk & 0x1ffffff) << 5 ^ value
- for i in range(5):
- chk ^= generator[i] if ((top >> i) & 1) else 0
- return chk
-
-
-def bech32_hrp_expand(hrp):
- """Expand the HRP into values for checksum computation."""
- return [ord(x) >> 5 for x in hrp] + [0] + [ord(x) & 31 for x in hrp]
-
-
-def bech32_verify_checksum(hrp, data):
- """Verify a checksum given HRP and converted data characters."""
- return bech32_polymod(bech32_hrp_expand(hrp) + data) == 1
-
-
-def bech32_create_checksum(hrp, data):
- """Compute the checksum values given HRP and data."""
- values = bech32_hrp_expand(hrp) + data
- polymod = bech32_polymod(values + [0, 0, 0, 0, 0, 0]) ^ 1
- return [(polymod >> 5 * (5 - i)) & 31 for i in range(6)]
-
-
-def bech32_encode(hrp, data):
- """Compute a Bech32 string given HRP and data values."""
- combined = data + bech32_create_checksum(hrp, data)
- return hrp + '1' + ''.join([CHARSET[d] for d in combined])
-
-
-def bech32_decode(bech):
- """Validate a Bech32 string, and determine HRP and data."""
- if ((any(ord(x) < 33 or ord(x) > 126 for x in bech)) or
- (bech.lower() != bech and bech.upper() != bech)):
- return (None, None)
- bech = bech.lower()
- pos = bech.rfind('1')
- if pos < 1 or pos + 7 > len(bech) or len(bech) > 90:
- return (None, None)
- if not all(x in CHARSET for x in bech[pos+1:]):
- return (None, None)
- hrp = bech[:pos]
- data = [CHARSET.find(x) for x in bech[pos+1:]]
- if not bech32_verify_checksum(hrp, data):
- return (None, None)
- return (hrp, data[:-6])
-
-
-def convertbits(data, frombits, tobits, pad=True):
- """General power-of-2 base conversion."""
- acc = 0
- bits = 0
- ret = []
- maxv = (1 << tobits) - 1
- max_acc = (1 << (frombits + tobits - 1)) - 1
- for value in data:
- if value < 0 or (value >> frombits):
- return None
- acc = ((acc << frombits) | value) & max_acc
- bits += frombits
- while bits >= tobits:
- bits -= tobits
- ret.append((acc >> bits) & maxv)
- if pad:
- if bits:
- ret.append((acc << (tobits - bits)) & maxv)
- elif bits >= frombits or ((acc << (tobits - bits)) & maxv):
- return None
- return ret
-
-
-def decode(hrp, addr):
- """Decode a segwit address."""
- hrpgot, data = bech32_decode(addr)
- if hrpgot != hrp:
- return (None, None)
- decoded = convertbits(data[1:], 5, 8, False)
- if decoded is None or len(decoded) < 2 or len(decoded) > 40:
- return (None, None)
- if data[0] > 16:
- return (None, None)
- if data[0] == 0 and len(decoded) != 20 and len(decoded) != 32:
- return (None, None)
- return (data[0], decoded)
-
-
-def encode(hrp, witver, witprog):
- """Encode a segwit address."""
- ret = bech32_encode(hrp, [witver] + convertbits(witprog, 8, 5))
- if decode(hrp, ret) == (None, None):
- return None
- return ret
diff --git a/frozen_deps/bin/base58 b/frozen_deps/bin/base58
deleted file mode 100755
index 1e291f0..0000000
--- a/frozen_deps/bin/base58
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-import re
-import sys
-from base58.__main__ import main
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(main())
diff --git a/frozen_deps/bin/keytree.py b/frozen_deps/bin/keytree.py
deleted file mode 100755
index 885299a..0000000
--- a/frozen_deps/bin/keytree.py
+++ /dev/null
@@ -1,438 +0,0 @@
-#!/usr/bin/python
-# MIT License
-#
-# Copyright (c) 2020 Ted Yin <[email protected]>
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in all
-# copies or substantial portions of the Software.
-#
-# 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 little script offers decryption and verification of the existing
-# Ethereum wallets, as well as generation of a new wallet. You can use any
-# utf-8 string as the password, which could provide with better security
-# against the brute-force attack.
-
-# Use at your own risk.
-#
-# Example:
-# python3 ./keytree.py
-
-import os
-import sys
-if sys.version_info[1] < 7:
- sys.write("Python should be >= 3.7")
- sys.exit(1)
-basedir = os.path.dirname(os.path.abspath(__file__))
-sys.path.insert(0, basedir + "/frozen_deps")
-
-import re
-import argparse
-import hashlib
-import hmac
-import unicodedata
-import json
-from getpass import getpass as _getpass
-
-import bech32
-import mnemonic
-from ecdsa import SigningKey, VerifyingKey, SECP256k1
-from ecdsa.ecdsa import generator_secp256k1
-from ecdsa.ellipticcurve import INFINITY
-from base58 import b58encode, b58decode
-from sha3 import keccak_256
-from uuid import uuid4
-from Cryptodome.Cipher import AES
-from Cryptodome.Util import Counter
-
-
-def getpass(prompt):
- if sys.stdin.isatty():
- return _getpass(prompt)
- else:
- return sys.stdin.readline()
-
-
-def sha256(data):
- h = hashlib.sha256()
- h.update(data)
- return h.digest()
-
-
-def ripemd160(data):
- h = hashlib.new('ripemd160')
- h.update(data)
- return h.digest()
-
-
-class KeytreeError(Exception):
- pass
-
-
-class BIP32Error(KeytreeError):
- pass
-
-
-# point(p): returns the coordinate pair resulting from EC point multiplication
-# (repeated application of the EC group operation) of the secp256k1 base point
-# with the integer p.
-def point(p):
- return generator_secp256k1 * p
-
-
-# ser32(i): serialize a 32-bit unsigned integer i as a 4-byte sequence, most
-# significant byte first.
-def ser32(i):
- return i.to_bytes(4, byteorder='big')
-
-
-# ser256(p): serializes the integer p as a 32-byte sequence, most significant
-# byte first.
-def ser256(p):
- return p.to_bytes(32, byteorder='big')
-
-
-# serP(P): serializes the coordinate pair P = (x,y) as a byte sequence using
-# SEC1's compressed form: (0x02 or 0x03) || ser256(x), where the header byte
-# depends on the parity of the omitted y coordinate.
-def serP(P):
- if P.y() & 1 == 0:
- parity = b'\x02'
- else:
- parity = b'\x03'
- return parity + ser256(P.x())
-
-
-def is_infinity(P):
- return P == INFINITY
-
-
-# parse256(p): interprets a 32-byte sequence as a 256-bit number, most
-# significant byte first.
-def parse256(p):
- assert(len(p) == 32)
- return int.from_bytes(p, byteorder='big')
-
-
-def iH(x):
- return x + (1 << 31)
-
-
-n = generator_secp256k1.order()
-rformat = re.compile(r"^[0-9]+'?$")
-
-
-def ckd_pub(K_par, c_par, i):
- if i >= 1 << 31:
- raise BIP32Error("the child is a hardended key")
- I = hmac.digest(
- c_par, serP(K_par) + ser32(i), 'sha512')
- I_L, I_R = I[:32], I[32:]
- K_i = point(parse256(I_L)) + K_par
- c_i = I_R
- if parse256(I_L) >= n or is_infinity(K_i):
- raise BIP32Error("invalid i")
- return K_i, c_i
-
-def ckd_prv(k_par, c_par, i):
- if i >= 1 << 31:
- I = hmac.digest(
- c_par, b'\x00' + ser256(k_par) + ser32(i), 'sha512')
- else:
- I = hmac.digest(
- c_par, serP(point(k_par)) + ser32(i), 'sha512')
- I_L, I_R = I[:32], I[32:]
- k_i = (parse256(I_L) + k_par) % n
- c_i = I_R
- if parse256(I_L) >= n or k_i == 0:
- raise BIP32Error("invalid i")
- return k_i, c_i
-
-class BIP32:
- path_error = BIP32Error("unsupported BIP32 path format")
-
- def __init__(self, seed, key="Bitcoin seed"):
- I = hmac.digest(b"Bitcoin seed", seed, 'sha512')
- I_L, I_R = I[:32], I[32:]
- self.m = parse256(I_L)
- self.M = SigningKey.from_string(I_L, curve=SECP256k1) \
- .get_verifying_key().pubkey.point
- self.c = I_R
-
- def derive(self, path="m"):
- tokens = path.split('/')
- if tokens[0] == "m":
- k = self.m
- c = self.c
- for r in tokens[1:]:
- if not rformat.match(r):
- raise self.path_error
- if r[-1] == "'":
- i = iH(int(r[:-1]))
- else:
- i = int(r)
- k, c = ckd_prv(k, c, i)
- return SigningKey.from_string(k.to_bytes(32, byteorder='big'), curve=SECP256k1)
- elif tokens[0] == "M":
- K = self.M
- c = self.c
- for r in tokens[1:]:
- if not rformat.match(r):
- raise self.path_error
- if r[-1] == "'":
- i = iH(int(r[:-1]))
- else:
- i = int(r)
- K, c = ckd_pub(K, c, i)
- return VerifyingKey.from_public_point(K, curve=SECP256k1)
- else:
- raise self.path_error
-
-def get_eth_addr(pk):
- pub_key = pk.to_string()
- m = keccak_256()
- m.update(pub_key)
- return m.hexdigest()[24:]
-
-def get_privkey_btc(sk):
- priv_key = b'\x80' + sk.to_string()
- checksum = sha256(sha256(priv_key))[:4]
- return b58encode(priv_key + checksum).decode("utf-8")
-
-def get_btc_addr(pk):
- h = b'\x00' + ripemd160(sha256(b'\x04' + pk.to_string()))
- checksum = sha256(sha256(h))[:4]
- h += checksum
- return b58encode(h).decode("utf-8")
-
-def load_from_keystore(filename):
- try:
- with open(filename, "r") as f:
- try:
- parsed = json.load(f)
- version = parsed['version']
- try:
- if parsed['keys'][0]['type'] != 'mnemonic':
- raise KeytreeError("not a mnemonic keystore file")
- except KeyError:
- pass
- ciphertext = b58decode(parsed['keys'][0]['key'])[:-4]
- iv = b58decode(parsed['keys'][0]['iv'])[:-4]
- salt = b58decode(parsed['salt'])[:-4]
- passwd = getpass('Enter the password to unlock keystore: ').encode('utf-8')
- key = hashlib.pbkdf2_hmac(
- 'sha256',
- sha256(passwd + salt), salt, 200000)
- a = AES.new(key,
- mode=AES.MODE_GCM,
- nonce=iv).update(salt)
- if version == '5.0':
- tag = b58decode(parsed['pass_hash'])[:-4]
- if tag != sha256(passwd + sha256(passwd + salt)):
- raise KeytreeError("incorrect keystore password")
- try:
- return a.decrypt_and_verify(ciphertext[:-16], ciphertext[-16:]).decode('utf-8')
- except:
- raise KeytreeError("incorrect keystore password")
- except KeytreeError as e:
- raise e
- except:
- raise KeytreeError("invalid or corrupted keystore file")
- except FileNotFoundError:
- raise KeytreeError("failed to open file")
-
-
-def cb58encode(raw):
- checksum = sha256(raw)[-4:]
- return b58encode(raw + checksum).decode('utf-8')
-
-
-def save_to_keystore(filename, words):
- try:
- with open(filename, "w") as f:
- passwd = getpass('Enter the password for saving (utf-8): ').encode('utf-8')
- passwd2 = getpass('Enter the password again (utf-8): ').encode('utf-8')
- if passwd != passwd2:
- raise KeytreeError("mismatching passwords")
- iv = os.urandom(12)
- salt = os.urandom(16)
- # pass_hash = sha256(passwd + sha256(passwd + salt))
- key = hashlib.pbkdf2_hmac(
- 'sha256',
- sha256(passwd + salt), salt, 200000)
- a = AES.new(key,
- mode=AES.MODE_GCM,
- nonce=iv).update(salt)
- (c, t) = a.encrypt_and_digest(words.encode('utf-8'))
- ciphertext = c + t
- json.dump({
- 'version': "6.0",
- 'activeIndex': 0,
- 'keys': [
- {
- 'key': cb58encode(ciphertext),
- 'iv': cb58encode(iv),
- 'type': 'mnemonic'
- }],
- 'salt': cb58encode(salt),
- # 'pass_hash': cb58encode(pass_hash)
- }, f)
- except FileNotFoundError:
- raise KeytreeError("failed while saving")
-
-
-# MEW keystore format (version 3.0)
-def save_to_mew(priv_keys, n=1 << 18, p=1, r=8, dklen=32):
- try:
- passwd = getpass('Enter the password for saving (utf-8): ').encode('utf-8')
- passwd2 = getpass('Enter the password again (utf-8): ').encode('utf-8')
- if passwd != passwd2:
- raise KeytreeError("mismatching passwords")
-
- for priv_key in priv_keys:
- addr = get_eth_addr(priv_key.get_verifying_key())
- priv_key = priv_key.to_string()
- with open("mew-{}.json".format(addr), "w") as f:
- iv = os.urandom(16)
- salt = os.urandom(16)
-
- m = 128 * r * (n + p + 2)
- dk = hashlib.scrypt(passwd, salt=salt,
- n=n, r=r, p=p, dklen=dklen, maxmem=m)
- obj = AES.new(dk[:dklen >> 1],
- mode=AES.MODE_CTR,
- counter=Counter.new(
- 128,
- initial_value=int.from_bytes(iv, 'big')))
- enc_pk = obj.encrypt(priv_key)
-
- # generate MAC
- h = keccak_256()
- h.update(dk[len(dk) >> 1:])
- h.update(enc_pk)
- mac = h.digest()
-
- crypto = {
- 'ciphertext': enc_pk.hex(),
- 'cipherparams': {'iv': iv.hex()},
- 'cipher': 'aes-128-ctr',
- 'kdf': 'scrypt',
- 'kdfparams': {'dklen': dklen,
- 'salt': salt.hex(),
- 'n': n,
- 'r': r,
- 'p': p},
- 'mac': mac.hex()}
- json.dump({
- 'version': 3,
- 'id': str(uuid4()),
- 'address': addr,
- 'Crypto': crypto}, f)
- except FileNotFoundError:
- raise KeytreeError("failed while saving")
-
-
-metamask_path = r"44'/60'/0'/0"
-avax_path = r"44'/9000'/0'/0"
-
-if __name__ == '__main__':
- parser = argparse.ArgumentParser(description='Derive BIP32 key pairs from BIP39 mnemonic')
- parser.add_argument('--load', type=str, default=None, help='load mnemonic from a file (AVAX Wallet compatible)')
- parser.add_argument('--save', type=str, default=None, help='save mnemonic to a file (AVAX Wallet compatible)')
- parser.add_argument('--export-mew', action='store_true', default=False, help='export keys to MEW keystore files (mnemonic is NOT saved, only keys are saved)')
- parser.add_argument('--show-private', action='store_true', default=False, help='also show private keys and the mnemonic')
- parser.add_argument('--custom', action='store_true', default=False, help='use an arbitrary word combination as mnemonic')
- parser.add_argument('--seed', action='store_true', default=False, help='load mnemonic from seed')
- parser.add_argument('--path', default=avax_path, help="path prefix for key deriving (e.g. \"{}\" for Metamask)".format(metamask_path))
- parser.add_argument('--metamask', action='store_true', default=False, help="use metamask path for key deriving (synonym to `--path \"{}\"`)".format(metamask_path))
- parser.add_argument('--gen-mnemonic', action='store_true', default=False, help='generate a mnemonic (instead of taking an input)')
- parser.add_argument('--lang', type=str, default="english", help='language for mnemonic words')
- parser.add_argument('--start-idx', type=int, default=0, help='the start index for keys')
- parser.add_argument('--end-idx', type=int, default=1, help='the end index for keys (exclusive)')
- parser.add_argument('--hrp', type=str, default="avax", help='HRP (Human Readable Prefix, defined by Bech32)')
-
- args, unknown = parser.parse_known_args()
-
- try:
- for arg in unknown:
- if len(arg) > 0:
- raise KeytreeError("invalid argument: `{}`".format(arg))
- try:
- if args.gen_mnemonic:
- mgen = mnemonic.Mnemonic(args.lang)
- words = mgen.generate(256)
- else:
- if args.load:
- words = load_from_keystore(args.load)
- elif not args.seed:
- words = getpass('Enter the mnemonic: ').strip()
- if not args.custom:
- mchecker = mnemonic.Mnemonic(args.lang)
- if not mchecker.check(words):
- raise KeytreeError("invalid mnemonic")
- except FileNotFoundError:
- raise KeytreeError("invalid language")
- if args.end_idx < args.start_idx:
- args.end_idx = args.start_idx + 1
- if args.seed:
- seedstr = getpass('Enter the seed: ').strip()
- try:
- seed = bytes.fromhex(seedstr)
- if len(seed) != 64:
- raise ValueError
- except ValueError:
- raise KeytreeError("invalid seed")
- else:
- seed = hashlib.pbkdf2_hmac('sha512', unicodedata.normalize('NFKD', words).encode("utf-8"), b"mnemonic", 2048)
- if args.show_private or args.gen_mnemonic:
- if not args.seed:
- print("KEEP THIS PRIVATE (mnemonic): {}".format(words))
- print("KEEP THIS PRIVATE (seed): {}".format(seed.hex()))
- gen = BIP32(seed)
- if args.start_idx < 0 or args.end_idx < 0:
- raise KeytreeError("invalid start/end index")
- keys = []
- for i in range(args.start_idx, args.end_idx):
- path = "m/{}/{}".format(metamask_path if args.metamask else args.path, i)
- priv = gen.derive(path)
- keys.append(priv)
- pub = priv.get_verifying_key()
- cpub = pub.to_string(encoding="compressed")
- if args.show_private:
- print("{}.priv(raw/ETH/AVAX-X) 0x{}".format(i, priv.to_string().hex()))
- print("{}.priv(BTC) {}".format(i, get_privkey_btc(priv)))
- print("{}.addr(AVAX-X/P) {}".format(i, bech32.bech32_encode(args.hrp, bech32.convertbits(ripemd160(sha256(cpub)), 8, 5))))
-
- path2 = "m/{}/{}".format(metamask_path, i)
- priv2 = gen.derive(path2)
- pub2 = priv2.get_verifying_key()
- if args.show_private:
- print("{}.priv(AVAX-C) 0x{}".format(i, priv2.to_string().hex()))
- print("{}.addr(AVAX-C) 0x{}".format(i, get_eth_addr(pub2)))
-
- print("{}.addr(BTC) {}".format(i, get_btc_addr(pub)))
- print("{}.addr(ETH) 0x{}".format(i, get_eth_addr(pub)))
- if args.export_mew:
- save_to_mew(keys)
- if args.save:
- save_to_keystore(args.save, words)
- print("Saved to keystore file: {}".format(args.save))
- except KeytreeError as e:
- sys.stderr.write("error: {}\n".format(str(e)))
- sys.exit(1)
- except KeyboardInterrupt:
- sys.exit(1)
diff --git a/frozen_deps/ecdsa-0.16.1.dist-info/INSTALLER b/frozen_deps/ecdsa-0.16.1.dist-info/INSTALLER
deleted file mode 100644
index a1b589e..0000000
--- a/frozen_deps/ecdsa-0.16.1.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/frozen_deps/ecdsa-0.16.1.dist-info/LICENSE b/frozen_deps/ecdsa-0.16.1.dist-info/LICENSE
deleted file mode 100644
index 474479a..0000000
--- a/frozen_deps/ecdsa-0.16.1.dist-info/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-"python-ecdsa" Copyright (c) 2010 Brian Warner
-
-Portions written in 2005 by Peter Pearson and placed in the public domain.
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-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.
diff --git a/frozen_deps/ecdsa-0.16.1.dist-info/METADATA b/frozen_deps/ecdsa-0.16.1.dist-info/METADATA
deleted file mode 100644
index 983a64a..0000000
--- a/frozen_deps/ecdsa-0.16.1.dist-info/METADATA
+++ /dev/null
@@ -1,626 +0,0 @@
-Metadata-Version: 2.1
-Name: ecdsa
-Version: 0.16.1
-Summary: ECDSA cryptographic signature library (pure python)
-Home-page: http://github.com/warner/python-ecdsa
-Author: Brian Warner
-Author-email: [email protected]
-License: MIT
-Platform: UNKNOWN
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.6
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Requires-Python: >=2.6, !=3.0.*, !=3.1.*, !=3.2.*
-Description-Content-Type: text/markdown
-Requires-Dist: six (>=1.9.0)
-Provides-Extra: gmpy
-Requires-Dist: gmpy ; extra == 'gmpy'
-Provides-Extra: gmpy2
-Requires-Dist: gmpy2 ; extra == 'gmpy2'
-
-# Pure-Python ECDSA
-
-[![build status](https://travis-ci.org/warner/python-ecdsa.png)](http://travis-ci.org/warner/python-ecdsa)
-[![Coverage Status](https://coveralls.io/repos/warner/python-ecdsa/badge.svg)](https://coveralls.io/r/warner/python-ecdsa)
-[![condition coverage](https://img.shields.io/badge/condition%20coverage-81%25-yellow)](https://travis-ci.org/warner/python-ecdsa/jobs/626479178#L776)
-[![Latest Version](https://img.shields.io/pypi/v/ecdsa.svg?style=flat)](https://pypi.python.org/pypi/ecdsa/)
-![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg?style=flat)
-
-
-This is an easy-to-use implementation of ECDSA cryptography (Elliptic Curve
-Digital Signature Algorithm), implemented purely in Python, released under
-the MIT license. With this library, you can quickly create keypairs (signing
-key and verifying key), sign messages, and verify the signatures. The keys
-and signatures are very short, making them easy to handle and incorporate
-into other protocols.
-
-## Features
-
-This library provides key generation, signing, and verifying, for five
-popular NIST "Suite B" GF(p) (_prime field_) curves, with key lengths of 192,
-224, 256, 384, and 521 bits. The "short names" for these curves, as known by
-the OpenSSL tool (`openssl ecparam -list_curves`), are: `prime192v1`,
-`secp224r1`, `prime256v1`, `secp384r1`, and `secp521r1`. It includes the
-256-bit curve `secp256k1` used by Bitcoin. There is also support for the
-regular (non-twisted) variants of Brainpool curves from 160 to 512 bits. The
-"short names" of those curves are: `brainpoolP160r1`, `brainpoolP192r1`,
-`brainpoolP224r1`, `brainpoolP256r1`, `brainpoolP320r1`, `brainpoolP384r1`,
-`brainpoolP512r1`.
-No other curves are included, but it is not too hard to add support for more
-curves over prime fields.
-
-## Dependencies
-
-This library uses only Python and the 'six' package. It is compatible with
-Python 2.6, 2.7 and 3.3+. It also supports execution on the alternative
-implementations like pypy and pypy3.
-
-If `gmpy2` or `gmpy` is installed, they will be used for faster arithmetic.
-Either of them can be installed after this library is installed,
-`python-ecdsa` will detect their presence on start-up and use them
-automatically.
-
-To run the OpenSSL compatibility tests, the 'openssl' tool must be in your
-`PATH`. This release has been tested successfully against OpenSSL 0.9.8o,
-1.0.0a, 1.0.2f and 1.1.1d (among others).
-
-
-## Installation
-
-This library is available on PyPI, it's recommended to install it using `pip`:
-
-```
-pip install ecdsa
-```
-
-In case higher performance is wanted and using native code is not a problem,
-it's possible to specify installation together with `gmpy2`:
-
-```
-pip install ecdsa[gmpy2]
-```
-
-or (slower, legacy option):
-```
-pip install ecdsa[gmpy]
-```
-
-## Speed
-
-The following table shows how long this library takes to generate keypairs
-(`keygen`), to sign data (`sign`), and to verify those signatures (`verify`).
-All those values are in seconds.
-For convenience, the inverses of those values are also provided:
-how many keys per second can be generated (`keygen/s`), how many signatures
-can be made per second (`sign/s`) and how many signatures can be verified
-per second (`verify/s`). The size of raw signature (generally the smallest
-way a signature can be encoded) is also provided in the `siglen` column.
-Use `tox -e speed` to generate this table on your own computer.
-On an Intel Core i7 4790K @ 4.0GHz I'm getting the following performance:
-
-```
- siglen keygen keygen/s sign sign/s verify verify/s
- NIST192p: 48 0.00035s 2893.02 0.00038s 2620.53 0.00069s 1458.92
- NIST224p: 56 0.00043s 2307.11 0.00048s 2092.00 0.00088s 1131.33
- NIST256p: 64 0.00056s 1793.70 0.00061s 1639.87 0.00113s 883.79
- NIST384p: 96 0.00116s 864.33 0.00124s 806.29 0.00233s 429.87
- NIST521p: 132 0.00221s 452.16 0.00234s 427.31 0.00460s 217.19
- SECP256k1: 64 0.00056s 1772.65 0.00061s 1628.73 0.00110s 912.13
- BRAINPOOLP160r1: 40 0.00026s 3801.86 0.00029s 3401.11 0.00052s 1930.47
- BRAINPOOLP192r1: 48 0.00034s 2925.73 0.00038s 2634.34 0.00070s 1438.06
- BRAINPOOLP224r1: 56 0.00044s 2287.98 0.00048s 2083.87 0.00088s 1137.52
- BRAINPOOLP256r1: 64 0.00056s 1774.11 0.00061s 1628.25 0.00112s 890.71
- BRAINPOOLP320r1: 80 0.00081s 1238.18 0.00087s 1146.71 0.00151s 661.95
- BRAINPOOLP384r1: 96 0.00117s 855.47 0.00124s 804.56 0.00241s 414.83
- BRAINPOOLP512r1: 128 0.00223s 447.99 0.00234s 427.49 0.00437s 229.09
-
- ecdh ecdh/s
- NIST192p: 0.00110s 910.70
- NIST224p: 0.00143s 701.17
- NIST256p: 0.00178s 560.44
- NIST384p: 0.00383s 261.03
- NIST521p: 0.00745s 134.23
- SECP256k1: 0.00168s 596.23
- BRAINPOOLP160r1: 0.00085s 1174.02
- BRAINPOOLP192r1: 0.00113s 883.47
- BRAINPOOLP224r1: 0.00145s 687.82
- BRAINPOOLP256r1: 0.00195s 514.03
- BRAINPOOLP320r1: 0.00277s 360.80
- BRAINPOOLP384r1: 0.00412s 242.58
- BRAINPOOLP512r1: 0.00787s 127.12
-```
-
-To test performance with `gmpy2` loaded, use `tox -e speedgmpy2`.
-On the same machine I'm getting the following performance with `gmpy2`:
-```
- siglen keygen keygen/s sign sign/s verify verify/s
- NIST192p: 48 0.00017s 5945.50 0.00018s 5544.66 0.00033s 3002.54
- NIST224p: 56 0.00021s 4742.14 0.00022s 4463.52 0.00044s 2248.59
- NIST256p: 64 0.00024s 4155.73 0.00025s 3994.28 0.00047s 2105.34
- NIST384p: 96 0.00041s 2415.06 0.00043s 2316.41 0.00085s 1177.18
- NIST521p: 132 0.00072s 1391.14 0.00074s 1359.63 0.00140s 716.31
- SECP256k1: 64 0.00024s 4216.50 0.00025s 3994.52 0.00047s 2120.57
- BRAINPOOLP160r1: 40 0.00014s 7038.99 0.00015s 6501.55 0.00029s 3397.79
- BRAINPOOLP192r1: 48 0.00017s 5983.18 0.00018s 5626.08 0.00035s 2843.62
- BRAINPOOLP224r1: 56 0.00021s 4727.54 0.00022s 4464.86 0.00043s 2326.84
- BRAINPOOLP256r1: 64 0.00024s 4221.00 0.00025s 4010.26 0.00049s 2046.40
- BRAINPOOLP320r1: 80 0.00032s 3142.14 0.00033s 3009.15 0.00061s 1652.88
- BRAINPOOLP384r1: 96 0.00041s 2415.98 0.00043s 2340.35 0.00083s 1198.77
- BRAINPOOLP512r1: 128 0.00064s 1567.27 0.00066s 1526.33 0.00127s 788.51
-
- ecdh ecdh/s
- NIST192p: 0.00051s 1960.26
- NIST224p: 0.00067s 1502.97
- NIST256p: 0.00073s 1376.12
- NIST384p: 0.00132s 758.68
- NIST521p: 0.00231s 433.23
- SECP256k1: 0.00072s 1387.18
- BRAINPOOLP160r1: 0.00042s 2366.60
- BRAINPOOLP192r1: 0.00049s 2026.80
- BRAINPOOLP224r1: 0.00067s 1486.52
- BRAINPOOLP256r1: 0.00076s 1310.31
- BRAINPOOLP320r1: 0.00101s 986.16
- BRAINPOOLP384r1: 0.00131s 761.35
- BRAINPOOLP512r1: 0.00211s 473.30
-```
-
-(there's also `gmpy` version, execute it using `tox -e speedgmpy`)
-
-For comparison, a highly optimised implementation (including curve-specific
-assembly for some curves), like the one in OpenSSL 1.1.1d, provides following
-performance numbers on the same machine.
-Run `openssl speed ecdsa` and `openssl speed ecdh` to reproduce it:
-```
- sign verify sign/s verify/s
- 192 bits ecdsa (nistp192) 0.0002s 0.0002s 4785.6 5380.7
- 224 bits ecdsa (nistp224) 0.0000s 0.0001s 22475.6 9822.0
- 256 bits ecdsa (nistp256) 0.0000s 0.0001s 45069.6 14166.6
- 384 bits ecdsa (nistp384) 0.0008s 0.0006s 1265.6 1648.1
- 521 bits ecdsa (nistp521) 0.0003s 0.0005s 3753.1 1819.5
- 256 bits ecdsa (brainpoolP256r1) 0.0003s 0.0003s 2983.5 3333.2
- 384 bits ecdsa (brainpoolP384r1) 0.0008s 0.0007s 1258.8 1528.1
- 512 bits ecdsa (brainpoolP512r1) 0.0015s 0.0012s 675.1 860.1
-
- op op/s
- 192 bits ecdh (nistp192) 0.0002s 4853.4
- 224 bits ecdh (nistp224) 0.0001s 15252.1
- 256 bits ecdh (nistp256) 0.0001s 18436.3
- 384 bits ecdh (nistp384) 0.0008s 1292.7
- 521 bits ecdh (nistp521) 0.0003s 2884.7
- 256 bits ecdh (brainpoolP256r1) 0.0003s 3066.5
- 384 bits ecdh (brainpoolP384r1) 0.0008s 1298.0
- 512 bits ecdh (brainpoolP512r1) 0.0014s 694.8
-```
-
-Keys and signature can be serialized in different ways (see Usage, below).
-For a NIST192p key, the three basic representations require strings of the
-following lengths (in bytes):
-
- to_string: signkey= 24, verifykey= 48, signature=48
- compressed: signkey=n/a, verifykey= 25, signature=n/a
- DER: signkey=106, verifykey= 80, signature=55
- PEM: signkey=278, verifykey=162, (no support for PEM signatures)
-
-## History
-
-In 2006, Peter Pearson announced his pure-python implementation of ECDSA in a
-[message to sci.crypt][1], available from his [download site][2]. In 2010,
-Brian Warner wrote a wrapper around this code, to make it a bit easier and
-safer to use. Hubert Kario then included an implementation of elliptic curve
-cryptography that uses Jacobian coordinates internally, improving performance
-about 20-fold. You are looking at the README for this wrapper.
-
-[1]: http://www.derkeiler.com/Newsgroups/sci.crypt/2006-01/msg00651.html
-[2]: http://webpages.charter.net/curryfans/peter/downloads.html
-
-## Testing
-
-To run the full test suite, do this:
-
- tox -e coverage
-
-On an Intel Core i7 4790K @ 4.0GHz, the tests take about 16 seconds to execute.
-The test suite uses
-[`hypothesis`](https://github.com/HypothesisWorks/hypothesis) so there is some
-inherent variability in the test suite execution time.
-
-One part of `test_pyecdsa.py` checks compatibility with OpenSSL, by
-running the "openssl" CLI tool, make sure it's in your `PATH` if you want
-to test compatibility with it.
-
-## Security
-
-This library was not designed with security in mind. If you are processing
-data that needs to be protected we suggest you use a quality wrapper around
-OpenSSL. [pyca/cryptography](https://cryptography.io) is one example of such
-a wrapper. The primary use-case of this library is as a portable library for
-interoperability testing and as a teaching tool.
-
-**This library does not protect against side channel attacks.**
-
-Do not allow attackers to measure how long it takes you to generate a keypair
-or sign a message. Do not allow attackers to run code on the same physical
-machine when keypair generation or signing is taking place (this includes
-virtual machines). Do not allow attackers to measure how much power your
-computer uses while generating the keypair or signing a message. Do not allow
-attackers to measure RF interference coming from your computer while generating
-a keypair or signing a message. Note: just loading the private key will cause
-keypair generation. Other operations or attack vectors may also be
-vulnerable to attacks. **For a sophisticated attacker observing just one
-operation with a private key will be sufficient to completely
-reconstruct the private key**.
-
-Please also note that any Pure-python cryptographic library will be vulnerable
-to the same side channel attacks. This is because Python does not provide
-side-channel secure primitives (with the exception of
-[`hmac.compare_digest()`][3]), making side-channel secure programming
-impossible.
-
-This library depends upon a strong source of random numbers. Do not use it on
-a system where `os.urandom()` does not provide cryptographically secure
-random numbers.
-
-[3]: https://docs.python.org/3/library/hmac.html#hmac.compare_digest
-
-## Usage
-
-You start by creating a `SigningKey`. You can use this to sign data, by passing
-in data as a byte string and getting back the signature (also a byte string).
-You can also ask a `SigningKey` to give you the corresponding `VerifyingKey`.
-The `VerifyingKey` can be used to verify a signature, by passing it both the
-data string and the signature byte string: it either returns True or raises
-`BadSignatureError`.
-
-```python
-from ecdsa import SigningKey
-sk = SigningKey.generate() # uses NIST192p
-vk = sk.verifying_key
-signature = sk.sign(b"message")
-assert vk.verify(signature, b"message")
-```
-
-Each `SigningKey`/`VerifyingKey` is associated with a specific curve, like
-NIST192p (the default one). Longer curves are more secure, but take longer to
-use, and result in longer keys and signatures.
-
-```python
-from ecdsa import SigningKey, NIST384p
-sk = SigningKey.generate(curve=NIST384p)
-vk = sk.verifying_key
-signature = sk.sign(b"message")
-assert vk.verify(signature, b"message")
-```
-
-The `SigningKey` can be serialized into several different formats: the shortest
-is to call `s=sk.to_string()`, and then re-create it with
-`SigningKey.from_string(s, curve)` . This short form does not record the
-curve, so you must be sure to pass to `from_string()` the same curve you used
-for the original key. The short form of a NIST192p-based signing key is just 24
-bytes long. If a point encoding is invalid or it does not lie on the specified
-curve, `from_string()` will raise `MalformedPointError`.
-
-```python
-from ecdsa import SigningKey, NIST384p
-sk = SigningKey.generate(curve=NIST384p)
-sk_string = sk.to_string()
-sk2 = SigningKey.from_string(sk_string, curve=NIST384p)
-print(sk_string.hex())
-print(sk2.to_string().hex())
-```
-
-Note: while the methods are called `to_string()` the type they return is
-actually `bytes`, the "string" part is leftover from Python 2.
-
-`sk.to_pem()` and `sk.to_der()` will serialize the signing key into the same
-formats that OpenSSL uses. The PEM file looks like the familiar ASCII-armored
-`"-----BEGIN EC PRIVATE KEY-----"` base64-encoded format, and the DER format
-is a shorter binary form of the same data.
-`SigningKey.from_pem()/.from_der()` will undo this serialization. These
-formats include the curve name, so you do not need to pass in a curve
-identifier to the deserializer. In case the file is malformed `from_der()`
-and `from_pem()` will raise `UnexpectedDER` or` MalformedPointError`.
-
-```python
-from ecdsa import SigningKey, NIST384p
-sk = SigningKey.generate(curve=NIST384p)
-sk_pem = sk.to_pem()
-sk2 = SigningKey.from_pem(sk_pem)
-# sk and sk2 are the same key
-```
-
-Likewise, the `VerifyingKey` can be serialized in the same way:
-`vk.to_string()/VerifyingKey.from_string()`, `to_pem()/from_pem()`, and
-`to_der()/from_der()`. The same `curve=` argument is needed for
-`VerifyingKey.from_string()`.
-
-```python
-from ecdsa import SigningKey, VerifyingKey, NIST384p
-sk = SigningKey.generate(curve=NIST384p)
-vk = sk.verifying_key
-vk_string = vk.to_string()
-vk2 = VerifyingKey.from_string(vk_string, curve=NIST384p)
-# vk and vk2 are the same key
-
-from ecdsa import SigningKey, VerifyingKey, NIST384p
-sk = SigningKey.generate(curve=NIST384p)
-vk = sk.verifying_key
-vk_pem = vk.to_pem()
-vk2 = VerifyingKey.from_pem(vk_pem)
-# vk and vk2 are the same key
-```
-
-There are a couple of different ways to compute a signature. Fundamentally,
-ECDSA takes a number that represents the data being signed, and returns a
-pair of numbers that represent the signature. The `hashfunc=` argument to
-`sk.sign()` and `vk.verify()` is used to turn an arbitrary string into
-fixed-length digest, which is then turned into a number that ECDSA can sign,
-and both sign and verify must use the same approach. The default value is
-`hashlib.sha1`, but if you use NIST256p or a longer curve, you can use
-`hashlib.sha256` instead.
-
-There are also multiple ways to represent a signature. The default
-`sk.sign()` and `vk.verify()` methods present it as a short string, for
-simplicity and minimal overhead. To use a different scheme, use the
-`sk.sign(sigencode=)` and `vk.verify(sigdecode=)` arguments. There are helper
-functions in the `ecdsa.util` module that can be useful here.
-
-It is also possible to create a `SigningKey` from a "seed", which is
-deterministic. This can be used in protocols where you want to derive
-consistent signing keys from some other secret, for example when you want
-three separate keys and only want to store a single master secret. You should
-start with a uniformly-distributed unguessable seed with about `curve.baselen`
-bytes of entropy, and then use one of the helper functions in `ecdsa.util` to
-convert it into an integer in the correct range, and then finally pass it
-into `SigningKey.from_secret_exponent()`, like this:
-
-```python
-import os
-from ecdsa import NIST384p, SigningKey
-from ecdsa.util import randrange_from_seed__trytryagain
-
-def make_key(seed):
- secexp = randrange_from_seed__trytryagain(seed, NIST384p.order)
- return SigningKey.from_secret_exponent(secexp, curve=NIST384p)
-
-seed = os.urandom(NIST384p.baselen) # or other starting point
-sk1a = make_key(seed)
-sk1b = make_key(seed)
-# note: sk1a and sk1b are the same key
-assert sk1a.to_string() == sk1b.to_string()
-sk2 = make_key(b"2-"+seed) # different key
-assert sk1a.to_string() != sk2.to_string()
-```
-
-In case the application will verify a lot of signatures made with a single
-key, it's possible to precompute some of the internal values to make
-signature verification significantly faster. The break-even point occurs at
-about 100 signatures verified.
-
-To perform precomputation, you can call the `precompute()` method
-on `VerifyingKey` instance:
-```python
-from ecdsa import SigningKey, NIST384p
-sk = SigningKey.generate(curve=NIST384p)
-vk = sk.verifying_key
-vk.precompute()
-signature = sk.sign(b"message")
-assert vk.verify(signature, b"message")
-```
-
-Once `precompute()` was called, all signature verifications with this key will
-be faster to execute.
-
-## OpenSSL Compatibility
-
-To produce signatures that can be verified by OpenSSL tools, or to verify
-signatures that were produced by those tools, use:
-
-```python
-# openssl ecparam -name prime256v1 -genkey -out sk.pem
-# openssl ec -in sk.pem -pubout -out vk.pem
-# echo "data for signing" > data
-# openssl dgst -sha256 -sign sk.pem -out data.sig data
-# openssl dgst -sha256 -verify vk.pem -signature data.sig data
-# openssl dgst -sha256 -prverify sk.pem -signature data.sig data
-
-import hashlib
-from ecdsa import SigningKey, VerifyingKey
-from ecdsa.util import sigencode_der, sigdecode_der
-
-with open("vk.pem") as f:
- vk = VerifyingKey.from_pem(f.read())
-
-with open("data", "rb") as f:
- data = f.read()
-
-with open("data.sig", "rb") as f:
- signature = f.read()
-
-assert vk.verify(signature, data, hashlib.sha256, sigdecode=sigdecode_der)
-
-with open("sk.pem") as f:
- sk = SigningKey.from_pem(f.read(), hashlib.sha256)
-
-new_signature = sk.sign_deterministic(data, sigencode=sigencode_der)
-
-with open("data.sig2", "wb") as f:
- f.write(new_signature)
-
-# openssl dgst -sha256 -verify vk.pem -signature data.sig2 data
-```
-
-Note: if compatibility with OpenSSL 1.0.0 or earlier is necessary, the
-`sigencode_string` and `sigdecode_string` from `ecdsa.util` can be used for
-respectively writing and reading the signatures.
-
-The keys also can be written in format that openssl can handle:
-
-```python
-from ecdsa import SigningKey, VerifyingKey
-
-with open("sk.pem") as f:
- sk = SigningKey.from_pem(f.read())
-with open("sk.pem", "wb") as f:
- f.write(sk.to_pem())
-
-with open("vk.pem") as f:
- vk = VerifyingKey.from_pem(f.read())
-with open("vk.pem", "wb") as f:
- f.write(vk.to_pem())
-```
-
-## Entropy
-
-Creating a signing key with `SigningKey.generate()` requires some form of
-entropy (as opposed to
-`from_secret_exponent`/`from_string`/`from_der`/`from_pem`,
-which are deterministic and do not require an entropy source). The default
-source is `os.urandom()`, but you can pass any other function that behaves
-like `os.urandom` as the `entropy=` argument to do something different. This
-may be useful in unit tests, where you want to achieve repeatable results. The
-`ecdsa.util.PRNG` utility is handy here: it takes a seed and produces a strong
-pseudo-random stream from it:
-
-```python
-from ecdsa.util import PRNG
-from ecdsa import SigningKey
-rng1 = PRNG(b"seed")
-sk1 = SigningKey.generate(entropy=rng1)
-rng2 = PRNG(b"seed")
-sk2 = SigningKey.generate(entropy=rng2)
-# sk1 and sk2 are the same key
-```
-
-Likewise, ECDSA signature generation requires a random number, and each
-signature must use a different one (using the same number twice will
-immediately reveal the private signing key). The `sk.sign()` method takes an
-`entropy=` argument which behaves the same as `SigningKey.generate(entropy=)`.
-
-## Deterministic Signatures
-
-If you call `SigningKey.sign_deterministic(data)` instead of `.sign(data)`,
-the code will generate a deterministic signature instead of a random one.
-This uses the algorithm from RFC6979 to safely generate a unique `k` value,
-derived from the private key and the message being signed. Each time you sign
-the same message with the same key, you will get the same signature (using
-the same `k`).
-
-This may become the default in a future version, as it is not vulnerable to
-failures of the entropy source.
-
-## Examples
-
-Create a NIST192p keypair and immediately save both to disk:
-
-```python
-from ecdsa import SigningKey
-sk = SigningKey.generate()
-vk = sk.verifying_key
-with open("private.pem", "wb") as f:
- f.write(sk.to_pem())
-with open("public.pem", "wb") as f:
- f.write(vk.to_pem())
-```
-
-Load a signing key from disk, use it to sign a message (using SHA-1), and write
-the signature to disk:
-
-```python
-from ecdsa import SigningKey
-with open("private.pem") as f:
- sk = SigningKey.from_pem(f.read())
-with open("message", "rb") as f:
- message = f.read()
-sig = sk.sign(message)
-with open("signature", "wb") as f:
- f.write(sig)
-```
-
-Load the verifying key, message, and signature from disk, and verify the
-signature (assume SHA-1 hash):
-
-```python
-from ecdsa import VerifyingKey, BadSignatureError
-vk = VerifyingKey.from_pem(open("public.pem").read())
-with open("message", "rb") as f:
- message = f.read()
-with open("signature", "rb") as f:
- sig = f.read()
-try:
- vk.verify(sig, message)
- print "good signature"
-except BadSignatureError:
- print "BAD SIGNATURE"
-```
-
-Create a NIST521p keypair:
-
-```python
-from ecdsa import SigningKey, NIST521p
-sk = SigningKey.generate(curve=NIST521p)
-vk = sk.verifying_key
-```
-
-Create three independent signing keys from a master seed:
-
-```python
-from ecdsa import NIST192p, SigningKey
-from ecdsa.util import randrange_from_seed__trytryagain
-
-def make_key_from_seed(seed, curve=NIST192p):
- secexp = randrange_from_seed__trytryagain(seed, curve.order)
- return SigningKey.from_secret_exponent(secexp, curve)
-
-sk1 = make_key_from_seed("1:%s" % seed)
-sk2 = make_key_from_seed("2:%s" % seed)
-sk3 = make_key_from_seed("3:%s" % seed)
-```
-
-Load a verifying key from disk and print it using hex encoding in
-uncompressed and compressed format (defined in X9.62 and SEC1 standards):
-
-```python
-from ecdsa import VerifyingKey
-
-with open("public.pem") as f:
- vk = VerifyingKey.from_pem(f.read())
-
-print("uncompressed: {0}".format(vk.to_string("uncompressed").hex()))
-print("compressed: {0}".format(vk.to_string("compressed").hex()))
-```
-
-Load a verifying key from a hex string from compressed format, output
-uncompressed:
-
-```python
-from ecdsa import VerifyingKey, NIST256p
-
-comp_str = '022799c0d0ee09772fdd337d4f28dc155581951d07082fb19a38aa396b67e77759'
-vk = VerifyingKey.from_string(bytearray.fromhex(comp_str), curve=NIST256p)
-print(vk.to_string("uncompressed").hex())
-```
-
-ECDH key exchange with remote party
-
-```python
-from ecdsa import ECDH, NIST256p
-
-ecdh = ECDH(curve=NIST256p)
-ecdh.generate_private_key()
-local_public_key = ecdh.get_public_key()
-#send `local_public_key` to remote party and receive `remote_public_key` from remote party
-with open("remote_public_key.pem") as e:
- remote_public_key = e.read()
-ecdh.load_received_public_key_pem(remote_public_key)
-secret = ecdh.generate_sharedsecret_bytes()
-```
-
-
diff --git a/frozen_deps/ecdsa-0.16.1.dist-info/RECORD b/frozen_deps/ecdsa-0.16.1.dist-info/RECORD
deleted file mode 100644
index cb4cde2..0000000
--- a/frozen_deps/ecdsa-0.16.1.dist-info/RECORD
+++ /dev/null
@@ -1,52 +0,0 @@
-ecdsa-0.16.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-ecdsa-0.16.1.dist-info/LICENSE,sha256=PsqYRXc9LluMydjBGdNF8ApIBuS9Zg1KPWzfnA6di7I,1147
-ecdsa-0.16.1.dist-info/METADATA,sha256=cwaWRd_w5Q-Y4wENZxW14D0cpK13fE3AP56XLw-tF50,24993
-ecdsa-0.16.1.dist-info/RECORD,,
-ecdsa-0.16.1.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110
-ecdsa-0.16.1.dist-info/top_level.txt,sha256=7ovPHfAPyTou19f8gOSbHm6B9dGjTibWolcCB7Zjovs,6
-ecdsa/__init__.py,sha256=u-_1cu1I_GIwJ0DRYY7LNvkB4pvodv1kHztsAsCX3eA,1325
-ecdsa/__pycache__/__init__.cpython-39.pyc,,
-ecdsa/__pycache__/_compat.cpython-39.pyc,,
-ecdsa/__pycache__/_rwlock.cpython-39.pyc,,
-ecdsa/__pycache__/_version.cpython-39.pyc,,
-ecdsa/__pycache__/curves.cpython-39.pyc,,
-ecdsa/__pycache__/der.cpython-39.pyc,,
-ecdsa/__pycache__/ecdh.cpython-39.pyc,,
-ecdsa/__pycache__/ecdsa.cpython-39.pyc,,
-ecdsa/__pycache__/ellipticcurve.cpython-39.pyc,,
-ecdsa/__pycache__/keys.cpython-39.pyc,,
-ecdsa/__pycache__/numbertheory.cpython-39.pyc,,
-ecdsa/__pycache__/rfc6979.cpython-39.pyc,,
-ecdsa/__pycache__/test_der.cpython-39.pyc,,
-ecdsa/__pycache__/test_ecdh.cpython-39.pyc,,
-ecdsa/__pycache__/test_ecdsa.cpython-39.pyc,,
-ecdsa/__pycache__/test_ellipticcurve.cpython-39.pyc,,
-ecdsa/__pycache__/test_jacobi.cpython-39.pyc,,
-ecdsa/__pycache__/test_keys.cpython-39.pyc,,
-ecdsa/__pycache__/test_malformed_sigs.cpython-39.pyc,,
-ecdsa/__pycache__/test_numbertheory.cpython-39.pyc,,
-ecdsa/__pycache__/test_pyecdsa.cpython-39.pyc,,
-ecdsa/__pycache__/test_rw_lock.cpython-39.pyc,,
-ecdsa/__pycache__/util.cpython-39.pyc,,
-ecdsa/_compat.py,sha256=j_BnKmVOkjucCQbCuLaFsxHSiEUqj_co5sSAPLLWSsk,1659
-ecdsa/_rwlock.py,sha256=CAwHp2V65ksI8B1UqY7EccK9LaUToiv6pDLVzm44eag,2849
-ecdsa/_version.py,sha256=Qncu2Mr06Q_KO_8jvc8zi5RZ4XgaxiWI17VDRqKMrfw,498
-ecdsa/curves.py,sha256=rlAVrS6hwZ6sNnTswdRMJBlC-mryxXYo7zZIEQjYOPE,3735
-ecdsa/der.py,sha256=l528iLGUwqcNokzDkk-2qO3-6_nzL908OfB0GhUhbZ8,14092
-ecdsa/ecdh.py,sha256=K7T-XoiP-Y_bsGcnulcXFsr_7P5LCK2O4wbM-WkopDQ,10631
-ecdsa/ecdsa.py,sha256=5xD8X3qD9By3aZdxVoPOyx_FFDRNVrRUhxtw5j70g0g,21232
-ecdsa/ellipticcurve.py,sha256=l11lgxjqTe2ocyOed9M19FKZR7kNAB3dUfUvjJLAcsk,27437
-ecdsa/keys.py,sha256=1-YQm967hqvOsnF9o7Tw0eHyo21YHkZYzcKOckebfGI,59502
-ecdsa/numbertheory.py,sha256=yLx-P5-esRFT63gDSvKBfoiwOfSyVfjXyFcGF9_SFbM,16764
-ecdsa/rfc6979.py,sha256=x6dCO2l3QlPLHE-w3c456rqthhSBP03dCnTfSweBgBU,2725
-ecdsa/test_der.py,sha256=jifDHof2nEDs2phCEYMOJ-h6oCEuqS-pz8x65rrmm8U,12653
-ecdsa/test_ecdh.py,sha256=PxwESmg9_ckt1N9yXA88yN_0bERwkXDojSP9Oppfub8,13510
-ecdsa/test_ecdsa.py,sha256=csODW8xYt_LhjEvHiWteehEU2UxBLodvkQk21aMNCzs,19696
-ecdsa/test_ellipticcurve.py,sha256=todhFIkd2pyRCqfa7S92o69uOM7DfFp1tkD7LFa2Edw,6112
-ecdsa/test_jacobi.py,sha256=Ie3NocTE1i69oHxfnmnmvwqXJIlQpzVAFAG1rJq3YFU,12178
-ecdsa/test_keys.py,sha256=lT05J0Cu7C0HLu8cicBKBGRzmkuQBIECHQEzBmXYDzQ,14157
-ecdsa/test_malformed_sigs.py,sha256=Sr4RdBG4WWpOdJBME8f4v82uvbqJ_2cKyccL9crsi58,10300
-ecdsa/test_numbertheory.py,sha256=VqEme1ND9gbh2aMKsXXnZXcI4fpSvfkglM1O8DQpxR8,8815
-ecdsa/test_pyecdsa.py,sha256=61c5ASQ9pHKIYg73JWiIZdlCz4wqmkvCqmPJKVBNzn4,73402
-ecdsa/test_rw_lock.py,sha256=pkSoLder1YdsyRPSam8topCvdMytQjV3q-sCqrjx4nE,6959
-ecdsa/util.py,sha256=lHkBmYk4wuUETSUj4V23ssCjL385zCDxFr24jptXxI8,14557
diff --git a/frozen_deps/ecdsa-0.16.1.dist-info/WHEEL b/frozen_deps/ecdsa-0.16.1.dist-info/WHEEL
deleted file mode 100644
index 8b701e9..0000000
--- a/frozen_deps/ecdsa-0.16.1.dist-info/WHEEL
+++ /dev/null
@@ -1,6 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.33.6)
-Root-Is-Purelib: true
-Tag: py2-none-any
-Tag: py3-none-any
-
diff --git a/frozen_deps/ecdsa-0.16.1.dist-info/top_level.txt b/frozen_deps/ecdsa-0.16.1.dist-info/top_level.txt
deleted file mode 100644
index aa5efdb..0000000
--- a/frozen_deps/ecdsa-0.16.1.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-ecdsa
diff --git a/frozen_deps/ecdsa-0.18.0.dist-info/INSTALLER b/frozen_deps/ecdsa-0.18.0.dist-info/INSTALLER
deleted file mode 100644
index a1b589e..0000000
--- a/frozen_deps/ecdsa-0.18.0.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/frozen_deps/ecdsa-0.18.0.dist-info/LICENSE b/frozen_deps/ecdsa-0.18.0.dist-info/LICENSE
deleted file mode 100644
index 474479a..0000000
--- a/frozen_deps/ecdsa-0.18.0.dist-info/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-"python-ecdsa" Copyright (c) 2010 Brian Warner
-
-Portions written in 2005 by Peter Pearson and placed in the public domain.
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-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.
diff --git a/frozen_deps/ecdsa-0.18.0.dist-info/METADATA b/frozen_deps/ecdsa-0.18.0.dist-info/METADATA
deleted file mode 100644
index fa1c5fe..0000000
--- a/frozen_deps/ecdsa-0.18.0.dist-info/METADATA
+++ /dev/null
@@ -1,675 +0,0 @@
-Metadata-Version: 2.1
-Name: ecdsa
-Version: 0.18.0
-Summary: ECDSA cryptographic signature library (pure python)
-Home-page: http://github.com/tlsfuzzer/python-ecdsa
-Author: Brian Warner
-Author-email: [email protected]
-License: MIT
-Platform: UNKNOWN
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.6
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
-Classifier: Programming Language :: Python :: 3.10
-Classifier: Programming Language :: Python :: 3.11
-Requires-Python: >=2.6, !=3.0.*, !=3.1.*, !=3.2.*
-Description-Content-Type: text/markdown
-License-File: LICENSE
-Requires-Dist: six (>=1.9.0)
-Provides-Extra: gmpy
-Requires-Dist: gmpy ; extra == 'gmpy'
-Provides-Extra: gmpy2
-Requires-Dist: gmpy2 ; extra == 'gmpy2'
-
-# Pure-Python ECDSA and ECDH
-
-[![Build Status](https://github.com/tlsfuzzer/python-ecdsa/workflows/GitHub%20CI/badge.svg?branch=master)](https://github.com/tlsfuzzer/python-ecdsa/actions?query=workflow%3A%22GitHub+CI%22+branch%3Amaster)
-[![Documentation Status](https://readthedocs.org/projects/ecdsa/badge/?version=latest)](https://ecdsa.readthedocs.io/en/latest/?badge=latest)
-[![Coverage Status](https://coveralls.io/repos/github/tlsfuzzer/python-ecdsa/badge.svg?branch=master)](https://coveralls.io/github/tlsfuzzer/python-ecdsa?branch=master)
-![condition coverage](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/tomato42/9b6ca1f3410207fbeca785a178781651/raw/python-ecdsa-condition-coverage.json)
-[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/tlsfuzzer/python-ecdsa.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/tlsfuzzer/python-ecdsa/context:python)
-[![Total alerts](https://img.shields.io/lgtm/alerts/g/tlsfuzzer/python-ecdsa.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/tlsfuzzer/python-ecdsa/alerts/)
-[![Latest Version](https://img.shields.io/pypi/v/ecdsa.svg?style=flat)](https://pypi.python.org/pypi/ecdsa/)
-![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg?style=flat)
-
-
-This is an easy-to-use implementation of ECC (Elliptic Curve Cryptography)
-with support for ECDSA (Elliptic Curve Digital Signature Algorithm),
-EdDSA (Edwards-curve Digital Signature Algorithm) and ECDH
-(Elliptic Curve Diffie-Hellman), implemented purely in Python, released under
-the MIT license. With this library, you can quickly create key pairs (signing
-key and verifying key), sign messages, and verify the signatures. You can
-also agree on a shared secret key based on exchanged public keys.
-The keys and signatures are very short, making them easy to handle and
-incorporate into other protocols.
-
-**NOTE: This library should not be used in production settings, see [Security](#Security) for more details.**
-
-## Features
-
-This library provides key generation, signing, verifying, and shared secret
-derivation for five
-popular NIST "Suite B" GF(p) (_prime field_) curves, with key lengths of 192,
-224, 256, 384, and 521 bits. The "short names" for these curves, as known by
-the OpenSSL tool (`openssl ecparam -list_curves`), are: `prime192v1`,
-`secp224r1`, `prime256v1`, `secp384r1`, and `secp521r1`. It includes the
-256-bit curve `secp256k1` used by Bitcoin. There is also support for the
-regular (non-twisted) variants of Brainpool curves from 160 to 512 bits. The
-"short names" of those curves are: `brainpoolP160r1`, `brainpoolP192r1`,
-`brainpoolP224r1`, `brainpoolP256r1`, `brainpoolP320r1`, `brainpoolP384r1`,
-`brainpoolP512r1`. Few of the small curves from SEC standard are also
-included (mainly to speed-up testing of the library), those are:
-`secp112r1`, `secp112r2`, `secp128r1`, and `secp160r1`.
-Key generation, siging and verifying is also supported for Ed25519 and
-Ed448 curves.
-No other curves are included, but it is not too hard to add support for more
-curves over prime fields.
-
-## Dependencies
-
-This library uses only Python and the 'six' package. It is compatible with
-Python 2.6, 2.7, and 3.3+. It also supports execution on alternative
-implementations like pypy and pypy3.
-
-If `gmpy2` or `gmpy` is installed, they will be used for faster arithmetic.
-Either of them can be installed after this library is installed,
-`python-ecdsa` will detect their presence on start-up and use them
-automatically.
-You should prefer `gmpy2` on Python3 for optimal performance.
-
-To run the OpenSSL compatibility tests, the 'openssl' tool must be in your
-`PATH`. This release has been tested successfully against OpenSSL 0.9.8o,
-1.0.0a, 1.0.2f, 1.1.1d and 3.0.1 (among others).
-
-
-## Installation
-
-This library is available on PyPI, it's recommended to install it using `pip`:
-
-```
-pip install ecdsa
-```
-
-In case higher performance is wanted and using native code is not a problem,
-it's possible to specify installation together with `gmpy2`:
-
-```
-pip install ecdsa[gmpy2]
-```
-
-or (slower, legacy option):
-```
-pip install ecdsa[gmpy]
-```
-
-## Speed
-
-The following table shows how long this library takes to generate key pairs
-(`keygen`), to sign data (`sign`), to verify those signatures (`verify`),
-to derive a shared secret (`ecdh`), and
-to verify the signatures with no key-specific precomputation (`no PC verify`).
-All those values are in seconds.
-For convenience, the inverses of those values are also provided:
-how many keys per second can be generated (`keygen/s`), how many signatures
-can be made per second (`sign/s`), how many signatures can be verified
-per second (`verify/s`), how many shared secrets can be derived per second
-(`ecdh/s`), and how many signatures with no key specific
-precomputation can be verified per second (`no PC verify/s`). The size of raw
-signature (generally the smallest
-the way a signature can be encoded) is also provided in the `siglen` column.
-Use `tox -e speed` to generate this table on your own computer.
-On an Intel Core i7 4790K @ 4.0GHz I'm getting the following performance:
-
-```
- siglen keygen keygen/s sign sign/s verify verify/s no PC verify no PC verify/s
- NIST192p: 48 0.00032s 3134.06 0.00033s 2985.53 0.00063s 1598.36 0.00129s 774.43
- NIST224p: 56 0.00040s 2469.24 0.00042s 2367.88 0.00081s 1233.41 0.00170s 586.66
- NIST256p: 64 0.00051s 1952.73 0.00054s 1867.80 0.00098s 1021.86 0.00212s 471.27
- NIST384p: 96 0.00107s 935.92 0.00111s 904.23 0.00203s 491.77 0.00446s 224.00
- NIST521p: 132 0.00210s 475.52 0.00215s 464.16 0.00398s 251.28 0.00874s 114.39
- SECP256k1: 64 0.00052s 1921.54 0.00054s 1847.49 0.00105s 948.68 0.00210s 477.01
- BRAINPOOLP160r1: 40 0.00025s 4003.88 0.00026s 3845.12 0.00053s 1893.93 0.00105s 949.92
- BRAINPOOLP192r1: 48 0.00033s 3043.97 0.00034s 2975.98 0.00063s 1581.50 0.00135s 742.29
- BRAINPOOLP224r1: 56 0.00041s 2436.44 0.00043s 2315.51 0.00078s 1278.49 0.00180s 556.16
- BRAINPOOLP256r1: 64 0.00053s 1892.49 0.00054s 1846.24 0.00114s 875.64 0.00229s 437.25
- BRAINPOOLP320r1: 80 0.00073s 1361.26 0.00076s 1309.25 0.00143s 699.29 0.00322s 310.49
- BRAINPOOLP384r1: 96 0.00107s 931.29 0.00111s 901.80 0.00230s 434.19 0.00476s 210.20
- BRAINPOOLP512r1: 128 0.00207s 483.41 0.00212s 471.42 0.00425s 235.43 0.00912s 109.61
- SECP112r1: 28 0.00015s 6672.53 0.00016s 6440.34 0.00031s 3265.41 0.00056s 1774.20
- SECP112r2: 28 0.00015s 6697.11 0.00015s 6479.98 0.00028s 3524.72 0.00058s 1716.16
- SECP128r1: 32 0.00018s 5497.65 0.00019s 5272.89 0.00036s 2747.39 0.00072s 1396.16
- SECP160r1: 42 0.00025s 3949.32 0.00026s 3894.45 0.00046s 2153.85 0.00102s 985.07
- Ed25519: 64 0.00076s 1324.48 0.00042s 2405.01 0.00109s 918.05 0.00344s 290.50
- Ed448: 114 0.00176s 569.53 0.00115s 870.94 0.00282s 355.04 0.01024s 97.69
-
- ecdh ecdh/s
- NIST192p: 0.00104s 964.89
- NIST224p: 0.00134s 748.63
- NIST256p: 0.00170s 587.08
- NIST384p: 0.00352s 283.90
- NIST521p: 0.00717s 139.51
- SECP256k1: 0.00154s 648.40
- BRAINPOOLP160r1: 0.00082s 1220.70
- BRAINPOOLP192r1: 0.00105s 956.75
- BRAINPOOLP224r1: 0.00136s 734.52
- BRAINPOOLP256r1: 0.00178s 563.32
- BRAINPOOLP320r1: 0.00252s 397.23
- BRAINPOOLP384r1: 0.00376s 266.27
- BRAINPOOLP512r1: 0.00733s 136.35
- SECP112r1: 0.00046s 2180.40
- SECP112r2: 0.00045s 2229.14
- SECP128r1: 0.00054s 1868.15
- SECP160r1: 0.00080s 1243.98
-```
-
-To test performance with `gmpy2` loaded, use `tox -e speedgmpy2`.
-On the same machine I'm getting the following performance with `gmpy2`:
-```
- siglen keygen keygen/s sign sign/s verify verify/s no PC verify no PC verify/s
- NIST192p: 48 0.00017s 5933.40 0.00017s 5751.70 0.00032s 3125.28 0.00067s 1502.41
- NIST224p: 56 0.00021s 4782.87 0.00022s 4610.05 0.00040s 2487.04 0.00089s 1126.90
- NIST256p: 64 0.00023s 4263.98 0.00024s 4125.16 0.00045s 2200.88 0.00098s 1016.82
- NIST384p: 96 0.00041s 2449.54 0.00042s 2399.96 0.00083s 1210.57 0.00172s 581.43
- NIST521p: 132 0.00071s 1416.07 0.00072s 1389.81 0.00144s 692.93 0.00312s 320.40
- SECP256k1: 64 0.00024s 4245.05 0.00024s 4122.09 0.00045s 2206.40 0.00094s 1068.32
- BRAINPOOLP160r1: 40 0.00014s 6939.17 0.00015s 6681.55 0.00029s 3452.43 0.00057s 1769.81
- BRAINPOOLP192r1: 48 0.00017s 5920.05 0.00017s 5774.36 0.00034s 2979.00 0.00069s 1453.19
- BRAINPOOLP224r1: 56 0.00021s 4732.12 0.00022s 4622.65 0.00041s 2422.47 0.00087s 1149.87
- BRAINPOOLP256r1: 64 0.00024s 4233.02 0.00024s 4115.20 0.00047s 2143.27 0.00098s 1015.60
- BRAINPOOLP320r1: 80 0.00032s 3162.38 0.00032s 3077.62 0.00063s 1598.83 0.00136s 737.34
- BRAINPOOLP384r1: 96 0.00041s 2436.88 0.00042s 2395.62 0.00083s 1202.68 0.00178s 562.85
- BRAINPOOLP512r1: 128 0.00063s 1587.60 0.00064s 1558.83 0.00125s 799.96 0.00281s 355.83
- SECP112r1: 28 0.00009s 11118.66 0.00009s 10775.48 0.00018s 5456.00 0.00033s 3020.83
- SECP112r2: 28 0.00009s 11322.97 0.00009s 10857.71 0.00017s 5748.77 0.00032s 3094.28
- SECP128r1: 32 0.00010s 10078.39 0.00010s 9665.27 0.00019s 5200.58 0.00036s 2760.88
- SECP160r1: 42 0.00015s 6875.51 0.00015s 6647.35 0.00029s 3422.41 0.00057s 1768.35
- Ed25519: 64 0.00030s 3322.56 0.00018s 5568.63 0.00046s 2165.35 0.00153s 654.02
- Ed448: 114 0.00060s 1680.53 0.00039s 2567.40 0.00096s 1036.67 0.00350s 285.62
-
- ecdh ecdh/s
- NIST192p: 0.00050s 1985.70
- NIST224p: 0.00066s 1524.16
- NIST256p: 0.00071s 1413.07
- NIST384p: 0.00127s 788.89
- NIST521p: 0.00230s 434.85
- SECP256k1: 0.00071s 1409.95
- BRAINPOOLP160r1: 0.00042s 2374.65
- BRAINPOOLP192r1: 0.00051s 1960.01
- BRAINPOOLP224r1: 0.00066s 1518.37
- BRAINPOOLP256r1: 0.00071s 1399.90
- BRAINPOOLP320r1: 0.00100s 997.21
- BRAINPOOLP384r1: 0.00129s 777.51
- BRAINPOOLP512r1: 0.00210s 475.99
- SECP112r1: 0.00022s 4457.70
- SECP112r2: 0.00024s 4252.33
- SECP128r1: 0.00028s 3589.31
- SECP160r1: 0.00043s 2305.02
-```
-
-(there's also `gmpy` version, execute it using `tox -e speedgmpy`)
-
-For comparison, a highly optimised implementation (including curve-specific
-assembly for some curves), like the one in OpenSSL 1.1.1d, provides the
-following performance numbers on the same machine.
-Run `openssl speed ecdsa` and `openssl speed ecdh` to reproduce it:
-```
- sign verify sign/s verify/s
- 192 bits ecdsa (nistp192) 0.0002s 0.0002s 4785.6 5380.7
- 224 bits ecdsa (nistp224) 0.0000s 0.0001s 22475.6 9822.0
- 256 bits ecdsa (nistp256) 0.0000s 0.0001s 45069.6 14166.6
- 384 bits ecdsa (nistp384) 0.0008s 0.0006s 1265.6 1648.1
- 521 bits ecdsa (nistp521) 0.0003s 0.0005s 3753.1 1819.5
- 256 bits ecdsa (brainpoolP256r1) 0.0003s 0.0003s 2983.5 3333.2
- 384 bits ecdsa (brainpoolP384r1) 0.0008s 0.0007s 1258.8 1528.1
- 512 bits ecdsa (brainpoolP512r1) 0.0015s 0.0012s 675.1 860.1
-
- sign verify sign/s verify/s
- 253 bits EdDSA (Ed25519) 0.0000s 0.0001s 28217.9 10897.7
- 456 bits EdDSA (Ed448) 0.0003s 0.0005s 3926.5 2147.7
-
- op op/s
- 192 bits ecdh (nistp192) 0.0002s 4853.4
- 224 bits ecdh (nistp224) 0.0001s 15252.1
- 256 bits ecdh (nistp256) 0.0001s 18436.3
- 384 bits ecdh (nistp384) 0.0008s 1292.7
- 521 bits ecdh (nistp521) 0.0003s 2884.7
- 256 bits ecdh (brainpoolP256r1) 0.0003s 3066.5
- 384 bits ecdh (brainpoolP384r1) 0.0008s 1298.0
- 512 bits ecdh (brainpoolP512r1) 0.0014s 694.8
-```
-
-Keys and signature can be serialized in different ways (see Usage, below).
-For a NIST192p key, the three basic representations require strings of the
-following lengths (in bytes):
-
- to_string: signkey= 24, verifykey= 48, signature=48
- compressed: signkey=n/a, verifykey= 25, signature=n/a
- DER: signkey=106, verifykey= 80, signature=55
- PEM: signkey=278, verifykey=162, (no support for PEM signatures)
-
-## History
-
-In 2006, Peter Pearson announced his pure-python implementation of ECDSA in a
-[message to sci.crypt][1], available from his [download site][2]. In 2010,
-Brian Warner wrote a wrapper around this code, to make it a bit easier and
-safer to use. In 2020, Hubert Kario included an implementation of elliptic
-curve cryptography that uses Jacobian coordinates internally, improving
-performance about 20-fold. You are looking at the README for this wrapper.
-
-[1]: http://www.derkeiler.com/Newsgroups/sci.crypt/2006-01/msg00651.html
-[2]: http://webpages.charter.net/curryfans/peter/downloads.html
-
-## Testing
-
-To run the full test suite, do this:
-
- tox -e coverage
-
-On an Intel Core i7 4790K @ 4.0GHz, the tests take about 18 seconds to execute.
-The test suite uses
-[`hypothesis`](https://github.com/HypothesisWorks/hypothesis) so there is some
-inherent variability in the test suite execution time.
-
-One part of `test_pyecdsa.py` and `test_ecdh.py` checks compatibility with
-OpenSSL, by running the "openssl" CLI tool, make sure it's in your `PATH` if
-you want to test compatibility with it (if OpenSSL is missing, too old, or
-doesn't support all the curves supported in upstream releases you will see
-skipped tests in the above `coverage` run).
-
-## Security
-
-This library was not designed with security in mind. If you are processing
-data that needs to be protected we suggest you use a quality wrapper around
-OpenSSL. [pyca/cryptography](https://cryptography.io) is one example of such
-a wrapper. The primary use-case of this library is as a portable library for
-interoperability testing and as a teaching tool.
-
-**This library does not protect against side-channel attacks.**
-
-Do not allow attackers to measure how long it takes you to generate a key pair
-or sign a message. Do not allow attackers to run code on the same physical
-machine when key pair generation or signing is taking place (this includes
-virtual machines). Do not allow attackers to measure how much power your
-computer uses while generating the key pair or signing a message. Do not allow
-attackers to measure RF interference coming from your computer while generating
-a key pair or signing a message. Note: just loading the private key will cause
-key pair generation. Other operations or attack vectors may also be
-vulnerable to attacks. **For a sophisticated attacker observing just one
-operation with a private key will be sufficient to completely
-reconstruct the private key**.
-
-Please also note that any Pure-python cryptographic library will be vulnerable
-to the same side-channel attacks. This is because Python does not provide
-side-channel secure primitives (with the exception of
-[`hmac.compare_digest()`][3]), making side-channel secure programming
-impossible.
-
-This library depends upon a strong source of random numbers. Do not use it on
-a system where `os.urandom()` does not provide cryptographically secure
-random numbers.
-
-[3]: https://docs.python.org/3/library/hmac.html#hmac.compare_digest
-
-## Usage
-
-You start by creating a `SigningKey`. You can use this to sign data, by passing
-in data as a byte string and getting back the signature (also a byte string).
-You can also ask a `SigningKey` to give you the corresponding `VerifyingKey`.
-The `VerifyingKey` can be used to verify a signature, by passing it both the
-data string and the signature byte string: it either returns True or raises
-`BadSignatureError`.
-
-```python
-from ecdsa import SigningKey
-sk = SigningKey.generate() # uses NIST192p
-vk = sk.verifying_key
-signature = sk.sign(b"message")
-assert vk.verify(signature, b"message")
-```
-
-Each `SigningKey`/`VerifyingKey` is associated with a specific curve, like
-NIST192p (the default one). Longer curves are more secure, but take longer to
-use, and result in longer keys and signatures.
-
-```python
-from ecdsa import SigningKey, NIST384p
-sk = SigningKey.generate(curve=NIST384p)
-vk = sk.verifying_key
-signature = sk.sign(b"message")
-assert vk.verify(signature, b"message")
-```
-
-The `SigningKey` can be serialized into several different formats: the shortest
-is to call `s=sk.to_string()`, and then re-create it with
-`SigningKey.from_string(s, curve)` . This short form does not record the
-curve, so you must be sure to pass to `from_string()` the same curve you used
-for the original key. The short form of a NIST192p-based signing key is just 24
-bytes long. If a point encoding is invalid or it does not lie on the specified
-curve, `from_string()` will raise `MalformedPointError`.
-
-```python
-from ecdsa import SigningKey, NIST384p
-sk = SigningKey.generate(curve=NIST384p)
-sk_string = sk.to_string()
-sk2 = SigningKey.from_string(sk_string, curve=NIST384p)
-print(sk_string.hex())
-print(sk2.to_string().hex())
-```
-
-Note: while the methods are called `to_string()` the type they return is
-actually `bytes`, the "string" part is leftover from Python 2.
-
-`sk.to_pem()` and `sk.to_der()` will serialize the signing key into the same
-formats that OpenSSL uses. The PEM file looks like the familiar ASCII-armored
-`"-----BEGIN EC PRIVATE KEY-----"` base64-encoded format, and the DER format
-is a shorter binary form of the same data.
-`SigningKey.from_pem()/.from_der()` will undo this serialization. These
-formats include the curve name, so you do not need to pass in a curve
-identifier to the deserializer. In case the file is malformed `from_der()`
-and `from_pem()` will raise `UnexpectedDER` or` MalformedPointError`.
-
-```python
-from ecdsa import SigningKey, NIST384p
-sk = SigningKey.generate(curve=NIST384p)
-sk_pem = sk.to_pem()
-sk2 = SigningKey.from_pem(sk_pem)
-# sk and sk2 are the same key
-```
-
-Likewise, the `VerifyingKey` can be serialized in the same way:
-`vk.to_string()/VerifyingKey.from_string()`, `to_pem()/from_pem()`, and
-`to_der()/from_der()`. The same `curve=` argument is needed for
-`VerifyingKey.from_string()`.
-
-```python
-from ecdsa import SigningKey, VerifyingKey, NIST384p
-sk = SigningKey.generate(curve=NIST384p)
-vk = sk.verifying_key
-vk_string = vk.to_string()
-vk2 = VerifyingKey.from_string(vk_string, curve=NIST384p)
-# vk and vk2 are the same key
-
-from ecdsa import SigningKey, VerifyingKey, NIST384p
-sk = SigningKey.generate(curve=NIST384p)
-vk = sk.verifying_key
-vk_pem = vk.to_pem()
-vk2 = VerifyingKey.from_pem(vk_pem)
-# vk and vk2 are the same key
-```
-
-There are a couple of different ways to compute a signature. Fundamentally,
-ECDSA takes a number that represents the data being signed, and returns a
-pair of numbers that represent the signature. The `hashfunc=` argument to
-`sk.sign()` and `vk.verify()` is used to turn an arbitrary string into a
-fixed-length digest, which is then turned into a number that ECDSA can sign,
-and both sign and verify must use the same approach. The default value is
-`hashlib.sha1`, but if you use NIST256p or a longer curve, you can use
-`hashlib.sha256` instead.
-
-There are also multiple ways to represent a signature. The default
-`sk.sign()` and `vk.verify()` methods present it as a short string, for
-simplicity and minimal overhead. To use a different scheme, use the
-`sk.sign(sigencode=)` and `vk.verify(sigdecode=)` arguments. There are helper
-functions in the `ecdsa.util` module that can be useful here.
-
-It is also possible to create a `SigningKey` from a "seed", which is
-deterministic. This can be used in protocols where you want to derive
-consistent signing keys from some other secret, for example when you want
-three separate keys and only want to store a single master secret. You should
-start with a uniformly-distributed unguessable seed with about `curve.baselen`
-bytes of entropy, and then use one of the helper functions in `ecdsa.util` to
-convert it into an integer in the correct range, and then finally pass it
-into `SigningKey.from_secret_exponent()`, like this:
-
-```python
-import os
-from ecdsa import NIST384p, SigningKey
-from ecdsa.util import randrange_from_seed__trytryagain
-
-def make_key(seed):
- secexp = randrange_from_seed__trytryagain(seed, NIST384p.order)
- return SigningKey.from_secret_exponent(secexp, curve=NIST384p)
-
-seed = os.urandom(NIST384p.baselen) # or other starting point
-sk1a = make_key(seed)
-sk1b = make_key(seed)
-# note: sk1a and sk1b are the same key
-assert sk1a.to_string() == sk1b.to_string()
-sk2 = make_key(b"2-"+seed) # different key
-assert sk1a.to_string() != sk2.to_string()
-```
-
-In case the application will verify a lot of signatures made with a single
-key, it's possible to precompute some of the internal values to make
-signature verification significantly faster. The break-even point occurs at
-about 100 signatures verified.
-
-To perform precomputation, you can call the `precompute()` method
-on `VerifyingKey` instance:
-```python
-from ecdsa import SigningKey, NIST384p
-sk = SigningKey.generate(curve=NIST384p)
-vk = sk.verifying_key
-vk.precompute()
-signature = sk.sign(b"message")
-assert vk.verify(signature, b"message")
-```
-
-Once `precompute()` was called, all signature verifications with this key will
-be faster to execute.
-
-## OpenSSL Compatibility
-
-To produce signatures that can be verified by OpenSSL tools, or to verify
-signatures that were produced by those tools, use:
-
-```python
-# openssl ecparam -name prime256v1 -genkey -out sk.pem
-# openssl ec -in sk.pem -pubout -out vk.pem
-# echo "data for signing" > data
-# openssl dgst -sha256 -sign sk.pem -out data.sig data
-# openssl dgst -sha256 -verify vk.pem -signature data.sig data
-# openssl dgst -sha256 -prverify sk.pem -signature data.sig data
-
-import hashlib
-from ecdsa import SigningKey, VerifyingKey
-from ecdsa.util import sigencode_der, sigdecode_der
-
-with open("vk.pem") as f:
- vk = VerifyingKey.from_pem(f.read())
-
-with open("data", "rb") as f:
- data = f.read()
-
-with open("data.sig", "rb") as f:
- signature = f.read()
-
-assert vk.verify(signature, data, hashlib.sha256, sigdecode=sigdecode_der)
-
-with open("sk.pem") as f:
- sk = SigningKey.from_pem(f.read(), hashlib.sha256)
-
-new_signature = sk.sign_deterministic(data, sigencode=sigencode_der)
-
-with open("data.sig2", "wb") as f:
- f.write(new_signature)
-
-# openssl dgst -sha256 -verify vk.pem -signature data.sig2 data
-```
-
-Note: if compatibility with OpenSSL 1.0.0 or earlier is necessary, the
-`sigencode_string` and `sigdecode_string` from `ecdsa.util` can be used for
-respectively writing and reading the signatures.
-
-The keys also can be written in format that openssl can handle:
-
-```python
-from ecdsa import SigningKey, VerifyingKey
-
-with open("sk.pem") as f:
- sk = SigningKey.from_pem(f.read())
-with open("sk.pem", "wb") as f:
- f.write(sk.to_pem())
-
-with open("vk.pem") as f:
- vk = VerifyingKey.from_pem(f.read())
-with open("vk.pem", "wb") as f:
- f.write(vk.to_pem())
-```
-
-## Entropy
-
-Creating a signing key with `SigningKey.generate()` requires some form of
-entropy (as opposed to
-`from_secret_exponent`/`from_string`/`from_der`/`from_pem`,
-which are deterministic and do not require an entropy source). The default
-source is `os.urandom()`, but you can pass any other function that behaves
-like `os.urandom` as the `entropy=` argument to do something different. This
-may be useful in unit tests, where you want to achieve repeatable results. The
-`ecdsa.util.PRNG` utility is handy here: it takes a seed and produces a strong
-pseudo-random stream from it:
-
-```python
-from ecdsa.util import PRNG
-from ecdsa import SigningKey
-rng1 = PRNG(b"seed")
-sk1 = SigningKey.generate(entropy=rng1)
-rng2 = PRNG(b"seed")
-sk2 = SigningKey.generate(entropy=rng2)
-# sk1 and sk2 are the same key
-```
-
-Likewise, ECDSA signature generation requires a random number, and each
-signature must use a different one (using the same number twice will
-immediately reveal the private signing key). The `sk.sign()` method takes an
-`entropy=` argument which behaves the same as `SigningKey.generate(entropy=)`.
-
-## Deterministic Signatures
-
-If you call `SigningKey.sign_deterministic(data)` instead of `.sign(data)`,
-the code will generate a deterministic signature instead of a random one.
-This uses the algorithm from RFC6979 to safely generate a unique `k` value,
-derived from the private key and the message being signed. Each time you sign
-the same message with the same key, you will get the same signature (using
-the same `k`).
-
-This may become the default in a future version, as it is not vulnerable to
-failures of the entropy source.
-
-## Examples
-
-Create a NIST192p key pair and immediately save both to disk:
-
-```python
-from ecdsa import SigningKey
-sk = SigningKey.generate()
-vk = sk.verifying_key
-with open("private.pem", "wb") as f:
- f.write(sk.to_pem())
-with open("public.pem", "wb") as f:
- f.write(vk.to_pem())
-```
-
-Load a signing key from disk, use it to sign a message (using SHA-1), and write
-the signature to disk:
-
-```python
-from ecdsa import SigningKey
-with open("private.pem") as f:
- sk = SigningKey.from_pem(f.read())
-with open("message", "rb") as f:
- message = f.read()
-sig = sk.sign(message)
-with open("signature", "wb") as f:
- f.write(sig)
-```
-
-Load the verifying key, message, and signature from disk, and verify the
-signature (assume SHA-1 hash):
-
-```python
-from ecdsa import VerifyingKey, BadSignatureError
-vk = VerifyingKey.from_pem(open("public.pem").read())
-with open("message", "rb") as f:
- message = f.read()
-with open("signature", "rb") as f:
- sig = f.read()
-try:
- vk.verify(sig, message)
- print "good signature"
-except BadSignatureError:
- print "BAD SIGNATURE"
-```
-
-Create a NIST521p key pair:
-
-```python
-from ecdsa import SigningKey, NIST521p
-sk = SigningKey.generate(curve=NIST521p)
-vk = sk.verifying_key
-```
-
-Create three independent signing keys from a master seed:
-
-```python
-from ecdsa import NIST192p, SigningKey
-from ecdsa.util import randrange_from_seed__trytryagain
-
-def make_key_from_seed(seed, curve=NIST192p):
- secexp = randrange_from_seed__trytryagain(seed, curve.order)
- return SigningKey.from_secret_exponent(secexp, curve)
-
-sk1 = make_key_from_seed("1:%s" % seed)
-sk2 = make_key_from_seed("2:%s" % seed)
-sk3 = make_key_from_seed("3:%s" % seed)
-```
-
-Load a verifying key from disk and print it using hex encoding in
-uncompressed and compressed format (defined in X9.62 and SEC1 standards):
-
-```python
-from ecdsa import VerifyingKey
-
-with open("public.pem") as f:
- vk = VerifyingKey.from_pem(f.read())
-
-print("uncompressed: {0}".format(vk.to_string("uncompressed").hex()))
-print("compressed: {0}".format(vk.to_string("compressed").hex()))
-```
-
-Load a verifying key from a hex string from compressed format, output
-uncompressed:
-
-```python
-from ecdsa import VerifyingKey, NIST256p
-
-comp_str = '022799c0d0ee09772fdd337d4f28dc155581951d07082fb19a38aa396b67e77759'
-vk = VerifyingKey.from_string(bytearray.fromhex(comp_str), curve=NIST256p)
-print(vk.to_string("uncompressed").hex())
-```
-
-ECDH key exchange with remote party:
-
-```python
-from ecdsa import ECDH, NIST256p
-
-ecdh = ECDH(curve=NIST256p)
-ecdh.generate_private_key()
-local_public_key = ecdh.get_public_key()
-#send `local_public_key` to remote party and receive `remote_public_key` from remote party
-with open("remote_public_key.pem") as e:
- remote_public_key = e.read()
-ecdh.load_received_public_key_pem(remote_public_key)
-secret = ecdh.generate_sharedsecret_bytes()
-```
-
-
diff --git a/frozen_deps/ecdsa-0.18.0.dist-info/RECORD b/frozen_deps/ecdsa-0.18.0.dist-info/RECORD
deleted file mode 100644
index f4130d1..0000000
--- a/frozen_deps/ecdsa-0.18.0.dist-info/RECORD
+++ /dev/null
@@ -1,64 +0,0 @@
-ecdsa-0.18.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-ecdsa-0.18.0.dist-info/LICENSE,sha256=PsqYRXc9LluMydjBGdNF8ApIBuS9Zg1KPWzfnA6di7I,1147
-ecdsa-0.18.0.dist-info/METADATA,sha256=vesFVMWT6uSeOuNwGGxtBm8nm6GROqNNRO28jr8wWqM,29750
-ecdsa-0.18.0.dist-info/RECORD,,
-ecdsa-0.18.0.dist-info/WHEEL,sha256=Z-nyYpwrcSqxfdux5Mbn_DQ525iP7J2DG3JgGvOYyTQ,110
-ecdsa-0.18.0.dist-info/top_level.txt,sha256=7ovPHfAPyTou19f8gOSbHm6B9dGjTibWolcCB7Zjovs,6
-ecdsa/__init__.py,sha256=m8jWFcZ9E-iiDqVaTy7ABtvEyTJlF58tZ45UAKj3UWo,1637
-ecdsa/__pycache__/__init__.cpython-310.pyc,,
-ecdsa/__pycache__/_compat.cpython-310.pyc,,
-ecdsa/__pycache__/_rwlock.cpython-310.pyc,,
-ecdsa/__pycache__/_sha3.cpython-310.pyc,,
-ecdsa/__pycache__/_version.cpython-310.pyc,,
-ecdsa/__pycache__/curves.cpython-310.pyc,,
-ecdsa/__pycache__/der.cpython-310.pyc,,
-ecdsa/__pycache__/ecdh.cpython-310.pyc,,
-ecdsa/__pycache__/ecdsa.cpython-310.pyc,,
-ecdsa/__pycache__/eddsa.cpython-310.pyc,,
-ecdsa/__pycache__/ellipticcurve.cpython-310.pyc,,
-ecdsa/__pycache__/errors.cpython-310.pyc,,
-ecdsa/__pycache__/keys.cpython-310.pyc,,
-ecdsa/__pycache__/numbertheory.cpython-310.pyc,,
-ecdsa/__pycache__/rfc6979.cpython-310.pyc,,
-ecdsa/__pycache__/test_curves.cpython-310.pyc,,
-ecdsa/__pycache__/test_der.cpython-310.pyc,,
-ecdsa/__pycache__/test_ecdh.cpython-310.pyc,,
-ecdsa/__pycache__/test_ecdsa.cpython-310.pyc,,
-ecdsa/__pycache__/test_eddsa.cpython-310.pyc,,
-ecdsa/__pycache__/test_ellipticcurve.cpython-310.pyc,,
-ecdsa/__pycache__/test_jacobi.cpython-310.pyc,,
-ecdsa/__pycache__/test_keys.cpython-310.pyc,,
-ecdsa/__pycache__/test_malformed_sigs.cpython-310.pyc,,
-ecdsa/__pycache__/test_numbertheory.cpython-310.pyc,,
-ecdsa/__pycache__/test_pyecdsa.cpython-310.pyc,,
-ecdsa/__pycache__/test_rw_lock.cpython-310.pyc,,
-ecdsa/__pycache__/test_sha3.cpython-310.pyc,,
-ecdsa/__pycache__/util.cpython-310.pyc,,
-ecdsa/_compat.py,sha256=EhUF8-sFu1dKKGDibkmItbYm_nKoklSIBgkIburUoAg,4619
-ecdsa/_rwlock.py,sha256=CAwHp2V65ksI8B1UqY7EccK9LaUToiv6pDLVzm44eag,2849
-ecdsa/_sha3.py,sha256=DJs7QLmdkQMU35llyD8HQeAXNvf5sMcujO6oFdScIqI,4747
-ecdsa/_version.py,sha256=YZ3BGOHr1Ltse4LfX7F80J6qmKFA-NS-G2eYUuw2WnU,498
-ecdsa/curves.py,sha256=Na5rpnuADNvWkCTlUGbs9xwVogY6Vl2_3uNzpVGgxtE,14390
-ecdsa/der.py,sha256=OmfH8fojeqfJnasAt7I1P8j_qfwcwl-W4gDx1-cO8M0,14109
-ecdsa/ecdh.py,sha256=Tiirawt5xegVDrY9eS-ATvvfmTIznUyv5fy2k7VnzTk,11011
-ecdsa/ecdsa.py,sha256=LPRHHXNvGyZ67lyM6cWqUuhQceCwoktfPij20UTsdJo,24955
-ecdsa/eddsa.py,sha256=IzsGzoGAefcoYjF7DVjFkX5ZJqiK2LTOmAMe6wyf4UU,7170
-ecdsa/ellipticcurve.py,sha256=HwlFqrihf7Q2GQTLYQ0PeCwsgMhk_GlkZz3I2Xj4-eI,53625
-ecdsa/errors.py,sha256=b4mhnmIpRnEdHzbectHAA5F7O9MtSaI-fYoc13_vBxQ,130
-ecdsa/keys.py,sha256=plsomRHYrN3Z3iigUqKM5An8_6TDk1nJNpFv_cPGAvM,65124
-ecdsa/numbertheory.py,sha256=XWugBG59BxrpvjZm7Ytsnmkv770vK8IkClObThpbvAM,17479
-ecdsa/rfc6979.py,sha256=zwzo33lsZJA9r2dSf7HCliI_yIbw5cJ0Ek9tLdRRO40,2850
-ecdsa/test_curves.py,sha256=l5N-m4Yo5IAy4a8aJMsBamaSlLAfSoYjYqCj1HDEVpU,13081
-ecdsa/test_der.py,sha256=q2mr4HS_JyUxojWTSLJu-MQZiTwaCE7W_VG3rwwPEas,14956
-ecdsa/test_ecdh.py,sha256=hUJXTo_Cr9ji9-EpPvpQf7-TgB97WUj2tWcwU-LqCXc,15238
-ecdsa/test_ecdsa.py,sha256=1clBfDtA0zdF-13BoKXsJffL5K-iFutlMgov0kmGro0,23923
-ecdsa/test_eddsa.py,sha256=Vlv5J0C4zNJu5zzr756qpm0AJmARpzBKCWrhHaF_bR4,32615
-ecdsa/test_ellipticcurve.py,sha256=K6W_EQunOfE-RVSux6d1O7LXzSuAsVk9F1elwyY-rYA,6085
-ecdsa/test_jacobi.py,sha256=JDQeM_JKwPfwWBd4IgqtOp1rboeQNUIPPA334b-nmLQ,18388
-ecdsa/test_keys.py,sha256=n_IYLxG4JwD84dYLDmRjV2A-NqsSrrR1P0XBJOCZsEI,32833
-ecdsa/test_malformed_sigs.py,sha256=hiV2vwzFrIdNIC-inYUJIKboyAAw2TKAIVXtFadyojg,10857
-ecdsa/test_numbertheory.py,sha256=g6hi7NZFKuMSAxJSAYW5sWM7ivSCiw8g5-PeoDyowgY,11619
-ecdsa/test_pyecdsa.py,sha256=WeRujEKpkZzHvEeXNnnhM1QdMH0Lxou7Bl4u8RXY-jM,82757
-ecdsa/test_rw_lock.py,sha256=byv0_FTM90cbuHPCI6__LeQJkHL_zYEeVYIBO8e2LLc,7021
-ecdsa/test_sha3.py,sha256=oKULy5KOTaXjpLXSyuHrB1wjPiQDxB6INp7Tf1EU8Ko,3022
-ecdsa/util.py,sha256=cOEN3_c8p79Dc8a-LcUQP2ctIsYky35jhSWc9hLP1qc,14618
diff --git a/frozen_deps/ecdsa-0.18.0.dist-info/WHEEL b/frozen_deps/ecdsa-0.18.0.dist-info/WHEEL
deleted file mode 100644
index 01b8fc7..0000000
--- a/frozen_deps/ecdsa-0.18.0.dist-info/WHEEL
+++ /dev/null
@@ -1,6 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.36.2)
-Root-Is-Purelib: true
-Tag: py2-none-any
-Tag: py3-none-any
-
diff --git a/frozen_deps/ecdsa-0.18.0.dist-info/top_level.txt b/frozen_deps/ecdsa-0.18.0.dist-info/top_level.txt
deleted file mode 100644
index aa5efdb..0000000
--- a/frozen_deps/ecdsa-0.18.0.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-ecdsa
diff --git a/frozen_deps/ecdsa/__init__.py b/frozen_deps/ecdsa/__init__.py
index ce8749a..342538e 100644
--- a/frozen_deps/ecdsa/__init__.py
+++ b/frozen_deps/ecdsa/__init__.py
@@ -28,6 +28,13 @@ from .curves import (
SECP160r1,
Ed25519,
Ed448,
+ BRAINPOOLP160t1,
+ BRAINPOOLP192t1,
+ BRAINPOOLP224t1,
+ BRAINPOOLP256t1,
+ BRAINPOOLP320t1,
+ BRAINPOOLP384t1,
+ BRAINPOOLP512t1,
)
from .ecdh import (
ECDH,
@@ -84,6 +91,13 @@ _hush_pyflakes = [
Ed25519,
Ed448,
six.b(""),
+ BRAINPOOLP160t1,
+ BRAINPOOLP192t1,
+ BRAINPOOLP224t1,
+ BRAINPOOLP256t1,
+ BRAINPOOLP320t1,
+ BRAINPOOLP384t1,
+ BRAINPOOLP512t1,
]
del _hush_pyflakes
diff --git a/frozen_deps/ecdsa/_compat.py b/frozen_deps/ecdsa/_compat.py
index 83d41a5..4558e33 100644
--- a/frozen_deps/ecdsa/_compat.py
+++ b/frozen_deps/ecdsa/_compat.py
@@ -91,28 +91,13 @@ if sys.version_info < (3, 0): # pragma: no branch
raise ValueError("Only 'big' or 'little' endian supported")
else:
- if sys.version_info < (3, 4): # pragma: no branch
- # on python 3.3 hmac.hmac.update() accepts only bytes, on newer
- # versions it does accept memoryview() also
- def hmac_compat(data):
- if not isinstance(data, bytes): # pragma: no branch
- return bytes(data)
- return data
-
- def normalise_bytes(buffer_object):
- """Cast the input into array of bytes."""
- if not buffer_object:
- return b""
- return memoryview(buffer_object).cast("B")
- else:
-
- def hmac_compat(data):
- return data
+ def hmac_compat(data):
+ return data
- def normalise_bytes(buffer_object):
- """Cast the input into array of bytes."""
- return memoryview(buffer_object).cast("B")
+ def normalise_bytes(buffer_object):
+ """Cast the input into array of bytes."""
+ return memoryview(buffer_object).cast("B")
def compat26_str(val):
return val
@@ -142,7 +127,7 @@ else:
if length is None:
length = byte_length(val)
# for gmpy we need to convert back to native int
- if type(val) != int:
+ if not isinstance(val, int):
val = int(val)
return bytearray(val.to_bytes(length=length, byteorder=byteorder))
diff --git a/frozen_deps/ecdsa/_version.py b/frozen_deps/ecdsa/_version.py
index 96aae17..cf329eb 100644
--- a/frozen_deps/ecdsa/_version.py
+++ b/frozen_deps/ecdsa/_version.py
@@ -8,11 +8,11 @@ import json
version_json = '''
{
- "date": "2022-07-09T14:49:17+0200",
+ "date": "2024-04-08T20:59:55+0200",
"dirty": false,
"error": null,
- "full-revisionid": "341e0d8be9fedf66fbc9a95630b4ed2138343380",
- "version": "0.18.0"
+ "full-revisionid": "be70016f8911f79e891a65dcfcb602e5ba866ed3",
+ "version": "0.19.0"
}
''' # END VERSION_JSON
diff --git a/frozen_deps/ecdsa/curves.py b/frozen_deps/ecdsa/curves.py
index 1119ee5..38e3a75 100644
--- a/frozen_deps/ecdsa/curves.py
+++ b/frozen_deps/ecdsa/curves.py
@@ -26,12 +26,19 @@ __all__ = [
"curve_by_name",
"SECP256k1",
"BRAINPOOLP160r1",
+ "BRAINPOOLP160t1",
"BRAINPOOLP192r1",
+ "BRAINPOOLP192t1",
"BRAINPOOLP224r1",
+ "BRAINPOOLP224t1",
"BRAINPOOLP256r1",
+ "BRAINPOOLP256t1",
"BRAINPOOLP320r1",
+ "BRAINPOOLP320t1",
"BRAINPOOLP384r1",
+ "BRAINPOOLP384t1",
"BRAINPOOLP512r1",
+ "BRAINPOOLP512t1",
"PRIME_FIELD_OID",
"CHARACTERISTIC_TWO_FIELD_OID",
"Ed25519",
@@ -375,6 +382,15 @@ BRAINPOOLP160r1 = Curve(
)
+BRAINPOOLP160t1 = Curve(
+ "BRAINPOOLP160t1",
+ ecdsa.curve_brainpoolp160t1,
+ ecdsa.generator_brainpoolp160t1,
+ (1, 3, 36, 3, 3, 2, 8, 1, 1, 2),
+ "brainpoolP160t1",
+)
+
+
BRAINPOOLP192r1 = Curve(
"BRAINPOOLP192r1",
ecdsa.curve_brainpoolp192r1,
@@ -384,6 +400,15 @@ BRAINPOOLP192r1 = Curve(
)
+BRAINPOOLP192t1 = Curve(
+ "BRAINPOOLP192t1",
+ ecdsa.curve_brainpoolp192t1,
+ ecdsa.generator_brainpoolp192t1,
+ (1, 3, 36, 3, 3, 2, 8, 1, 1, 4),
+ "brainpoolP192t1",
+)
+
+
BRAINPOOLP224r1 = Curve(
"BRAINPOOLP224r1",
ecdsa.curve_brainpoolp224r1,
@@ -393,6 +418,15 @@ BRAINPOOLP224r1 = Curve(
)
+BRAINPOOLP224t1 = Curve(
+ "BRAINPOOLP224t1",
+ ecdsa.curve_brainpoolp224t1,
+ ecdsa.generator_brainpoolp224t1,
+ (1, 3, 36, 3, 3, 2, 8, 1, 1, 6),
+ "brainpoolP224t1",
+)
+
+
BRAINPOOLP256r1 = Curve(
"BRAINPOOLP256r1",
ecdsa.curve_brainpoolp256r1,
@@ -402,6 +436,15 @@ BRAINPOOLP256r1 = Curve(
)
+BRAINPOOLP256t1 = Curve(
+ "BRAINPOOLP256t1",
+ ecdsa.curve_brainpoolp256t1,
+ ecdsa.generator_brainpoolp256t1,
+ (1, 3, 36, 3, 3, 2, 8, 1, 1, 8),
+ "brainpoolP256t1",
+)
+
+
BRAINPOOLP320r1 = Curve(
"BRAINPOOLP320r1",
ecdsa.curve_brainpoolp320r1,
@@ -411,6 +454,15 @@ BRAINPOOLP320r1 = Curve(
)
+BRAINPOOLP320t1 = Curve(
+ "BRAINPOOLP320t1",
+ ecdsa.curve_brainpoolp320t1,
+ ecdsa.generator_brainpoolp320t1,
+ (1, 3, 36, 3, 3, 2, 8, 1, 1, 10),
+ "brainpoolP320t1",
+)
+
+
BRAINPOOLP384r1 = Curve(
"BRAINPOOLP384r1",
ecdsa.curve_brainpoolp384r1,
@@ -420,6 +472,15 @@ BRAINPOOLP384r1 = Curve(
)
+BRAINPOOLP384t1 = Curve(
+ "BRAINPOOLP384t1",
+ ecdsa.curve_brainpoolp384t1,
+ ecdsa.generator_brainpoolp384t1,
+ (1, 3, 36, 3, 3, 2, 8, 1, 1, 12),
+ "brainpoolP384t1",
+)
+
+
BRAINPOOLP512r1 = Curve(
"BRAINPOOLP512r1",
ecdsa.curve_brainpoolp512r1,
@@ -429,6 +490,15 @@ BRAINPOOLP512r1 = Curve(
)
+BRAINPOOLP512t1 = Curve(
+ "BRAINPOOLP512t1",
+ ecdsa.curve_brainpoolp512t1,
+ ecdsa.generator_brainpoolp512t1,
+ (1, 3, 36, 3, 3, 2, 8, 1, 1, 14),
+ "brainpoolP512t1",
+)
+
+
Ed25519 = Curve(
"Ed25519",
eddsa.curve_ed25519,
@@ -466,6 +536,13 @@ curves = [
SECP160r1,
Ed25519,
Ed448,
+ BRAINPOOLP160t1,
+ BRAINPOOLP192t1,
+ BRAINPOOLP224t1,
+ BRAINPOOLP256t1,
+ BRAINPOOLP320t1,
+ BRAINPOOLP384t1,
+ BRAINPOOLP512t1,
]
diff --git a/frozen_deps/ecdsa/der.py b/frozen_deps/ecdsa/der.py
index 8b27941..b291485 100644
--- a/frozen_deps/ecdsa/der.py
+++ b/frozen_deps/ecdsa/der.py
@@ -4,8 +4,8 @@ import binascii
import base64
import warnings
from itertools import chain
-from six import int2byte, b, text_type
-from ._compat import str_idx_as_int
+from six import int2byte, text_type
+from ._compat import compat26_str, str_idx_as_int
class UnexpectedDER(Exception):
@@ -20,16 +20,16 @@ def encode_integer(r):
assert r >= 0 # can't support negative numbers yet
h = ("%x" % r).encode()
if len(h) % 2:
- h = b("0") + h
+ h = b"0" + h
s = binascii.unhexlify(h)
num = str_idx_as_int(s, 0)
if num <= 0x7F:
- return b("\x02") + encode_length(len(s)) + s
+ return b"\x02" + encode_length(len(s)) + s
else:
# DER integers are two's complement, so if the first byte is
# 0x80-0xff then we need an extra 0x00 byte to prevent it from
# looking negative.
- return b("\x02") + encode_length(len(s) + 1) + b("\x00") + s
+ return b"\x02" + encode_length(len(s) + 1) + b"\x00" + s
# sentry object to check if an argument was specified (used to detect
@@ -91,11 +91,11 @@ def encode_bitstring(s, unused=_sentry):
raise ValueError("unused bits must be zeros in DER")
encoded_unused = int2byte(unused)
len_extra = 1
- return b("\x03") + encode_length(len(s) + len_extra) + encoded_unused + s
+ return b"\x03" + encode_length(len(s) + len_extra) + encoded_unused + s
def encode_octet_string(s):
- return b("\x04") + encode_length(len(s)) + s
+ return b"\x04" + encode_length(len(s)) + s
def encode_oid(first, second, *pieces):
@@ -111,7 +111,7 @@ def encode_oid(first, second, *pieces):
def encode_sequence(*encoded_pieces):
total_len = sum([len(p) for p in encoded_pieces])
- return b("\x30") + encode_length(total_len) + b("").join(encoded_pieces)
+ return b"\x30" + encode_length(total_len) + b"".join(encoded_pieces)
def encode_number(n):
@@ -122,7 +122,7 @@ def encode_number(n):
if not b128_digits:
b128_digits.append(0)
b128_digits[-1] &= 0x7F
- return b("").join([int2byte(d) for d in b128_digits])
+ return b"".join([int2byte(d) for d in b128_digits])
def is_sequence(string):
@@ -254,7 +254,7 @@ def encode_length(l):
return int2byte(l)
s = ("%x" % l).encode()
if len(s) % 2:
- s = b("0") + s
+ s = b"0" + s
s = binascii.unhexlify(s)
llen = len(s)
return int2byte(0x80 | llen) + s
@@ -389,21 +389,21 @@ def unpem(pem):
if isinstance(pem, text_type): # pragma: no branch
pem = pem.encode()
- d = b("").join(
+ d = b"".join(
[
l.strip()
- for l in pem.split(b("\n"))
- if l and not l.startswith(b("-----"))
+ for l in pem.split(b"\n")
+ if l and not l.startswith(b"-----")
]
)
return base64.b64decode(d)
def topem(der, name):
- b64 = base64.b64encode(der)
+ b64 = base64.b64encode(compat26_str(der))
lines = [("-----BEGIN %s-----\n" % name).encode()]
lines.extend(
- [b64[start : start + 64] + b("\n") for start in range(0, len(b64), 64)]
+ [b64[start : start + 76] + b"\n" for start in range(0, len(b64), 76)]
)
lines.append(("-----END %s-----\n" % name).encode())
- return b("").join(lines)
+ return b"".join(lines)
diff --git a/frozen_deps/ecdsa/ecdsa.py b/frozen_deps/ecdsa/ecdsa.py
index 3328281..9284ace 100644
--- a/frozen_deps/ecdsa/ecdsa.py
+++ b/frozen_deps/ecdsa/ecdsa.py
@@ -64,7 +64,8 @@ Originally written in 2005 by Peter Pearson and placed in the public domain,
modified as part of the python-ecdsa package.
"""
-from six import int2byte, b
+import warnings
+from six import int2byte
from . import ellipticcurve
from . import numbertheory
from .util import bit_length
@@ -269,11 +270,17 @@ class Private_key(object):
return Signature(r, s)
-def int_to_string(x):
+def int_to_string(x): # pragma: no cover
"""Convert integer x into a string of bytes, as per X9.62."""
+ # deprecated in 0.19
+ warnings.warn(
+ "Function is unused in library code. If you use this code, "
+ "change to util.string_to_number.",
+ DeprecationWarning,
+ )
assert x >= 0
if x == 0:
- return b("\0")
+ return b"\0"
result = []
while x:
ordinal = x & 0xFF
@@ -281,11 +288,17 @@ def int_to_string(x):
x >>= 8
result.reverse()
- return b("").join(result)
+ return b"".join(result)
-def string_to_int(s):
+def string_to_int(s): # pragma: no cover
"""Convert a string of bytes into an integer, as per X9.62."""
+ # deprecated in 0.19
+ warnings.warn(
+ "Function is unused in library code. If you use this code, "
+ "change to util.number_to_string.",
+ DeprecationWarning,
+ )
result = 0
for c in s:
if not isinstance(c, int):
@@ -294,9 +307,16 @@ def string_to_int(s):
return result
-def digest_integer(m):
+def digest_integer(m): # pragma: no cover
"""Convert an integer into a string of bytes, compute
its SHA-1 hash, and convert the result to an integer."""
+ # deprecated in 0.19
+ warnings.warn(
+ "Function is unused in library code. If you use this code, "
+ "change to a one-liner with util.number_to_string and "
+ "util.string_to_number methods.",
+ DeprecationWarning,
+ )
#
# I don't expect this function to be used much. I wrote
# it in order to be able to duplicate the examples
@@ -654,6 +674,18 @@ generator_brainpoolp160r1 = ellipticcurve.PointJacobi(
curve_brainpoolp160r1, _Gx, _Gy, 1, _q, generator=True
)
+# Brainpool P-160-t1
+_a = 0xE95E4A5F737059DC60DFC7AD95B3D8139515620C
+_b = 0x7A556B6DAE535B7B51ED2C4D7DAA7A0B5C55F380
+# _z = 0x24DBFF5DEC9B986BBFE5295A29BFBAE45E0F5D0B
+_Gx = 0xB199B13B9B34EFC1397E64BAEB05ACC265FF2378
+_Gy = 0xADD6718B7C7C1961F0991B842443772152C9E0AD
+_q = 0xE95E4A5F737059DC60DF5991D45029409E60FC09
+curve_brainpoolp160t1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
+generator_brainpoolp160t1 = ellipticcurve.PointJacobi(
+ curve_brainpoolp160t1, _Gx, _Gy, 1, _q, generator=True
+)
+
# Brainpool P-192-r1
_a = 0x6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF
_b = 0x469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9
@@ -667,6 +699,19 @@ generator_brainpoolp192r1 = ellipticcurve.PointJacobi(
curve_brainpoolp192r1, _Gx, _Gy, 1, _q, generator=True
)
+# Brainpool P-192-t1
+_a = 0xC302F41D932A36CDA7A3463093D18DB78FCE476DE1A86294
+_b = 0x13D56FFAEC78681E68F9DEB43B35BEC2FB68542E27897B79
+# _z = 0x1B6F5CC8DB4DC7AF19458A9CB80DC2295E5EB9C3732104CB
+_Gx = 0x3AE9E58C82F63C30282E1FE7BBF43FA72C446AF6F4618129
+_Gy = 0x097E2C5667C2223A902AB5CA449D0084B7E5B3DE7CCC01C9
+_q = 0xC302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1
+
+curve_brainpoolp192t1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
+generator_brainpoolp192t1 = ellipticcurve.PointJacobi(
+ curve_brainpoolp192t1, _Gx, _Gy, 1, _q, generator=True
+)
+
# Brainpool P-224-r1
_a = 0x68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43
_b = 0x2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B
@@ -680,6 +725,19 @@ generator_brainpoolp224r1 = ellipticcurve.PointJacobi(
curve_brainpoolp224r1, _Gx, _Gy, 1, _q, generator=True
)
+# Brainpool P-224-t1
+_a = 0xD7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FC
+_b = 0x4B337D934104CD7BEF271BF60CED1ED20DA14C08B3BB64F18A60888D
+# _z = 0x2DF271E14427A346910CF7A2E6CFA7B3F484E5C2CCE1C8B730E28B3F
+_Gx = 0x6AB1E344CE25FF3896424E7FFE14762ECB49F8928AC0C76029B4D580
+_Gy = 0x0374E9F5143E568CD23F3F4D7C0D4B1E41C8CC0D1C6ABD5F1A46DB4C
+_q = 0xD7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F
+
+curve_brainpoolp224t1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
+generator_brainpoolp224t1 = ellipticcurve.PointJacobi(
+ curve_brainpoolp224t1, _Gx, _Gy, 1, _q, generator=True
+)
+
# Brainpool P-256-r1
_a = 0x7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9
_b = 0x26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6
@@ -693,6 +751,19 @@ generator_brainpoolp256r1 = ellipticcurve.PointJacobi(
curve_brainpoolp256r1, _Gx, _Gy, 1, _q, generator=True
)
+# Brainpool P-256-t1
+_a = 0xA9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5374
+_b = 0x662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B04
+# _z = 0x3E2D4BD9597B58639AE7AA669CAB9837CF5CF20A2C852D10F655668DFC150EF0
+_Gx = 0xA3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F4
+_Gy = 0x2D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE
+_q = 0xA9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7
+
+curve_brainpoolp256t1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
+generator_brainpoolp256t1 = ellipticcurve.PointJacobi(
+ curve_brainpoolp256t1, _Gx, _Gy, 1, _q, generator=True
+)
+
# Brainpool P-320-r1
_a = int(
remove_whitespace(
@@ -748,6 +819,61 @@ generator_brainpoolp320r1 = ellipticcurve.PointJacobi(
curve_brainpoolp320r1, _Gx, _Gy, 1, _q, generator=True
)
+# Brainpool P-320-t1
+_a = int(
+ remove_whitespace(
+ """
+ D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC
+ 28FCD412B1F1B32E24"""
+ ),
+ 16,
+)
+_b = int(
+ remove_whitespace(
+ """
+ A7F561E038EB1ED560B3D147DB782013064C19F27ED27C6780AAF77FB8A547
+ CEB5B4FEF422340353"""
+ ),
+ 16,
+)
+# _z = int(
+# remove_whitespace(
+# """
+# 15F75CAF668077F7E85B42EB01F0A81FF56ECD6191D55CB82B7D861458A18F
+# EFC3E5AB7496F3C7B1"""
+# ),
+# 16,
+# )
+_Gx = int(
+ remove_whitespace(
+ """
+ 925BE9FB01AFC6FB4D3E7D4990010F813408AB106C4F09CB7EE07868CC136F
+ FF3357F624A21BED52"""
+ ),
+ 16,
+)
+_Gy = int(
+ remove_whitespace(
+ """
+ 63BA3A7A27483EBF6671DBEF7ABB30EBEE084E58A0B077AD42A5A0989D1EE7
+ 1B1B9BC0455FB0D2C3"""
+ ),
+ 16,
+)
+_q = int(
+ remove_whitespace(
+ """
+ D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658
+ E98691555B44C59311"""
+ ),
+ 16,
+)
+
+curve_brainpoolp320t1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
+generator_brainpoolp320t1 = ellipticcurve.PointJacobi(
+ curve_brainpoolp320t1, _Gx, _Gy, 1, _q, generator=True
+)
+
# Brainpool P-384-r1
_a = int(
remove_whitespace(
@@ -803,6 +929,60 @@ generator_brainpoolp384r1 = ellipticcurve.PointJacobi(
curve_brainpoolp384r1, _Gx, _Gy, 1, _q, generator=True
)
+_a = int(
+ remove_whitespace(
+ """
+ 8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB711
+ 23ACD3A729901D1A71874700133107EC50"""
+ ),
+ 16,
+)
+_b = int(
+ remove_whitespace(
+ """
+ 7F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE
+ 1D2074AA263B88805CED70355A33B471EE"""
+ ),
+ 16,
+)
+# _z = int(
+# remove_whitespace(
+# """
+# 41DFE8DD399331F7166A66076734A89CD0D2BCDB7D068E44E1F378F41ECBAE
+# 97D2D63DBC87BCCDDCCC5DA39E8589291C"""
+# ),
+# 16,
+# )
+_Gx = int(
+ remove_whitespace(
+ """
+ 18DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AAB
+ FFC4FF191B946A5F54D8D0AA2F418808CC"""
+ ),
+ 16,
+)
+_Gy = int(
+ remove_whitespace(
+ """
+ 25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CC
+ FE469408584DC2B2912675BF5B9E582928"""
+ ),
+ 16,
+)
+_q = int(
+ remove_whitespace(
+ """
+ 8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425
+ A7CF3AB6AF6B7FC3103B883202E9046565"""
+ ),
+ 16,
+)
+
+curve_brainpoolp384t1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
+generator_brainpoolp384t1 = ellipticcurve.PointJacobi(
+ curve_brainpoolp384t1, _Gx, _Gy, 1, _q, generator=True
+)
+
# Brainpool P-512-r1
_a = int(
remove_whitespace(
@@ -857,3 +1037,58 @@ curve_brainpoolp512r1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
generator_brainpoolp512r1 = ellipticcurve.PointJacobi(
curve_brainpoolp512r1, _Gx, _Gy, 1, _q, generator=True
)
+
+# Brainpool P-512-t1
+_a = int(
+ remove_whitespace(
+ """
+ AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308
+ 717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F0"""
+ ),
+ 16,
+)
+_b = int(
+ remove_whitespace(
+ """
+ 7CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36
+ A62BCDFA2304976540F6450085F2DAE145C22553B465763689180EA2571867423E"""
+ ),
+ 16,
+)
+# _z = int(
+# remove_whitespace(
+# """
+# 12EE58E6764838B69782136F0F2D3BA06E27695716054092E60A80BEDB212B
+# 64E585D90BCE13761F85C3F1D2A64E3BE8FEA2220F01EBA5EEB0F35DBD29D922AB"""
+# ),
+# 16,
+# )
+_Gx = int(
+ remove_whitespace(
+ """
+ 640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C031
+ 3D82BA51735CDB3EA499AA77A7D6943A64F7A3F25FE26F06B51BAA2696FA9035DA"""
+ ),
+ 16,
+)
+_Gy = int(
+ remove_whitespace(
+ """
+ 5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CE
+ E9D9932184BEEF216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332"""
+ ),
+ 16,
+)
+_q = int(
+ remove_whitespace(
+ """
+ AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308
+ 70553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069"""
+ ),
+ 16,
+)
+
+curve_brainpoolp512t1 = ellipticcurve.CurveFp(_p, _a, _b, 1)
+generator_brainpoolp512t1 = ellipticcurve.PointJacobi(
+ curve_brainpoolp512t1, _Gx, _Gy, 1, _q, generator=True
+)
diff --git a/frozen_deps/ecdsa/ellipticcurve.py b/frozen_deps/ecdsa/ellipticcurve.py
index d6f7146..18816a6 100644
--- a/frozen_deps/ecdsa/ellipticcurve.py
+++ b/frozen_deps/ecdsa/ellipticcurve.py
@@ -136,11 +136,17 @@ class CurveFp(object):
return (y * y - ((x * x + self.__a) * x + self.__b)) % self.__p == 0
def __str__(self):
- return "CurveFp(p=%d, a=%d, b=%d, h=%d)" % (
+ if self.__h is not None:
+ return "CurveFp(p={0}, a={1}, b={2}, h={3})".format(
+ self.__p,
+ self.__a,
+ self.__b,
+ self.__h,
+ )
+ return "CurveFp(p={0}, a={1}, b={2})".format(
self.__p,
self.__a,
self.__b,
- self.__h,
)
@@ -219,11 +225,17 @@ class CurveEdTw(object):
return self.__h
def __str__(self):
- return "CurveEdTw(p={0}, a={1}, d={2}, h={3})".format(
+ if self.__h is not None:
+ return "CurveEdTw(p={0}, a={1}, d={2}, h={3})".format(
+ self.__p,
+ self.__a,
+ self.__d,
+ self.__h,
+ )
+ return "CurveEdTw(p={0}, a={1}, d={2})".format(
self.__p,
self.__a,
self.__d,
- self.__h,
)
@@ -1008,8 +1020,8 @@ class PointJacobi(AbstractPoint):
# so we need 4 combined points:
mAmB_X, mAmB_Y, mAmB_Z = _add(X1, -Y1, Z1, X2, -Y2, Z2, p)
pAmB_X, pAmB_Y, pAmB_Z = _add(X1, Y1, Z1, X2, -Y2, Z2, p)
- mApB_X, mApB_Y, mApB_Z = _add(X1, -Y1, Z1, X2, Y2, Z2, p)
- pApB_X, pApB_Y, pApB_Z = _add(X1, Y1, Z1, X2, Y2, Z2, p)
+ mApB_X, mApB_Y, mApB_Z = pAmB_X, -pAmB_Y, pAmB_Z
+ pApB_X, pApB_Y, pApB_Z = mAmB_X, -mAmB_Y, mAmB_Z
# when the self and other sum to infinity, we need to add them
# one by one to get correct result but as that's very unlikely to
# happen in regular operation, we don't need to optimise this case
@@ -1520,7 +1532,9 @@ class PointEdwards(AbstractPoint):
X3, Y3, Z3, T3 = self._double(X1, Y1, Z1, T1, p, a)
- if not X3 or not T3:
+ # both Ed25519 and Ed448 have prime order, so no point added to
+ # itself will equal zero
+ if not X3 or not T3: # pragma: no branch
return INFINITY
return PointEdwards(self.__curve, X3, Y3, Z3, T3, self.__order)
diff --git a/frozen_deps/ecdsa/keys.py b/frozen_deps/ecdsa/keys.py
index 2b7d316..f74252c 100644
--- a/frozen_deps/ecdsa/keys.py
+++ b/frozen_deps/ecdsa/keys.py
@@ -5,9 +5,9 @@ Primary classes for performing signing and verification operations.
import binascii
from hashlib import sha1
import os
-from six import PY2, b
+from six import PY2
from . import ecdsa, eddsa
-from . import der
+from . import der, ssh
from . import rfc6979
from . import ellipticcurve
from .curves import NIST192p, Curve, Ed25519, Ed448
@@ -614,6 +614,18 @@ class VerifyingKey(object):
der.encode_bitstring(point_str, 0),
)
+ def to_ssh(self):
+ """
+ Convert the public key to the SSH format.
+
+ :return: SSH encoding of the public key
+ :rtype: bytes
+ """
+ return ssh.serialize_public(
+ self.curve.name,
+ self.to_string(),
+ )
+
def verify(
self,
signature,
@@ -1032,7 +1044,7 @@ class SigningKey(object):
curve = None
s, empty = der.remove_sequence(s)
- if empty != b(""):
+ if empty != b"":
raise der.UnexpectedDER(
"trailing junk after DER privkey: %s" % binascii.hexlify(empty)
)
@@ -1090,12 +1102,6 @@ class SigningKey(object):
curve = Curve.from_der(algorithm_identifier, valid_curve_encodings)
- if empty != b"":
- raise der.UnexpectedDER(
- "unexpected data after algorithm identifier: %s"
- % binascii.hexlify(empty)
- )
-
# Up next is an octet string containing an ECPrivateKey. Ignore
# the optional "attributes" and "publicKey" fields that come after.
s, _ = der.remove_octet_string(s)
@@ -1103,7 +1109,7 @@ class SigningKey(object):
# Unpack the ECPrivateKey to get to the key data octet string,
# and rejoin the ssleay parsing path.
s, empty = der.remove_sequence(s)
- if empty != b(""):
+ if empty != b"":
raise der.UnexpectedDER(
"trailing junk after DER privkey: %s"
% binascii.hexlify(empty)
@@ -1143,7 +1149,7 @@ class SigningKey(object):
# our from_string method likes fixed-length privkey strings
if len(privkey_str) < curve.baselen:
privkey_str = (
- b("\x00") * (curve.baselen - len(privkey_str)) + privkey_str
+ b"\x00" * (curve.baselen - len(privkey_str)) + privkey_str
)
return cls.from_string(privkey_str, curve, hashfunc)
@@ -1281,6 +1287,19 @@ class SigningKey(object):
der.encode_octet_string(ec_private_key),
)
+ def to_ssh(self):
+ """
+ Convert the private key to the SSH format.
+
+ :return: SSH encoded private key
+ :rtype: bytes
+ """
+ return ssh.serialize_private(
+ self.curve.name,
+ self.verifying_key.to_string(),
+ self.to_string(),
+ )
+
def get_verifying_key(self):
"""
Return the VerifyingKey associated with this private key.
diff --git a/frozen_deps/ecdsa/numbertheory.py b/frozen_deps/ecdsa/numbertheory.py
index d3500c7..fe974f8 100644
--- a/frozen_deps/ecdsa/numbertheory.py
+++ b/frozen_deps/ecdsa/numbertheory.py
@@ -20,11 +20,11 @@ try:
except NameError:
xrange = range
try:
- from gmpy2 import powmod
+ from gmpy2 import powmod, mpz
GMPY2 = True
GMPY = False
-except ImportError:
+except ImportError: # pragma: no branch
GMPY2 = False
try:
from gmpy import mpz
@@ -33,8 +33,15 @@ except ImportError:
except ImportError:
GMPY = False
+
+if GMPY2 or GMPY: # pragma: no branch
+ integer_types = tuple(integer_types + (type(mpz(1)),))
+
+
import math
import warnings
+import random
+from .util import bit_length
class Error(Exception):
@@ -216,14 +223,15 @@ def square_root_mod_prime(a, p):
range_top = min(0x7FFFFFFF, p)
else:
range_top = p
- for b in xrange(2, range_top):
+ for b in xrange(2, range_top): # pragma: no branch
if jacobi(b * b - 4 * a, p) == -1:
f = (a, -b, 1)
ff = polynomial_exp_mod((0, 1), (p + 1) // 2, f, p)
if ff[1]:
raise SquareRootError("p is not prime")
return ff[0]
- raise RuntimeError("No b found.")
+ # just an assertion
+ raise RuntimeError("No b found.") # pragma: no cover
# because all the inverse_mod code is arch/environment specific, and coveralls
@@ -346,7 +354,7 @@ def factorization(n):
q, r = divmod(n, d)
if r == 0:
count = 1
- while d <= n:
+ while d <= n: # pragma: no branch
n = q
q, r = divmod(n, d)
if r != 0:
@@ -370,7 +378,8 @@ def factorization(n):
if r == 0: # d divides n. How many times?
count = 1
n = q
- while d <= n: # As long as d might still divide n,
+ # As long as d might still divide n,
+ while d <= n: # pragma: no branch
q, r = divmod(n, d) # see if it does.
if r != 0:
break
@@ -555,8 +564,8 @@ def is_prime(n):
return True
else:
return False
-
- if gcd(n, 2 * 3 * 5 * 7 * 11) != 1:
+ # 2310 = 2 * 3 * 5 * 7 * 11
+ if gcd(n, 2310) != 1:
return False
# Choose a number of iterations sufficient to reduce the
@@ -564,7 +573,8 @@ def is_prime(n):
# (from Menezes et al. Table 4.4):
t = 40
- n_bits = 1 + int(math.log(n, 2))
+ n_bits = 1 + bit_length(n)
+ assert 11 <= n_bits <= 16384
for k, tt in (
(100, 27),
(150, 18),
@@ -591,7 +601,7 @@ def is_prime(n):
s = s + 1
r = r // 2
for i in xrange(t):
- a = smallprimes[i]
+ a = random.choice(smallprimes)
y = pow(a, r, n)
if y != 1 and y != n - 1:
j = 1
diff --git a/frozen_deps/ecdsa/ssh.py b/frozen_deps/ecdsa/ssh.py
new file mode 100644
index 0000000..64e9403
--- /dev/null
+++ b/frozen_deps/ecdsa/ssh.py
@@ -0,0 +1,83 @@
+import binascii
+from . import der
+from ._compat import compat26_str, int_to_bytes
+
+_SSH_ED25519 = b"ssh-ed25519"
+_SK_MAGIC = b"openssh-key-v1\0"
+_NONE = b"none"
+
+
+def _get_key_type(name):
+ if name == "Ed25519":
+ return _SSH_ED25519
+ else:
+ raise ValueError("Unsupported key type")
+
+
+class _Serializer:
+ def __init__(self):
+ self.bytes = b""
+
+ def put_raw(self, val):
+ self.bytes += val
+
+ def put_u32(self, val):
+ self.bytes += int_to_bytes(val, length=4, byteorder="big")
+
+ def put_str(self, val):
+ self.put_u32(len(val))
+ self.bytes += val
+
+ def put_pad(self, blklen=8):
+ padlen = blklen - (len(self.bytes) % blklen)
+ self.put_raw(bytearray(range(1, 1 + padlen)))
+
+ def encode(self):
+ return binascii.b2a_base64(compat26_str(self.bytes))
+
+ def tobytes(self):
+ return self.bytes
+
+ def topem(self):
+ return der.topem(self.bytes, "OPENSSH PRIVATE KEY")
+
+
+def serialize_public(name, pub):
+ serial = _Serializer()
+ ktype = _get_key_type(name)
+ serial.put_str(ktype)
+ serial.put_str(pub)
+ return b" ".join([ktype, serial.encode()])
+
+
+def serialize_private(name, pub, priv):
+ # encode public part
+ spub = _Serializer()
+ ktype = _get_key_type(name)
+ spub.put_str(ktype)
+ spub.put_str(pub)
+
+ # encode private part
+ spriv = _Serializer()
+ checksum = 0
+ spriv.put_u32(checksum)
+ spriv.put_u32(checksum)
+ spriv.put_raw(spub.tobytes())
+ spriv.put_str(priv + pub)
+ comment = b""
+ spriv.put_str(comment)
+ spriv.put_pad()
+
+ # top-level structure
+ main = _Serializer()
+ main.put_raw(_SK_MAGIC)
+ ciphername = kdfname = _NONE
+ main.put_str(ciphername)
+ main.put_str(kdfname)
+ nokdf = 0
+ main.put_u32(nokdf)
+ nkeys = 1
+ main.put_u32(nkeys)
+ main.put_str(spub.tobytes())
+ main.put_str(spriv.tobytes())
+ return main.topem()
diff --git a/frozen_deps/ecdsa/test_der.py b/frozen_deps/ecdsa/test_der.py
index 0ca5bd7..0c2dc4d 100644
--- a/frozen_deps/ecdsa/test_der.py
+++ b/frozen_deps/ecdsa/test_der.py
@@ -7,9 +7,9 @@ try:
import unittest2 as unittest
except ImportError:
import unittest
-from six import b
+import sys
import hypothesis.strategies as st
-from hypothesis import given
+from hypothesis import given, settings
import pytest
from ._compat import str_idx_as_int
from .curves import NIST256p, NIST224p
@@ -32,44 +32,44 @@ class TestRemoveInteger(unittest.TestCase):
# interpreted as negative, check if those errors are detected
def test_non_minimal_encoding(self):
with self.assertRaises(UnexpectedDER):
- remove_integer(b("\x02\x02\x00\x01"))
+ remove_integer(b"\x02\x02\x00\x01")
def test_negative_with_high_bit_set(self):
with self.assertRaises(UnexpectedDER):
- remove_integer(b("\x02\x01\x80"))
+ remove_integer(b"\x02\x01\x80")
def test_minimal_with_high_bit_set(self):
- val, rem = remove_integer(b("\x02\x02\x00\x80"))
+ val, rem = remove_integer(b"\x02\x02\x00\x80")
self.assertEqual(val, 0x80)
self.assertEqual(rem, b"")
def test_two_zero_bytes_with_high_bit_set(self):
with self.assertRaises(UnexpectedDER):
- remove_integer(b("\x02\x03\x00\x00\xff"))
+ remove_integer(b"\x02\x03\x00\x00\xff")
def test_zero_length_integer(self):
with self.assertRaises(UnexpectedDER):
- remove_integer(b("\x02\x00"))
+ remove_integer(b"\x02\x00")
def test_empty_string(self):
with self.assertRaises(UnexpectedDER):
- remove_integer(b(""))
+ remove_integer(b"")
def test_encoding_of_zero(self):
- val, rem = remove_integer(b("\x02\x01\x00"))
+ val, rem = remove_integer(b"\x02\x01\x00")
self.assertEqual(val, 0)
self.assertEqual(rem, b"")
def test_encoding_of_127(self):
- val, rem = remove_integer(b("\x02\x01\x7f"))
+ val, rem = remove_integer(b"\x02\x01\x7f")
self.assertEqual(val, 127)
self.assertEqual(rem, b"")
def test_encoding_of_128(self):
- val, rem = remove_integer(b("\x02\x02\x00\x80"))
+ val, rem = remove_integer(b"\x02\x02\x00\x80")
self.assertEqual(val, 128)
self.assertEqual(rem, b"")
@@ -92,37 +92,37 @@ class TestReadLength(unittest.TestCase):
# form and lengths above that encoded with minimal number of bytes
# necessary
def test_zero_length(self):
- self.assertEqual((0, 1), read_length(b("\x00")))
+ self.assertEqual((0, 1), read_length(b"\x00"))
def test_two_byte_zero_length(self):
with self.assertRaises(UnexpectedDER):
- read_length(b("\x81\x00"))
+ read_length(b"\x81\x00")
def test_two_byte_small_length(self):
with self.assertRaises(UnexpectedDER):
- read_length(b("\x81\x7f"))
+ read_length(b"\x81\x7f")
def test_long_form_with_zero_length(self):
with self.assertRaises(UnexpectedDER):
- read_length(b("\x80"))
+ read_length(b"\x80")
def test_smallest_two_byte_length(self):
- self.assertEqual((128, 2), read_length(b("\x81\x80")))
+ self.assertEqual((128, 2), read_length(b"\x81\x80"))
def test_zero_padded_length(self):
with self.assertRaises(UnexpectedDER):
- read_length(b("\x82\x00\x80"))
+ read_length(b"\x82\x00\x80")
def test_two_three_byte_length(self):
self.assertEqual((256, 3), read_length(b"\x82\x01\x00"))
def test_empty_string(self):
with self.assertRaises(UnexpectedDER):
- read_length(b(""))
+ read_length(b"")
def test_length_overflow(self):
with self.assertRaises(UnexpectedDER):
- read_length(b("\x83\x01\x00"))
+ read_length(b"\x83\x01\x00")
class TestEncodeBitstring(unittest.TestCase):
@@ -144,26 +144,22 @@ class TestEncodeBitstring(unittest.TestCase):
def test_new_call_convention(self):
"""This is how it should be called now."""
- warnings.simplefilter("always")
- with pytest.warns(None) as warns:
+ # make sure no warnings are raised
+ with warnings.catch_warnings():
+ warnings.simplefilter("error")
der = encode_bitstring(b"\xff", 0)
- # verify that new call convention doesn't raise Warnings
- self.assertEqual(len(warns), 0)
-
self.assertEqual(der, b"\x03\x02\x00\xff")
def test_implicit_unused_bits(self):
"""
Writing bit string with already included the number of unused bits.
"""
- warnings.simplefilter("always")
- with pytest.warns(None) as warns:
+ # make sure no warnings are raised
+ with warnings.catch_warnings():
+ warnings.simplefilter("error")
der = encode_bitstring(b"\x00\xff", None)
- # verify that new call convention doesn't raise Warnings
- self.assertEqual(len(warns), 0)
-
self.assertEqual(der, b"\x03\x02\x00\xff")
def test_explicit_unused_bits(self):
@@ -203,22 +199,20 @@ class TestRemoveBitstring(unittest.TestCase):
self.assertEqual(rest, b"")
def test_new_call_convention(self):
- warnings.simplefilter("always")
- with pytest.warns(None) as warns:
+ # make sure no warnings are raised
+ with warnings.catch_warnings():
+ warnings.simplefilter("error")
bits, rest = remove_bitstring(b"\x03\x02\x00\xff", 0)
- self.assertEqual(len(warns), 0)
-
self.assertEqual(bits, b"\xff")
self.assertEqual(rest, b"")
def test_implicit_unexpected_unused(self):
- warnings.simplefilter("always")
- with pytest.warns(None) as warns:
+ # make sure no warnings are raised
+ with warnings.catch_warnings():
+ warnings.simplefilter("error")
bits, rest = remove_bitstring(b"\x03\x02\x00\xff", None)
- self.assertEqual(len(warns), 0)
-
self.assertEqual(bits, (b"\xff", 0))
self.assertEqual(rest, b"")
@@ -275,10 +269,10 @@ class TestStrIdxAsInt(unittest.TestCase):
class TestEncodeOid(unittest.TestCase):
def test_pub_key_oid(self):
oid_ecPublicKey = encode_oid(1, 2, 840, 10045, 2, 1)
- self.assertEqual(hexlify(oid_ecPublicKey), b("06072a8648ce3d0201"))
+ self.assertEqual(hexlify(oid_ecPublicKey), b"06072a8648ce3d0201")
def test_nist224p_oid(self):
- self.assertEqual(hexlify(NIST224p.encoded_oid), b("06052b81040021"))
+ self.assertEqual(hexlify(NIST224p.encoded_oid), b"06052b81040021")
def test_nist256p_oid(self):
self.assertEqual(
@@ -468,6 +462,14 @@ def st_oid(draw, max_value=2**512, max_size=50):
return (first, second) + tuple(rest)
+HYP_SETTINGS = {}
+
+
+if "--fast" in sys.argv: # pragma: no cover
+ HYP_SETTINGS["max_examples"] = 2
+
+
+@settings(**HYP_SETTINGS)
@given(st_oid())
def test_oids(ids):
encoded_oid = encode_oid(*ids)
diff --git a/frozen_deps/ecdsa/test_ecdh.py b/frozen_deps/ecdsa/test_ecdh.py
index 872d4d1..cb22580 100644
--- a/frozen_deps/ecdsa/test_ecdh.py
+++ b/frozen_deps/ecdsa/test_ecdh.py
@@ -1,4 +1,5 @@
import os
+import sys
import shutil
import subprocess
import pytest
@@ -16,6 +17,8 @@ from .curves import (
NIST384p,
NIST521p,
BRAINPOOLP160r1,
+ SECP112r2,
+ SECP128r1,
)
from .curves import curves
from .ecdh import (
@@ -29,6 +32,10 @@ from .keys import SigningKey, VerifyingKey
from .ellipticcurve import CurveEdTw
+if "--fast" in sys.argv: # pragma: no cover
+ curves = [SECP112r2, SECP128r1]
+
+
@pytest.mark.parametrize(
"vcurve",
curves,
@@ -366,6 +373,7 @@ OPENSSL_SUPPORTED_CURVES = set(
)
@pytest.mark.parametrize(
"vcurve",
curves,
diff --git a/frozen_deps/ecdsa/test_ecdsa.py b/frozen_deps/ecdsa/test_ecdsa.py
index dbc4a6e..c1e2582 100644
--- a/frozen_deps/ecdsa/test_ecdsa.py
+++ b/frozen_deps/ecdsa/test_ecdsa.py
@@ -27,6 +27,7 @@ from .ecdsa import (
generator_112r2,
int_to_string,
)
+from .ellipticcurve import Point
HYP_SETTINGS = {}
@@ -76,6 +77,19 @@ class TestP192FromX9_62(unittest.TestCase):
def test_rejection(self):
assert not self.pubk.verifies(self.msg - 1, self.sig)
+ def test_verification_with_regular_point(self):
+ pubk = Public_key(
+ Point(
+ generator_192.curve(),
+ generator_192.x(),
+ generator_192.y(),
+ generator_192.order(),
+ ),
+ self.pubk.point,
+ )
+
+ assert pubk.verifies(self.msg, self.sig)
+
class TestPublicKey(unittest.TestCase):
def test_equality_public_keys(self):
@@ -584,7 +598,13 @@ def test_signature_validity(gen, msg, qx, qy, r, s, expected):
elliptic curve of `gen`, `r` and `s` are the signature, and
`expected` is True iff the signature is expected to be valid."""
pubk = Public_key(gen, ellipticcurve.Point(gen.curve(), qx, qy))
- assert expected == pubk.verifies(digest_integer(msg), Signature(r, s))
+ with pytest.warns(DeprecationWarning) as warns:
+ msg_dgst = digest_integer(msg)
+ assert len(warns) == 3
+ assert "unused" in warns[0].message.args[0]
+ assert "unused" in warns[1].message.args[0]
+ assert "unused" in warns[2].message.args[0]
+ assert expected == pubk.verifies(msg_dgst, Signature(r, s))
@pytest.mark.parametrize(
@@ -593,7 +613,13 @@ def test_signature_validity(gen, msg, qx, qy, r, s, expected):
def test_pk_recovery(gen, msg, r, s, qx, qy, expected):
del expected
sign = Signature(r, s)
- pks = sign.recover_public_keys(digest_integer(msg), gen)
+ with pytest.warns(DeprecationWarning) as warns:
+ msg_dgst = digest_integer(msg)
+ assert len(warns) == 3
+ assert "unused" in warns[0].message.args[0]
+ assert "unused" in warns[1].message.args[0]
+ assert "unused" in warns[2].message.args[0]
+ pks = sign.recover_public_keys(msg_dgst, gen)
assert pks
@@ -622,19 +648,22 @@ def st_random_gen_key_msg_nonce(draw):
name = draw(st.sampled_from(sorted(name_gen.keys())))
note("Generator used: {0}".format(name))
generator = name_gen[name]
- order = int(generator.order())
+ order = int(generator.order()) - 1
key = draw(st.integers(min_value=1, max_value=order))
msg = draw(st.integers(min_value=1, max_value=order))
nonce = draw(
- st.integers(min_value=1, max_value=order + 1)
+ st.integers(min_value=1, max_value=order)
| st.integers(min_value=order >> 1, max_value=order)
)
return generator, key, msg, nonce
SIG_VER_SETTINGS = dict(HYP_SETTINGS)
-SIG_VER_SETTINGS["max_examples"] = 10
+if "--fast" in sys.argv: # pragma: no cover
+ SIG_VER_SETTINGS["max_examples"] = 1
+else:
+ SIG_VER_SETTINGS["max_examples"] = 10
@settings(**SIG_VER_SETTINGS)
@@ -658,4 +687,8 @@ def test_sig_verify(args):
def test_int_to_string_with_zero():
- assert int_to_string(0) == b"\x00"
+ with pytest.warns(DeprecationWarning) as warns:
+ assert int_to_string(0) == b"\x00"
+
+ assert len(warns) == 1
+ assert "unused" in warns[0].message.args[0]
diff --git a/frozen_deps/ecdsa/test_eddsa.py b/frozen_deps/ecdsa/test_eddsa.py
index 7a09ad7..6821b3b 100644
--- a/frozen_deps/ecdsa/test_eddsa.py
+++ b/frozen_deps/ecdsa/test_eddsa.py
@@ -1,3 +1,4 @@
+import sys
import pickle
import hashlib
import pytest
@@ -162,6 +163,27 @@ def test_ed25519_eq_x_different_y():
assert a != b
+def test_ed25519_mul_by_order():
+ g = PointEdwards(
+ curve_ed25519,
+ generator_ed25519.x(),
+ generator_ed25519.y(),
+ 1,
+ generator_ed25519.x() * generator_ed25519.y(),
+ )
+
+ assert g * generator_ed25519.order() == INFINITY
+
+
+def test_radd():
+
+ a = PointEdwards(curve_ed25519, 1, 1, 1, 1)
+
+ p = INFINITY + a
+
+ assert p == a
+
+
def test_ed25519_test_normalisation_and_scaling():
x = generator_ed25519.x()
y = generator_ed25519.y()
@@ -259,6 +281,22 @@ class TestEd25519(unittest.TestCase):
self.assertIn("different curve", str(e.exception))
+def test_generate_with_point():
+ x1 = int(
+ "427838232691226969392843410947554224151809796397784248136826"
+ "78720006717057747"
+ )
+ y1 = int(
+ "463168356949264781694283940034751631413079938662562256157830"
+ "33603165251855960"
+ )
+ p = PointEdwards(curve_ed25519, x1, y1, 1, x1 * y1)
+
+ pk = PublicKey(generator_ed25519, b"0" * 32, public_point=p)
+
+ assert pk.public_point() == p
+
+
def test_ed25519_mul_to_order_min_1():
x1 = int(
"427838232691226969392843410947554224151809796397784248136826"
@@ -500,6 +538,7 @@ class TestEdDSAEquality(unittest.TestCase):
key2 = PublicKey(generator_ed25519, b"\x01" * 32)
self.assertEqual(key1, key2)
+ # verify that `__ne__` works as expected
self.assertFalse(key1 != key2)
def test_unequal_public_points(self):
@@ -519,6 +558,7 @@ class TestEdDSAEquality(unittest.TestCase):
key2 = PublicKey(generator_ed448, b"\x03" * 56 + b"\x00")
self.assertNotEqual(key1, key2)
+ # verify that `__ne__` works as expected
self.assertTrue(key1 != key2)
def test_equal_private_keys(self):
@@ -526,6 +566,7 @@ class TestEdDSAEquality(unittest.TestCase):
key2 = PrivateKey(generator_ed25519, b"\x01" * 32)
self.assertEqual(key1, key2)
+ # verify that `__ne__` works as expected
self.assertFalse(key1 != key2)
def test_unequal_private_keys(self):
@@ -533,6 +574,7 @@ class TestEdDSAEquality(unittest.TestCase):
key2 = PrivateKey(generator_ed25519, b"\x02" * 32)
self.assertNotEqual(key1, key2)
+ # verify that `__ne__` works as expected
self.assertTrue(key1 != key2)
def test_unequal_privatekey_to_string(self):
@@ -643,7 +685,10 @@ class TestInvalidEdDSAInputs(unittest.TestCase):
HYP_SETTINGS = dict()
-HYP_SETTINGS["max_examples"] = 10
+if "--fast" in sys.argv: # pragma: no cover
+ HYP_SETTINGS["max_examples"] = 2
+else:
+ HYP_SETTINGS["max_examples"] = 10
@settings(**HYP_SETTINGS)
diff --git a/frozen_deps/ecdsa/test_ellipticcurve.py b/frozen_deps/ecdsa/test_ellipticcurve.py
index 85faef4..9bf0951 100644
--- a/frozen_deps/ecdsa/test_ellipticcurve.py
+++ b/frozen_deps/ecdsa/test_ellipticcurve.py
@@ -14,7 +14,7 @@ try:
except ImportError: # pragma: no cover
HC_PRESENT = False
from .numbertheory import inverse_mod
-from .ellipticcurve import CurveFp, INFINITY, Point
+from .ellipticcurve import CurveFp, INFINITY, Point, CurveEdTw
HYP_SETTINGS = {}
@@ -40,11 +40,11 @@ g_23 = Point(c_23, 13, 7, 7)
HYP_SLOW_SETTINGS = dict(HYP_SETTINGS)
-HYP_SLOW_SETTINGS["max_examples"] = 10
+HYP_SLOW_SETTINGS["max_examples"] = 2
@settings(**HYP_SLOW_SETTINGS)
-@given(st.integers(min_value=1, max_value=r + 1))
+@given(st.integers(min_value=1, max_value=r - 1))
def test_p192_mult_tests(multiple):
inv_m = inverse_mod(multiple, r)
@@ -97,6 +97,32 @@ class TestCurve(unittest.TestCase):
self.assertDictEqual({c_23: None}, {eq1: None})
self.assertIn(eq2, {eq3: None})
+ def test___str__(self):
+ self.assertEqual(str(self.c_23), "CurveFp(p=23, a=1, b=1)")
+
+ def test___str___with_cofactor(self):
+ c = CurveFp(23, 1, 1, 4)
+ self.assertEqual(str(c), "CurveFp(p=23, a=1, b=1, h=4)")
+
+
+class TestCurveEdTw(unittest.TestCase):
+ @classmethod
+ def setUpClass(cls):
+ cls.c_23 = CurveEdTw(23, 1, 1)
+
+ def test___str__(self):
+ self.assertEqual(str(self.c_23), "CurveEdTw(p=23, a=1, d=1)")
+
+ def test___str___with_cofactor(self):
+ c = CurveEdTw(23, 1, 1, 4)
+ self.assertEqual(str(c), "CurveEdTw(p=23, a=1, d=1, h=4)")
+
+ def test_usability_in_a_hashed_collection_curves(self):
+ {self.c_23: None}
+
+ def test_hashability_curves(self):
+ hash(self.c_23)
+
class TestPoint(unittest.TestCase):
@classmethod
@@ -197,3 +223,34 @@ class TestPoint(unittest.TestCase):
def test_inequality_points_diff_types(self):
c = CurveFp(100, -3, 100)
self.assertNotEqual(self.g_23, c)
+
+ def test_to_bytes_from_bytes(self):
+ p = Point(self.c_23, 3, 10)
+
+ self.assertEqual(p, Point.from_bytes(self.c_23, p.to_bytes()))
+
+ def test_add_to_neg_self(self):
+ p = Point(self.c_23, 3, 10)
+
+ self.assertEqual(INFINITY, p + (-p))
+
+ def test_add_to_infinity(self):
+ p = Point(self.c_23, 3, 10)
+
+ self.assertIs(p, p + INFINITY)
+
+ def test_mul_infinity_by_scalar(self):
+ self.assertIs(INFINITY, INFINITY * 10)
+
+ def test_mul_by_negative(self):
+ p = Point(self.c_23, 3, 10)
+
+ self.assertEqual(p * -5, (-p) * 5)
+
+ def test_str_infinity(self):
+ self.assertEqual(str(INFINITY), "infinity")
+
+ def test_str_point(self):
+ p = Point(self.c_23, 3, 10)
+
+ self.assertEqual(str(p), "(3,10)")
diff --git a/frozen_deps/ecdsa/test_jacobi.py b/frozen_deps/ecdsa/test_jacobi.py
index 1f52804..9a46afe 100644
--- a/frozen_deps/ecdsa/test_jacobi.py
+++ b/frozen_deps/ecdsa/test_jacobi.py
@@ -1,4 +1,5 @@
import pickle
+import sys
try:
import unittest2 as unittest
@@ -6,7 +7,6 @@ except ImportError:
import unittest
import os
-import sys
import signal
import pytest
import threading
@@ -22,6 +22,7 @@ from .ecdsa import (
generator_brainpoolp160r1,
curve_brainpoolp160r1,
generator_112r2,
+ curve_112r2,
)
from .numbertheory import inverse_mod
from .util import randrange
@@ -32,6 +33,13 @@ if sys.version_info > (2, 7): # pragma: no branch
NO_OLD_SETTINGS["deadline"] = 5000
+SLOW_SETTINGS = {}
+if "--fast" in sys.argv: # pragma: no cover
+ SLOW_SETTINGS["max_examples"] = 2
+else:
+ SLOW_SETTINGS["max_examples"] = 10
+
+
class TestJacobi(unittest.TestCase):
def test___init__(self):
curve = object()
@@ -50,7 +58,7 @@ class TestJacobi(unittest.TestCase):
p_a = PointJacobi.from_affine(generator_256)
p_b = PointJacobi.from_affine(generator_224)
- with self.assertRaises(ValueError):
+ with self.assertRaises(ValueError): # pragma: no branch
p_a + p_b
def test_compare_different_curves(self):
@@ -199,10 +207,10 @@ class TestJacobi(unittest.TestCase):
self.assertEqual(dbl, mlpl)
- @settings(max_examples=10)
+ @settings(**SLOW_SETTINGS)
@given(
st.integers(
- min_value=0, max_value=int(generator_brainpoolp160r1.order())
+ min_value=0, max_value=int(generator_brainpoolp160r1.order() - 1)
)
)
def test_multiplications(self, mul):
@@ -214,10 +222,10 @@ class TestJacobi(unittest.TestCase):
self.assertEqual((pj.x(), pj.y()), (pw.x(), pw.y()))
self.assertEqual(pj, pw)
- @settings(max_examples=10)
+ @settings(**SLOW_SETTINGS)
@given(
st.integers(
- min_value=0, max_value=int(generator_brainpoolp160r1.order())
+ min_value=0, max_value=int(generator_brainpoolp160r1.order() - 1)
)
)
@example(0)
@@ -232,13 +240,13 @@ class TestJacobi(unittest.TestCase):
self.assertEqual(a, b)
- @settings(max_examples=10)
+ @settings(**SLOW_SETTINGS)
@given(
st.integers(
- min_value=1, max_value=int(generator_brainpoolp160r1.order())
+ min_value=1, max_value=int(generator_brainpoolp160r1.order() - 1)
),
st.integers(
- min_value=1, max_value=int(generator_brainpoolp160r1.order())
+ min_value=1, max_value=int(generator_brainpoolp160r1.order() - 1)
),
)
@example(3, 3)
@@ -251,13 +259,13 @@ class TestJacobi(unittest.TestCase):
self.assertEqual(c, j_g * (a_mul + b_mul))
- @settings(max_examples=10)
+ @settings(**SLOW_SETTINGS)
@given(
st.integers(
- min_value=1, max_value=int(generator_brainpoolp160r1.order())
+ min_value=1, max_value=int(generator_brainpoolp160r1.order() - 1)
),
st.integers(
- min_value=1, max_value=int(generator_brainpoolp160r1.order())
+ min_value=1, max_value=int(generator_brainpoolp160r1.order() - 1)
),
st.integers(min_value=1, max_value=int(curve_brainpoolp160r1.p() - 1)),
)
@@ -283,13 +291,14 @@ class TestJacobi(unittest.TestCase):
self.assertEqual(c, j_g * (a_mul + b_mul))
- @settings(max_examples=10)
+ @pytest.mark.slow
+ @settings(**SLOW_SETTINGS)
@given(
st.integers(
- min_value=1, max_value=int(generator_brainpoolp160r1.order())
+ min_value=1, max_value=int(generator_brainpoolp160r1.order() - 1)
),
st.integers(
- min_value=1, max_value=int(generator_brainpoolp160r1.order())
+ min_value=1, max_value=int(generator_brainpoolp160r1.order() - 1)
),
st.integers(min_value=1, max_value=int(curve_brainpoolp160r1.p() - 1)),
)
@@ -348,13 +357,14 @@ class TestJacobi(unittest.TestCase):
self.assertEqual(c, x + y)
- @settings(max_examples=14)
+ @pytest.mark.slow
+ @settings(**SLOW_SETTINGS)
@given(
st.integers(
- min_value=1, max_value=int(generator_brainpoolp160r1.order())
+ min_value=1, max_value=int(generator_brainpoolp160r1.order() - 1)
),
st.integers(
- min_value=1, max_value=int(generator_brainpoolp160r1.order())
+ min_value=1, max_value=int(generator_brainpoolp160r1.order() - 1)
),
st.lists(
st.integers(
@@ -423,6 +433,78 @@ class TestJacobi(unittest.TestCase):
self.assertEqual(c, x + y)
+ def test_add_different_points_same_scale_static(self):
+ j_g = generator_brainpoolp160r1
+ p = curve_brainpoolp160r1.p()
+ a = j_g * 11
+ a.scale()
+ b = j_g * 12
+ z = 13
+ x = PointJacobi(
+ curve_brainpoolp160r1,
+ a.x() * z**2 % p,
+ a.y() * z**3 % p,
+ z,
+ )
+ y = PointJacobi(
+ curve_brainpoolp160r1,
+ b.x() * z**2 % p,
+ b.y() * z**3 % p,
+ z,
+ )
+
+ c = a + b
+
+ self.assertEqual(c, x + y)
+
+ def test_add_same_point_different_scale_second_z_1_static(self):
+ j_g = generator_112r2
+ p = curve_112r2.p()
+ z = 11
+ a = j_g * z
+ a.scale()
+
+ x = PointJacobi(
+ curve_112r2,
+ a.x() * z**2 % p,
+ a.y() * z**3 % p,
+ z,
+ )
+ y = PointJacobi(
+ curve_112r2,
+ a.x(),
+ a.y(),
+ 1,
+ )
+
+ c = a + a
+
+ self.assertEqual(c, x + y)
+
+ def test_add_to_infinity_static(self):
+ j_g = generator_112r2
+
+ z = 11
+ a = j_g * z
+ a.scale()
+
+ b = -a
+
+ x = PointJacobi(
+ curve_112r2,
+ a.x(),
+ a.y(),
+ 1,
+ )
+ y = PointJacobi(
+ curve_112r2,
+ b.x(),
+ b.y(),
+ 1,
+ )
+
+ self.assertEqual(INFINITY, x + y)
+
def test_add_point_3_times(self):
j_g = PointJacobi.from_affine(generator_256)
@@ -553,13 +635,24 @@ class TestJacobi(unittest.TestCase):
self.assertNotEqual(p_a, p_b)
+ def test_add_with_point_at_infinity(self):
+ pj1 = PointJacobi(curve=CurveFp(23, 1, 1, 1), x=2, y=3, z=1, order=1)
+ x, y, z = pj1._add(2, 3, 1, 5, 5, 0, 23)
+
+ self.assertEqual((x, y, z), (2, 3, 1))
+
def test_pickle(self):
pj = PointJacobi(curve=CurveFp(23, 1, 1, 1), x=2, y=3, z=1, order=1)
self.assertEqual(pickle.loads(pickle.dumps(pj)), pj)
+ @pytest.mark.slow
@settings(**NO_OLD_SETTINGS)
+ @pytest.mark.skipif(
+ platform.python_implementation() == "PyPy",
+ reason="threading on PyPy breaks coverage",
+ )
@given(st.integers(min_value=1, max_value=10))
- def test_multithreading(self, thread_num):
+ def test_multithreading(self, thread_num): # pragma: no cover
# ensure that generator's precomputation table is filled
generator_112r2 * 2
@@ -591,11 +684,14 @@ class TestJacobi(unittest.TestCase):
generator_112r2._PointJacobi__precompute,
)
+ @pytest.mark.slow
@pytest.mark.skipif(
- platform.system() == "Windows",
- reason="there are no signals on Windows",
+ platform.system() == "Windows"
+ or platform.python_implementation() == "PyPy",
+ reason="there are no signals on Windows, and threading breaks coverage"
+ " on PyPy",
)
- def test_multithreading_with_interrupts(self):
+ def test_multithreading_with_interrupts(self): # pragma: no cover
thread_num = 10
# ensure that generator's precomputation table is filled
generator_112r2 * 2
diff --git a/frozen_deps/ecdsa/test_keys.py b/frozen_deps/ecdsa/test_keys.py
index 25386b1..348475e 100644
--- a/frozen_deps/ecdsa/test_keys.py
+++ b/frozen_deps/ecdsa/test_keys.py
@@ -13,13 +13,20 @@ import array
import pytest
import hashlib
-from .keys import VerifyingKey, SigningKey, MalformedPointError
+from .keys import (
+ VerifyingKey,
+ SigningKey,
+ MalformedPointError,
+ BadSignatureError,
+)
from .der import (
unpem,
UnexpectedDER,
encode_sequence,
encode_oid,
encode_bitstring,
+ encode_integer,
+ encode_octet_string,
)
from .util import (
sigencode_string,
@@ -120,6 +127,10 @@ class TestVerifyingKeyFromString(unittest.TestCase):
self.assertEqual(self.vk.to_string(), vk.to_string())
+ def test_ed25519_VerifyingKey_from_string_imported(self):
+ with self.assertRaises(MalformedPointError):
+ VerifyingKey.from_string(b"AAA", Ed25519)
+
class TestVerifyingKeyFromDer(unittest.TestCase):
"""
@@ -249,13 +260,13 @@ class TestVerifyingKeyFromDer(unittest.TestCase):
self.assertEqual(self.vk.to_string(), vk.to_string())
def test_equality_on_verifying_keys(self):
- self.assertEqual(self.vk, self.sk.get_verifying_key())
+ self.assertTrue(self.vk == self.sk.get_verifying_key())
def test_inequality_on_verifying_keys(self):
- self.assertNotEqual(self.vk, self.vk2)
+ self.assertFalse(self.vk == self.vk2)
def test_inequality_on_verifying_keys_not_implemented(self):
- self.assertNotEqual(self.vk, None)
+ self.assertFalse(self.vk == None)
def test_VerifyingKey_inequality_on_same_curve(self):
self.assertNotEqual(self.vk, self.sk2.verifying_key)
@@ -264,7 +275,7 @@ class TestVerifyingKeyFromDer(unittest.TestCase):
self.assertNotEqual(self.sk, self.sk2)
def test_inequality_on_wrong_types(self):
- self.assertNotEqual(self.vk, self.sk)
+ self.assertFalse(self.vk == self.sk)
def test_from_public_point_old(self):
pj = self.vk.pubkey.point
@@ -272,7 +283,7 @@ class TestVerifyingKeyFromDer(unittest.TestCase):
vk = VerifyingKey.from_public_point(point, self.vk.curve)
- self.assertEqual(vk, self.vk)
+ self.assertTrue(vk == self.vk)
def test_ed25519_VerifyingKey_repr__(self):
sk = SigningKey.from_string(Ed25519.generator.to_bytes(), Ed25519)
@@ -364,6 +375,18 @@ class TestVerifyingKeyFromDer(unittest.TestCase):
self.assertEqual(vk_pem, vk.to_pem())
+ def test_export_ed255_to_ssh(self):
+ vk_str = (
+ b"\x23\x00\x50\xd0\xd6\x64\x22\x28\x8e\xe3\x55\x89\x7e\x6e\x41\x57"
+ b"\x8d\xae\xde\x44\x26\xee\x56\x27\xbc\x85\xe6\x0b\x2f\x2a\xcb\x65"
+ )
+
+ vk = VerifyingKey.from_string(vk_str, Ed25519)
+
+ vk_ssh = b"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICMAUNDWZCIojuNViX5uQVeNrt5EJu5WJ7yF5gsvKstl\n"
+
+ self.assertEqual(vk_ssh, vk.to_ssh())
+
def test_ed25519_export_import(self):
sk = SigningKey.generate(Ed25519)
vk = sk.verifying_key
@@ -393,6 +416,28 @@ class TestVerifyingKeyFromDer(unittest.TestCase):
self.assertTrue(vk.verify(sig, data))
+ def test_ed25519_sig_verify_malformed(self):
+ vk_pem = (
+ "-----BEGIN PUBLIC KEY-----\n"
+ "MCowBQYDK2VwAyEAIwBQ0NZkIiiO41WJfm5BV42u3kQm7lYnvIXmCy8qy2U=\n"
+ "-----END PUBLIC KEY-----\n"
+ )
+
+ vk = VerifyingKey.from_pem(vk_pem)
+
+ data = b"data\n"
+
+ # modified signature from test_ed25519_sig_verify
+ sig = (
+ b"\xAA\x47\xab\x6a\x33\xcd\x79\x45\xad\x98\x11\x6c\xb9\xf2\x20\xeb"
+ b"\x90\xd6\x50\xe3\xc7\x8f\x9f\x60\x10\xec\x75\xe0\x2f\x27\xd3\x96"
+ b"\xda\xe8\x58\x7f\xe0\xfe\x46\x5c\x81\xef\x50\xec\x29\x9f\xae\xd5"
+ b"\xad\x46\x3c\x91\x68\x83\x4d\xea\x8d\xa8\x19\x04\x04\x79\x03\x0b"
+ )
+
+ with self.assertRaises(BadSignatureError):
+ vk.verify(sig, data)
+
def test_ed448_from_pem(self):
pem_str = (
"-----BEGIN PUBLIC KEY-----\n"
@@ -428,8 +473,8 @@ class TestVerifyingKeyFromDer(unittest.TestCase):
vk_pem = (
b"-----BEGIN PUBLIC KEY-----\n"
- b"MEMwBQYDK2VxAzoAeQtetSu7CMEzE+XWB10Bg47LCA0giNikOxHzdp+tZ/eK/En0\n"
- b"dTdYD2ll94g58MhSnBiBQB9A1MMA\n"
+ b"MEMwBQYDK2VxAzoAeQtetSu7CMEzE+XWB10Bg47LCA0giNikOxHzdp+tZ/eK/En0dTdYD2ll94g5\n"
+ b"8MhSnBiBQB9A1MMA\n"
b"-----END PUBLIC KEY-----\n"
)
@@ -505,6 +550,17 @@ class TestSigningKey(unittest.TestCase):
)
cls.sk2 = SigningKey.from_pem(prv_key_str)
+ def test_to_der_pkcs8(self):
+ self.assertEqual(
+ self.sk1.to_der(format="pkcs8"),
+ b"0o\x02\x01\x010\x13\x06\x07*\x86H\xce=\x02\x01\x06\x08*\x86H"
+ b"\xce=\x03\x01\x01\x04U0S\x02\x01\x01\x04\x18^\xc8B\x0b\xd6\xef"
+ b"\x92R\xa9B\xe9\x89\x04<\xa2\x9fV\x1f\xa5%w\x0e\xb1\xc5\xa14\x03"
+ b"2\x00\x04\xb8\x81w\xd0\x84\xef\x17\xf5\xe4V9@\x80(6\x0f\x9fY"
+ b"\xb4\xa4\xd7&Nb\xda\x06Q\xdc\xe4z5\xa4\xc5\xb4\\\xf5\x15\x93B:"
+ b"\x8bU{\x9c \x99\xf3l",
+ )
+
def test_decoding_explicit_curve_parameters(self):
prv_key_str = (
"-----BEGIN PRIVATE KEY-----\n"
@@ -614,6 +670,99 @@ class TestSigningKey(unittest.TestCase):
self.assertEqual(sk, sk_str)
+ def test_ed25519_from_der_bad_alg_id_params(self):
+ der_str = encode_sequence(
+ encode_integer(1),
+ encode_sequence(encode_oid(*Ed25519.oid), encode_integer(1)),
+ encode_octet_string(encode_octet_string(b"A" * 32)),
+ )
+
+ with self.assertRaises(UnexpectedDER) as e:
+ SigningKey.from_der(der_str)
+
+ self.assertIn("Non NULL parameters", str(e.exception))
+
+ def test_ed25519_from_der_junk_after_priv_key(self):
+ der_str = encode_sequence(
+ encode_integer(1),
+ encode_sequence(
+ encode_oid(*Ed25519.oid),
+ ),
+ encode_octet_string(encode_octet_string(b"A" * 32) + b"B"),
+ )
+
+ with self.assertRaises(UnexpectedDER) as e:
+ SigningKey.from_der(der_str)
+
+ self.assertIn(
+ "trailing junk after the encoded private key", str(e.exception)
+ )
+
+ def test_ed25519_sign(self):
+ sk_str = SigningKey.from_string(
+ b"\x34\xBA\xC7\xD1\x4E\xD4\xF1\xBC\x4F\x8C\x48\x3E\x0F\x19\x77\x4C"
+ b"\xFC\xB8\xBE\xAC\x54\x66\x45\x11\x9A\xD7\xD7\xB8\x07\x0B\xF5\xD4",
+ Ed25519,
+ )
+
+ msg = b"message"
+
+ sig = sk_str.sign(msg, sigencode=sigencode_der)
+
+ self.assertEqual(
+ sig,
+ b"\xe1,v\xc9>%\xda\xd2~>\xc3&\na\xf4@|\x9e`X\x11\x13@<\x987\xd4"
+ b"\r\xb1\xf5\xb3\x15\x7f%i{\xdf}\xdd\xb1\xf3\x02\x7f\x80\x02\xc2"
+ b'|\xe5\xd6\x06\xc4\n\xa3\xb0\xf6}\xc0\xed)"+E\xaf\x00',
+ )
+
+ def test_ed25519_sign_digest_deterministic(self):
+ sk_str = SigningKey.from_string(
+ b"\x34\xBA\xC7\xD1\x4E\xD4\xF1\xBC\x4F\x8C\x48\x3E\x0F\x19\x77\x4C"
+ b"\xFC\xB8\xBE\xAC\x54\x66\x45\x11\x9A\xD7\xD7\xB8\x07\x0B\xF5\xD4",
+ Ed25519,
+ )
+ with self.assertRaises(ValueError) as e:
+ sk_str.sign_digest_deterministic(b"a" * 20)
+
+ self.assertIn("Method unsupported for Edwards", str(e.exception))
+
+ def test_ed25519_sign_digest(self):
+ sk_str = SigningKey.from_string(
+ b"\x34\xBA\xC7\xD1\x4E\xD4\xF1\xBC\x4F\x8C\x48\x3E\x0F\x19\x77\x4C"
+ b"\xFC\xB8\xBE\xAC\x54\x66\x45\x11\x9A\xD7\xD7\xB8\x07\x0B\xF5\xD4",
+ Ed25519,
+ )
+ with self.assertRaises(ValueError) as e:
+ sk_str.sign_digest(b"a" * 20)
+
+ self.assertIn("Method unsupported for Edwards", str(e.exception))
+
+ def test_ed25519_sign_number(self):
+ sk_str = SigningKey.from_string(
+ b"\x34\xBA\xC7\xD1\x4E\xD4\xF1\xBC\x4F\x8C\x48\x3E\x0F\x19\x77\x4C"
+ b"\xFC\xB8\xBE\xAC\x54\x66\x45\x11\x9A\xD7\xD7\xB8\x07\x0B\xF5\xD4",
+ Ed25519,
+ )
+ with self.assertRaises(ValueError) as e:
+ sk_str.sign_number(20)
+
+ self.assertIn("Method unsupported for Edwards", str(e.exception))
+
+ def test_ed25519_to_der_ssleay(self):
+ pem_str = (
+ "-----BEGIN PRIVATE KEY-----\n"
+ "MC4CAQAwBQYDK2VwBCIEIDS6x9FO1PG8T4xIPg8Zd0z8uL6sVGZFEZrX17gHC/XU\n"
+ "-----END PRIVATE KEY-----\n"
+ )
+
+ sk = SigningKey.from_pem(pem_str)
+
+ with self.assertRaises(ValueError) as e:
+ sk.to_der(format="ssleay")
+
+ self.assertIn("Only PKCS#8 format", str(e.exception))
+
def test_ed25519_to_pem(self):
sk = SigningKey.from_string(
b"\x34\xBA\xC7\xD1\x4E\xD4\xF1\xBC\x4F\x8C\x48\x3E\x0F\x19\x77\x4C"
@@ -629,6 +778,25 @@ class TestSigningKey(unittest.TestCase):
self.assertEqual(sk.to_pem(format="pkcs8"), pem_str)
+ def test_ed25519_to_ssh(self):
+ sk = SigningKey.from_string(
+ b"\x34\xBA\xC7\xD1\x4E\xD4\xF1\xBC\x4F\x8C\x48\x3E\x0F\x19\x77\x4C"
+ b"\xFC\xB8\xBE\xAC\x54\x66\x45\x11\x9A\xD7\xD7\xB8\x07\x0B\xF5\xD4",
+ Ed25519,
+ )
+
+ ssh_str = (
+ b"-----BEGIN OPENSSH PRIVATE KEY-----\n"
+ b"b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZWQyNTUx\n"
+ b"OQAAACAjAFDQ1mQiKI7jVYl+bkFXja7eRCbuVie8heYLLyrLZQAAAIgAAAAAAAAAAAAAAAtzc2gt\n"
+ b"ZWQyNTUxOQAAACAjAFDQ1mQiKI7jVYl+bkFXja7eRCbuVie8heYLLyrLZQAAAEA0usfRTtTxvE+M\n"
+ b"SD4PGXdM/Li+rFRmRRGa19e4Bwv11CMAUNDWZCIojuNViX5uQVeNrt5EJu5WJ7yF5gsvKstlAAAA\n"
+ b"AAECAwQF\n"
+ b"-----END OPENSSH PRIVATE KEY-----\n"
+ )
+
+ self.assertEqual(sk.to_ssh(), ssh_str)
+
def test_ed25519_to_and_from_pem(self):
sk = SigningKey.generate(Ed25519)
@@ -636,6 +804,17 @@ class TestSigningKey(unittest.TestCase):
self.assertEqual(sk, decoded)
+ def test_ed25519_custom_entropy(self):
+ sk = SigningKey.generate(Ed25519, entropy=os.urandom)
+
+ self.assertIsNotNone(sk)
+
+ def test_ed25519_from_secret_exponent(self):
+ with self.assertRaises(ValueError) as e:
+ SigningKey.from_secret_exponent(1234567890, curve=Ed25519)
+
+ self.assertIn("don't support setting the secret", str(e.exception))
+
def test_ed448_from_pem(self):
pem_str = (
"-----BEGIN PRIVATE KEY-----\n"
@@ -665,8 +844,8 @@ class TestSigningKey(unittest.TestCase):
)
pem_str = (
b"-----BEGIN PRIVATE KEY-----\n"
- b"MEcCAQAwBQYDK2VxBDsEOTyFuXqFLXgJlV8uDqcOw9nG4IqzLiZ/i5NfBDoHPzmP\n"
- b"OP0JMYaLGlTzwovmvCDJ2zLaezu9NLz9aQ==\n"
+ b"MEcCAQAwBQYDK2VxBDsEOTyFuXqFLXgJlV8uDqcOw9nG4IqzLiZ/i5NfBDoHPzmPOP0JMYaLGlTz\n"
+ b"wovmvCDJ2zLaezu9NLz9aQ==\n"
b"-----END PRIVATE KEY-----\n"
)
@@ -769,8 +948,8 @@ assert isinstance(sig_strings[0], bytes)
verifiers = []
for modifier, fun in [
("bytes", lambda x: x),
- ("bytes memoryview", lambda x: buffer(x)),
- ("bytearray", lambda x: bytearray(x)),
+ ("bytes memoryview", buffer),
+ ("bytearray", bytearray),
("bytearray memoryview", lambda x: buffer(bytearray(x))),
("array.array of bytes", lambda x: array.array("B", x)),
("array.array of bytes memoryview", lambda x: buffer(array.array("B", x))),
@@ -939,14 +1118,14 @@ def test_VerifyingKey_inequality_with_different_curves():
sk1 = SigningKey.from_secret_exponent(2, BRAINPOOLP160r1)
sk2 = SigningKey.from_secret_exponent(2, NIST256p)
- assert sk1.verifying_key != sk2.verifying_key
+ assert not (sk1.verifying_key == sk2.verifying_key)
def test_VerifyingKey_inequality_with_different_secret_points():
sk1 = SigningKey.from_secret_exponent(2, BRAINPOOLP160r1)
sk2 = SigningKey.from_secret_exponent(3, BRAINPOOLP160r1)
- assert sk1.verifying_key != sk2.verifying_key
+ assert not (sk1.verifying_key == sk2.verifying_key)
def test_SigningKey_from_pem_pkcs8v2_EdDSA():
diff --git a/frozen_deps/ecdsa/test_malformed_sigs.py b/frozen_deps/ecdsa/test_malformed_sigs.py
index 8e1b611..e5a87c2 100644
--- a/frozen_deps/ecdsa/test_malformed_sigs.py
+++ b/frozen_deps/ecdsa/test_malformed_sigs.py
@@ -31,7 +31,7 @@ from .keys import SigningKey
from .keys import BadSignatureError
from .util import sigencode_der, sigencode_string
from .util import sigdecode_der, sigdecode_string
-from .curves import curves
+from .curves import curves, SECP112r2, SECP128r1
from .der import (
encode_integer,
encode_bitstring,
@@ -55,6 +55,10 @@ Needed for pairing with curves as we don't support hashes
bigger than order sizes of curves."""
+if "--fast" in sys.argv: # pragma: no cover
+ curves = [SECP112r2, SECP128r1]
+
+
keys_and_sigs = []
"""Name of the curve+hash combination, VerifyingKey and DER signature."""
@@ -91,7 +95,7 @@ def test_signatures(verifying_key, signature):
@st.composite
-def st_fuzzed_sig(draw, keys_and_sigs):
+def st_fuzzed_sig(draw, keys_and_sigs): # pragma: no cover
"""
Hypothesis strategy that generates pairs of VerifyingKey and malformed
signatures created by fuzzing of a valid signature.
@@ -111,6 +115,7 @@ def st_fuzzed_sig(draw, keys_and_sigs):
note("Remove bytes: {0}".format(to_remove))
# decide which bytes of the original signature should be changed
+ xors = None
if sig: # pragma: no branch
xors = draw(
st.dictionaries(
@@ -153,12 +158,17 @@ if sys.version_info >= (2, 7): # pragma: no branch
HealthCheck.filter_too_much,
HealthCheck.too_slow,
]
+if "--fast" in sys.argv: # pragma: no cover
+ params["max_examples"] = 20
slow_params = dict(params)
-slow_params["max_examples"] = 10
+if "--fast" in sys.argv: # pragma: no cover
+ slow_params["max_examples"] = 1
+else:
+ slow_params["max_examples"] = 10
-@settings(**params)
+@settings(**slow_params)
@given(st_fuzzed_sig(keys_and_sigs))
def test_fuzzed_der_signatures(args):
verifying_key, sig = args
@@ -168,7 +178,7 @@ def test_fuzzed_der_signatures(args):
@st.composite
-def st_random_der_ecdsa_sig_value(draw):
+def st_random_der_ecdsa_sig_value(draw): # pragma: no cover
"""
Hypothesis strategy for selecting random values and encoding them
to ECDSA-Sig-Value object::
@@ -214,7 +224,7 @@ def test_random_der_ecdsa_sig_value(params):
verifying_key.verify(sig, example_data, sigdecode=sigdecode_der)
-def st_der_integer(*args, **kwargs):
+def st_der_integer(*args, **kwargs): # pragma: no cover
"""
Hypothesis strategy that returns a random positive integer as DER
INTEGER.
@@ -226,7 +236,7 @@ def st_der_integer(*args, **kwargs):
@st.composite
-def st_der_bit_string(draw, *args, **kwargs):
+def st_der_bit_string(draw, *args, **kwargs): # pragma: no cover
"""
Hypothesis strategy that returns a random DER BIT STRING.
Parameters are passed to hypothesis.strategy.binary.
@@ -242,7 +252,7 @@ def st_der_bit_string(draw, *args, **kwargs):
return encode_bitstring(data, unused)
-def st_der_octet_string(*args, **kwargs):
+def st_der_octet_string(*args, **kwargs): # pragma: no cover
"""
Hypothesis strategy that returns a random DER OCTET STRING object.
Parameters are passed to hypothesis.strategy.binary
@@ -250,7 +260,7 @@ def st_der_octet_string(*args, **kwargs):
return st.builds(encode_octet_string, st.binary(*args, **kwargs))
-def st_der_null():
+def st_der_null(): # pragma: no cover
"""
Hypothesis strategy that returns DER NULL object.
"""
@@ -258,7 +268,7 @@ def st_der_null():
@st.composite
-def st_der_oid(draw):
+def st_der_oid(draw): # pragma: no cover
"""
Hypothesis strategy that returns DER OBJECT IDENTIFIER objects.
"""
@@ -273,7 +283,7 @@ def st_der_oid(draw):
return encode_oid(first, second, *rest)
-def st_der():
+def st_der(): # pragma: no cover
"""
Hypothesis strategy that returns random DER structures.
@@ -281,22 +291,20 @@ def st_der():
of a valid DER structure, sequence of valid DER objects or a constructed
encoding of any of the above.
"""
- return st.recursive(
+ return st.recursive( # pragma: no branch
st.just(b"")
| st_der_integer(max_value=2**4096)
| st_der_bit_string(max_size=1024**2)
| st_der_octet_string(max_size=1024**2)
| st_der_null()
| st_der_oid(),
- lambda children: st.builds(
- lambda x: encode_octet_string(x), st.one_of(children)
- )
+ lambda children: st.builds(encode_octet_string, st.one_of(children))
| st.builds(lambda x: encode_bitstring(x, 0), st.one_of(children))
| st.builds(
lambda x: encode_sequence(*x), st.lists(children, max_size=200)
)
| st.builds(
- lambda tag, x: encode_constructed(tag, x),
+ encode_constructed,
st.integers(min_value=0, max_value=0x3F),
st.one_of(children),
),
@@ -304,7 +312,7 @@ def st_der():
)
-@settings(**params)
+@settings(**slow_params)
@given(st.sampled_from(keys_and_sigs), st_der())
def test_random_der_as_signature(params, der):
"""Check if random DER structures are rejected as signature"""
@@ -314,7 +322,7 @@ def test_random_der_as_signature(params, der):
verifying_key.verify(der, example_data, sigdecode=sigdecode_der)
-@settings(**params)
+@settings(**slow_params)
@given(st.sampled_from(keys_and_sigs), st.binary(max_size=1024**2))
@example(
keys_and_sigs[0], encode_sequence(encode_integer(0), encode_integer(0))
@@ -361,7 +369,7 @@ keys_and_string_sigs += [
]
-@settings(**params)
+@settings(**slow_params)
@given(st_fuzzed_sig(keys_and_string_sigs))
def test_fuzzed_string_signatures(params):
verifying_key, sig = params
diff --git a/frozen_deps/ecdsa/test_numbertheory.py b/frozen_deps/ecdsa/test_numbertheory.py
index 8bc787f..966eca2 100644
--- a/frozen_deps/ecdsa/test_numbertheory.py
+++ b/frozen_deps/ecdsa/test_numbertheory.py
@@ -1,5 +1,6 @@
import operator
from functools import reduce
+import sys
try:
import unittest2 as unittest
@@ -29,6 +30,16 @@ from .numbertheory import (
square_root_mod_prime,
)
+try:
+ from gmpy2 import mpz
+except ImportError:
+ try:
+ from gmpy import mpz
+ except ImportError:
+
+ def mpz(x):
+ return x
+
BIGPRIMES = (
999671,
@@ -66,6 +77,7 @@ def test_next_prime_with_nums_less_2(val):
assert next_prime(val) == 2
@pytest.mark.parametrize("prime", smallprimes)
def test_square_root_mod_prime_for_small_primes(prime):
squares = set()
@@ -182,7 +194,7 @@ def st_comp_with_com_fac(draw):
# select at most 20 lists (returned numbers),
# each having at most 30 primes (factors) including none (then the number
# will be 1)
- comp_primes = draw(
+ comp_primes = draw( # pragma: no branch
st.integers(min_value=1, max_value=20).flatmap(
lambda n: st.lists(
st.lists(st.sampled_from(primes), max_size=30),
@@ -225,7 +237,7 @@ def st_comp_no_com_fac(draw):
# select at most 20 lists, each having at most 30 primes
# selected from the leftover_primes list
- number_primes = draw(
+ number_primes = draw( # pragma: no branch
st.integers(min_value=1, max_value=20).flatmap(
lambda n: st.lists(
st.lists(st.sampled_from(leftover_primes), max_size=30),
@@ -251,9 +263,15 @@ if HC_PRESENT: # pragma: no branch
# the factorization() sometimes takes a long time to finish
HYP_SETTINGS["deadline"] = 5000
+if "--fast" in sys.argv: # pragma: no cover
+ HYP_SETTINGS["max_examples"] = 20
+
HYP_SLOW_SETTINGS = dict(HYP_SETTINGS)
-HYP_SLOW_SETTINGS["max_examples"] = 10
+if "--fast" in sys.argv: # pragma: no cover
+ HYP_SLOW_SETTINGS["max_examples"] = 1
+else:
+ HYP_SLOW_SETTINGS["max_examples"] = 20
class TestIsPrime(unittest.TestCase):
@@ -285,7 +303,30 @@ class TestIsPrime(unittest.TestCase):
def test_large_prime(self):
# nextPrime[2^2048]
- assert is_prime(2**2048 + 0x3D5)
+ assert is_prime(mpz(2) ** 2048 + 0x3D5)
+
+ def test_pseudoprime_base_19(self):
+ assert not is_prime(1543267864443420616877677640751301)
+
+ def test_pseudoprime_base_300(self):
+ # F. Arnault "Constructing Carmichael Numbers Which Are Strong
+ # Pseudoprimes to Several Bases". Journal of Symbolic
+ # Computation. 20 (2): 151-161. doi:10.1006/jsco.1995.1042.
+ # Section 4.4 Large Example (a pseudoprime to all bases up to
+ # 300)
+ p = int(
+ "29 674 495 668 685 510 550 154 174 642 905 332 730 "
+ "771 991 799 853 043 350 995 075 531 276 838 753 171 "
+ "770 199 594 238 596 428 121 188 033 664 754 218 345 "
+ "562 493 168 782 883".replace(" ", "")
+ )
+
+ assert is_prime(p)
+ for _ in range(10):
+ if not is_prime(p * (313 * (p - 1) + 1) * (353 * (p - 1) + 1)):
+ break
+ else:
+ assert False, "composite not detected"
class TestNumbertheory(unittest.TestCase):
@@ -301,6 +342,7 @@ class TestNumbertheory(unittest.TestCase):
"case times-out on it",
)
@settings(**HYP_SLOW_SETTINGS)
+ @example([877 * 1151, 877 * 1009])
@given(st_comp_with_com_fac())
def test_gcd_with_com_factor(self, numbers):
n = gcd(numbers)
@@ -315,11 +357,13 @@ class TestNumbertheory(unittest.TestCase):
"case times-out on it",
)
@settings(**HYP_SLOW_SETTINGS)
+ @example([1151, 1069, 1009])
@given(st_comp_no_com_fac())
def test_gcd_with_uncom_factor(self, numbers):
n = gcd(numbers)
assert n == 1
+ @settings(**HYP_SLOW_SETTINGS)
@given(
st.lists(
st.integers(min_value=1, max_value=2**8192),
@@ -338,6 +382,7 @@ class TestNumbertheory(unittest.TestCase):
assert lcm([3, 5 * 3, 7 * 3]) == 3 * 5 * 7
assert lcm(3) == 3
+ @settings(**HYP_SLOW_SETTINGS)
@given(
st.lists(
st.integers(min_value=1, max_value=2**8192),
@@ -356,7 +401,7 @@ class TestNumbertheory(unittest.TestCase):
"meet requirements (like `is_prime()`), the test "
"case times-out on it",
)
- @settings(**HYP_SETTINGS)
+ @settings(**HYP_SLOW_SETTINGS)
@given(st_num_square_prime())
def test_square_root_mod_prime(self, vals):
square, prime = vals
@@ -364,7 +409,8 @@ class TestNumbertheory(unittest.TestCase):
calc = square_root_mod_prime(square, prime)
assert calc * calc % prime == square
- @settings(**HYP_SETTINGS)
+ @pytest.mark.slow
+ @settings(**HYP_SLOW_SETTINGS)
@given(st.integers(min_value=1, max_value=10**12))
@example(265399 * 1526929)
@example(373297**2 * 553991)
@@ -401,16 +447,19 @@ class TestNumbertheory(unittest.TestCase):
def test_jacobi_with_one(self):
assert jacobi(1, 3) == 1
- @settings(**HYP_SETTINGS)
+ @settings(**HYP_SLOW_SETTINGS)
@given(st.integers(min_value=3, max_value=1000).filter(lambda x: x % 2))
def test_jacobi(self, mod):
+ mod = mpz(mod)
if is_prime(mod):
squares = set()
for root in range(1, mod):
+ root = mpz(root)
assert jacobi(root * root, mod) == 1
squares.add(root * root % mod)
for i in range(1, mod):
if i not in squares:
+ i = mpz(i)
assert jacobi(i, mod) == -1
else:
factors = factorization(mod)
@@ -420,6 +469,7 @@ class TestNumbertheory(unittest.TestCase):
c *= jacobi(a, i[0]) ** i[1]
assert c == jacobi(a, mod)
+ @settings(**HYP_SLOW_SETTINGS)
@given(st_two_nums_rel_prime())
def test_inverse_mod(self, nums):
num, mod = nums
diff --git a/frozen_deps/ecdsa/test_pyecdsa.py b/frozen_deps/ecdsa/test_pyecdsa.py
index d61f508..20201ba 100644
--- a/frozen_deps/ecdsa/test_pyecdsa.py
+++ b/frozen_deps/ecdsa/test_pyecdsa.py
@@ -5,24 +5,29 @@ try:
except ImportError:
import unittest
import os
-import sys
import shutil
import subprocess
import pytest
+import sys
from binascii import hexlify, unhexlify
-from hashlib import sha1, sha256, sha384, sha512
import hashlib
from functools import partial
-from hypothesis import given
+from hypothesis import given, settings
import hypothesis.strategies as st
from six import b, print_, binary_type
from .keys import SigningKey, VerifyingKey
from .keys import BadSignatureError, MalformedPointError, BadDigestError
from . import util
-from .util import sigencode_der, sigencode_strings
-from .util import sigdecode_der, sigdecode_strings
+from .util import (
+ sigencode_der,
+ sigencode_strings,
+ sigencode_strings_canonize,
+ sigencode_string_canonize,
+ sigencode_der_canonize,
+)
+from .util import sigdecode_der, sigdecode_strings, sigdecode_string
from .util import number_to_string, encoded_oid_ecPublicKey, MalformedSignature
from .curves import Curve, UnknownCurveError
from .curves import (
@@ -43,6 +48,13 @@ from .curves import (
BRAINPOOLP320r1,
BRAINPOOLP384r1,
BRAINPOOLP512r1,
+ BRAINPOOLP160t1,
+ BRAINPOOLP192t1,
+ BRAINPOOLP224t1,
+ BRAINPOOLP256t1,
+ BRAINPOOLP320t1,
+ BRAINPOOLP384t1,
+ BRAINPOOLP512t1,
Ed25519,
Ed448,
curves,
@@ -63,6 +75,13 @@ class SubprocessError(Exception):
pass
+HYP_SETTINGS = {}
+
+
+if "--fast" in sys.argv: # pragma: no cover
+ HYP_SETTINGS["max_examples"] = 2
+
+
def run_openssl(cmd):
OPENSSL = "openssl"
p = subprocess.Popen(
@@ -84,24 +103,29 @@ class ECDSA(unittest.TestCase):
priv = SigningKey.generate()
pub = priv.get_verifying_key()
- data = b("blahblah")
+ data = b"blahblah"
sig = priv.sign(data)
self.assertTrue(pub.verify(sig, data))
- self.assertRaises(BadSignatureError, pub.verify, sig, data + b("bad"))
+ self.assertRaises(BadSignatureError, pub.verify, sig, data + b"bad")
pub2 = VerifyingKey.from_string(pub.to_string())
self.assertTrue(pub2.verify(sig, data))
def test_deterministic(self):
- data = b("blahblah")
+ data = b"blahblah"
secexp = int("9d0219792467d7d37b4d43298a7d0c05", 16)
- priv = SigningKey.from_secret_exponent(secexp, SECP256k1, sha256)
+ priv = SigningKey.from_secret_exponent(
+ secexp, SECP256k1, hashlib.sha256
+ )
pub = priv.get_verifying_key()
k = rfc6979.generate_k(
- SECP256k1.generator.order(), secexp, sha256, sha256(data).digest()
+ SECP256k1.generator.order(),
+ secexp,
+ hashlib.sha256,
+ hashlib.sha256(data).digest(),
)
sig1 = priv.sign(data, k=k)
@@ -110,7 +134,7 @@ class ECDSA(unittest.TestCase):
sig2 = priv.sign(data, k=k)
self.assertTrue(pub.verify(sig2, data))
- sig3 = priv.sign_deterministic(data, sha256)
+ sig3 = priv.sign_deterministic(data, hashlib.sha256)
self.assertTrue(pub.verify(sig3, data))
self.assertEqual(sig1, sig2)
@@ -121,37 +145,16 @@ class ECDSA(unittest.TestCase):
self.assertRaises(TypeError, SigningKey)
self.assertRaises(TypeError, VerifyingKey)
- def test_lengths(self):
+ def test_lengths_default(self):
default = NIST192p
priv = SigningKey.generate()
pub = priv.get_verifying_key()
self.assertEqual(len(pub.to_string()), default.verifying_key_length)
- sig = priv.sign(b("data"))
+ sig = priv.sign(b"data")
self.assertEqual(len(sig), default.signature_length)
- for curve in (
- NIST192p,
- NIST224p,
- NIST256p,
- NIST384p,
- NIST521p,
- BRAINPOOLP160r1,
- BRAINPOOLP192r1,
- BRAINPOOLP224r1,
- BRAINPOOLP256r1,
- BRAINPOOLP320r1,
- BRAINPOOLP384r1,
- BRAINPOOLP512r1,
- ):
- priv = SigningKey.generate(curve=curve)
- pub1 = priv.get_verifying_key()
- pub2 = VerifyingKey.from_string(pub1.to_string(), curve)
- self.assertEqual(pub1.to_string(), pub2.to_string())
- self.assertEqual(len(pub1.to_string()), curve.verifying_key_length)
- sig = priv.sign(b("data"))
- self.assertEqual(len(sig), curve.signature_length)
def test_serialize(self):
- seed = b("secret")
+ seed = b"secret"
curve = NIST192p
secexp1 = util.randrange_from_seed__trytryagain(seed, curve.order)
secexp2 = util.randrange_from_seed__trytryagain(seed, curve.order)
@@ -164,7 +167,7 @@ class ECDSA(unittest.TestCase):
self.assertEqual(priv1.to_pem(), priv2.to_pem())
pub1 = priv1.get_verifying_key()
pub2 = priv2.get_verifying_key()
- data = b("data")
+ data = b"data"
sig1 = priv1.sign(data)
sig2 = priv2.sign(data)
self.assertTrue(pub1.verify(sig1, data))
@@ -174,7 +177,7 @@ class ECDSA(unittest.TestCase):
self.assertEqual(hexlify(pub1.to_string()), hexlify(pub2.to_string()))
def test_nonrandom(self):
- s = b("all the entropy in the entire world, compressed into one line")
+ s = b"all the entropy in the entire world, compressed into one line"
def not_much_entropy(numbytes):
return s[:numbytes]
@@ -190,8 +193,8 @@ class ECDSA(unittest.TestCase):
# want to do this with keys you care about, because the secrecy of
# the private key depends upon using different random numbers for
# each signature
- sig1 = priv1.sign(b("data"), entropy=not_much_entropy)
- sig2 = priv2.sign(b("data"), entropy=not_much_entropy)
+ sig1 = priv1.sign(b"data", entropy=not_much_entropy)
+ sig2 = priv2.sign(b"data", entropy=not_much_entropy)
self.assertEqual(hexlify(sig1), hexlify(sig2))
def assertTruePrivkeysEqual(self, priv1, priv2):
@@ -204,7 +207,7 @@ class ECDSA(unittest.TestCase):
)
def test_privkey_creation(self):
- s = b("all the entropy in the entire world, compressed into one line")
+ s = b"all the entropy in the entire world, compressed into one line"
def not_much_entropy(numbytes):
return s[:numbytes]
@@ -239,8 +242,8 @@ class ECDSA(unittest.TestCase):
s1 = priv1.to_pem()
self.assertEqual(type(s1), binary_type)
- self.assertTrue(s1.startswith(b("-----BEGIN EC PRIVATE KEY-----")))
- self.assertTrue(s1.strip().endswith(b("-----END EC PRIVATE KEY-----")))
+ self.assertTrue(s1.startswith(b"-----BEGIN EC PRIVATE KEY-----"))
+ self.assertTrue(s1.strip().endswith(b"-----END EC PRIVATE KEY-----"))
priv2 = SigningKey.from_pem(s1)
self.assertTruePrivkeysEqual(priv1, priv2)
@@ -252,8 +255,8 @@ class ECDSA(unittest.TestCase):
priv1 = SigningKey.generate(curve=NIST256p)
s1 = priv1.to_pem()
self.assertEqual(type(s1), binary_type)
- self.assertTrue(s1.startswith(b("-----BEGIN EC PRIVATE KEY-----")))
- self.assertTrue(s1.strip().endswith(b("-----END EC PRIVATE KEY-----")))
+ self.assertTrue(s1.startswith(b"-----BEGIN EC PRIVATE KEY-----"))
+ self.assertTrue(s1.strip().endswith(b"-----END EC PRIVATE KEY-----"))
priv2 = SigningKey.from_pem(s1)
self.assertTruePrivkeysEqual(priv1, priv2)
@@ -266,8 +269,8 @@ class ECDSA(unittest.TestCase):
priv1 = SigningKey.generate(curve=BRAINPOOLP512r1)
s1 = priv1.to_pem()
self.assertEqual(type(s1), binary_type)
- self.assertTrue(s1.startswith(b("-----BEGIN EC PRIVATE KEY-----")))
- self.assertTrue(s1.strip().endswith(b("-----END EC PRIVATE KEY-----")))
+ self.assertTrue(s1.startswith(b"-----BEGIN EC PRIVATE KEY-----"))
+ self.assertTrue(s1.strip().endswith(b"-----END EC PRIVATE KEY-----"))
priv2 = SigningKey.from_pem(s1)
self.assertTruePrivkeysEqual(priv1, priv2)
@@ -304,7 +307,7 @@ class ECDSA(unittest.TestCase):
self.assertTruePubkeysEqual(pub1, pub2)
self.assertRaises(
- der.UnexpectedDER, VerifyingKey.from_der, pub1_der + b("junk")
+ der.UnexpectedDER, VerifyingKey.from_der, pub1_der + b"junk"
)
badpub = VerifyingKey.from_der(pub1_der)
@@ -328,10 +331,8 @@ class ECDSA(unittest.TestCase):
pem = pub1.to_pem()
self.assertEqual(type(pem), binary_type)
- self.assertTrue(pem.startswith(b("-----BEGIN PUBLIC KEY-----")), pem)
- self.assertTrue(
- pem.strip().endswith(b("-----END PUBLIC KEY-----")), pem
- )
+ self.assertTrue(pem.startswith(b"-----BEGIN PUBLIC KEY-----"), pem)
+ self.assertTrue(pem.strip().endswith(b"-----END PUBLIC KEY-----"), pem)
pub2 = VerifyingKey.from_pem(pem)
self.assertTruePubkeysEqual(pub1, pub2)
@@ -388,7 +389,7 @@ class ECDSA(unittest.TestCase):
type_oid_der = encoded_oid_ecPublicKey
curve_oid_der = der.encode_oid(*(1, 2, 840, 10045, 3, 1, 1))
enc_type_der = der.encode_sequence(type_oid_der, curve_oid_der)
- point_der = der.encode_bitstring(b"\x00\xff", None) + b("garbage")
+ point_der = der.encode_bitstring(b"\x00\xff", None) + b"garbage"
to_decode = der.encode_sequence(enc_type_der, point_der)
with self.assertRaises(der.UnexpectedDER):
@@ -427,7 +428,7 @@ class ECDSA(unittest.TestCase):
def test_signature_strings(self):
priv1 = SigningKey.generate()
pub1 = priv1.get_verifying_key()
- data = b("data")
+ data = b"data"
sig = priv1.sign(data)
self.assertEqual(type(sig), binary_type)
@@ -447,24 +448,96 @@ class ECDSA(unittest.TestCase):
self.assertEqual(type(sig_der), binary_type)
self.assertTrue(pub1.verify(sig_der, data, sigdecode=sigdecode_der))
+ def test_sigencode_string_canonize_no_change(self):
+ r = 12
+ s = 400
+ order = SECP112r1.order
+
+ new_r, new_s = sigdecode_string(
+ sigencode_string_canonize(r, s, order), order
+ )
+
+ self.assertEqual(r, new_r)
+ self.assertEqual(s, new_s)
+
+ def test_sigencode_string_canonize(self):
+ r = 12
+ order = SECP112r1.order
+ s = order - 10
+
+ new_r, new_s = sigdecode_string(
+ sigencode_string_canonize(r, s, order), order
+ )
+
+ self.assertEqual(r, new_r)
+ self.assertEqual(order - s, new_s)
+
+ def test_sigencode_strings_canonize_no_change(self):
+ r = 12
+ s = 400
+ order = SECP112r1.order
+
+ new_r, new_s = sigdecode_strings(
+ sigencode_strings_canonize(r, s, order), order
+ )
+
+ self.assertEqual(r, new_r)
+ self.assertEqual(s, new_s)
+
+ def test_sigencode_strings_canonize(self):
+ r = 12
+ order = SECP112r1.order
+ s = order - 10
+
+ new_r, new_s = sigdecode_strings(
+ sigencode_strings_canonize(r, s, order), order
+ )
+
+ self.assertEqual(r, new_r)
+ self.assertEqual(order - s, new_s)
+
+ def test_sigencode_der_canonize_no_change(self):
+ r = 13
+ s = 200
+ order = SECP112r1.order
+
+ new_r, new_s = sigdecode_der(
+ sigencode_der_canonize(r, s, order), order
+ )
+
+ self.assertEqual(r, new_r)
+ self.assertEqual(s, new_s)
+
+ def test_sigencode_der_canonize(self):
+ r = 13
+ order = SECP112r1.order
+ s = order - 14
+
+ new_r, new_s = sigdecode_der(
+ sigencode_der_canonize(r, s, order), order
+ )
+
+ self.assertEqual(r, new_r)
+ self.assertEqual(order - s, new_s)
+
def test_sig_decode_strings_with_invalid_count(self):
with self.assertRaises(MalformedSignature):
- sigdecode_strings([b("one"), b("two"), b("three")], 0xFF)
+ sigdecode_strings([b"one", b"two", b"three"], 0xFF)
def test_sig_decode_strings_with_wrong_r_len(self):
with self.assertRaises(MalformedSignature):
- sigdecode_strings([b("one"), b("two")], 0xFF)
+ sigdecode_strings([b"one", b"two"], 0xFF)
def test_sig_decode_strings_with_wrong_s_len(self):
with self.assertRaises(MalformedSignature):
- sigdecode_strings([b("\xa0"), b("\xb0\xff")], 0xFF)
+ sigdecode_strings([b"\xa0", b"\xb0\xff"], 0xFF)
def test_verify_with_too_long_input(self):
sk = SigningKey.generate()
vk = sk.verifying_key
with self.assertRaises(BadDigestError):
- vk.verify_digest(None, b("\x00") * 128)
+ vk.verify_digest(None, b"\x00" * 128)
def test_sk_from_secret_exponent_with_wrong_sec_exponent(self):
with self.assertRaises(MalformedPointError):
@@ -472,11 +545,11 @@ class ECDSA(unittest.TestCase):
def test_sk_from_string_with_wrong_len_string(self):
with self.assertRaises(MalformedPointError):
- SigningKey.from_string(b("\x01"))
+ SigningKey.from_string(b"\x01")
def test_sk_from_der_with_junk_after_sequence(self):
ver_der = der.encode_integer(1)
- to_decode = der.encode_sequence(ver_der) + b("garbage")
+ to_decode = der.encode_sequence(ver_der) + b"garbage"
with self.assertRaises(der.UnexpectedDER):
SigningKey.from_der(to_decode)
@@ -490,7 +563,7 @@ class ECDSA(unittest.TestCase):
def test_sk_from_der_invalid_const_tag(self):
ver_der = der.encode_integer(1)
- privkey_der = der.encode_octet_string(b("\x00\xff"))
+ privkey_der = der.encode_octet_string(b"\x00\xff")
curve_oid_der = der.encode_oid(*(1, 2, 3))
const_der = der.encode_constructed(1, curve_oid_der)
to_decode = der.encode_sequence(
@@ -502,8 +575,8 @@ class ECDSA(unittest.TestCase):
def test_sk_from_der_garbage_after_privkey_oid(self):
ver_der = der.encode_integer(1)
- privkey_der = der.encode_octet_string(b("\x00\xff"))
- curve_oid_der = der.encode_oid(*(1, 2, 3)) + b("garbage")
+ privkey_der = der.encode_octet_string(b"\x00\xff")
+ curve_oid_der = der.encode_oid(*(1, 2, 3)) + b"garbage"
const_der = der.encode_constructed(0, curve_oid_der)
to_decode = der.encode_sequence(
ver_der, privkey_der, const_der, curve_oid_der
@@ -514,7 +587,7 @@ class ECDSA(unittest.TestCase):
def test_sk_from_der_with_short_privkey(self):
ver_der = der.encode_integer(1)
- privkey_der = der.encode_octet_string(b("\x00\xff"))
+ privkey_der = der.encode_octet_string(b"\x00\xff")
curve_oid_der = der.encode_oid(*(1, 2, 840, 10045, 3, 1, 1))
const_der = der.encode_constructed(0, curve_oid_der)
to_decode = der.encode_sequence(
@@ -598,30 +671,32 @@ class ECDSA(unittest.TestCase):
sk = SigningKey.from_secret_exponent(12)
with self.assertRaises(BadDigestError):
- sk.sign_digest(b("\xff") * 64)
+ sk.sign_digest(b"\xff" * 64)
def test_hashfunc(self):
- sk = SigningKey.generate(curve=NIST256p, hashfunc=sha256)
- data = b("security level is 128 bits")
+ sk = SigningKey.generate(curve=NIST256p, hashfunc=hashlib.sha256)
+ data = b"security level is 128 bits"
sig = sk.sign(data)
vk = VerifyingKey.from_string(
- sk.get_verifying_key().to_string(), curve=NIST256p, hashfunc=sha256
+ sk.get_verifying_key().to_string(),
+ curve=NIST256p,
+ hashfunc=hashlib.sha256,
)
self.assertTrue(vk.verify(sig, data))
sk2 = SigningKey.generate(curve=NIST256p)
- sig2 = sk2.sign(data, hashfunc=sha256)
+ sig2 = sk2.sign(data, hashfunc=hashlib.sha256)
vk2 = VerifyingKey.from_string(
sk2.get_verifying_key().to_string(),
curve=NIST256p,
- hashfunc=sha256,
+ hashfunc=hashlib.sha256,
)
self.assertTrue(vk2.verify(sig2, data))
vk3 = VerifyingKey.from_string(
sk.get_verifying_key().to_string(), curve=NIST256p
)
- self.assertTrue(vk3.verify(sig, data, hashfunc=sha256))
+ self.assertTrue(vk3.verify(sig, data, hashfunc=hashlib.sha256))
def test_public_key_recovery(self):
# Create keys
@@ -631,7 +706,7 @@ class ECDSA(unittest.TestCase):
vk = sk.get_verifying_key()
# Sign a message
- data = b("blahblah")
+ data = b"blahblah"
signature = sk.sign(data)
# Recover verifying keys
@@ -660,16 +735,20 @@ class ECDSA(unittest.TestCase):
# Create keys
curve = BRAINPOOLP160r1
- sk = SigningKey.generate(curve=curve, hashfunc=sha256)
+ sk = SigningKey.generate(curve=curve, hashfunc=hashlib.sha256)
vk = sk.get_verifying_key()
# Sign a message
- data = b("blahblah")
+ data = b"blahblah"
signature = sk.sign(data)
# Recover verifying keys
recovered_vks = VerifyingKey.from_public_key_recovery(
- signature, data, curve, hashfunc=sha256, allow_truncate=True
+ signature,
+ data,
+ curve,
+ hashfunc=hashlib.sha256,
+ allow_truncate=True,
)
# Test if each pk is valid
@@ -679,7 +758,7 @@ class ECDSA(unittest.TestCase):
# Test if properties are equal
self.assertEqual(vk.curve, recovered_vk.curve)
- self.assertEqual(sha256, recovered_vk.default_hashfunc)
+ self.assertEqual(hashlib.sha256, recovered_vk.default_hashfunc)
# Test if original vk is the list of recovered keys
self.assertIn(
@@ -698,9 +777,9 @@ class ECDSA(unittest.TestCase):
)
self.assertEqual(vk.to_string(), exp)
self.assertEqual(vk.to_string("raw"), exp)
- self.assertEqual(vk.to_string("uncompressed"), b("\x04") + exp)
- self.assertEqual(vk.to_string("compressed"), b("\x02") + exp[:24])
- self.assertEqual(vk.to_string("hybrid"), b("\x06") + exp)
+ self.assertEqual(vk.to_string("uncompressed"), b"\x04" + exp)
+ self.assertEqual(vk.to_string("compressed"), b"\x02" + exp[:24])
+ self.assertEqual(vk.to_string("hybrid"), b"\x06" + exp)
def test_decoding(self):
sk = SigningKey.from_secret_exponent(123456789)
@@ -715,13 +794,13 @@ class ECDSA(unittest.TestCase):
from_raw = VerifyingKey.from_string(enc)
self.assertEqual(from_raw.pubkey.point, vk.pubkey.point)
- from_uncompressed = VerifyingKey.from_string(b("\x04") + enc)
+ from_uncompressed = VerifyingKey.from_string(b"\x04" + enc)
self.assertEqual(from_uncompressed.pubkey.point, vk.pubkey.point)
- from_compressed = VerifyingKey.from_string(b("\x02") + enc[:24])
+ from_compressed = VerifyingKey.from_string(b"\x02" + enc[:24])
self.assertEqual(from_compressed.pubkey.point, vk.pubkey.point)
- from_uncompressed = VerifyingKey.from_string(b("\x06") + enc)
+ from_uncompressed = VerifyingKey.from_string(b"\x06" + enc)
self.assertEqual(from_uncompressed.pubkey.point, vk.pubkey.point)
def test_uncompressed_decoding_as_only_alowed(self):
@@ -797,7 +876,7 @@ class ECDSA(unittest.TestCase):
)
with self.assertRaises(MalformedPointError):
- VerifyingKey.from_string(b("\x02") + enc)
+ VerifyingKey.from_string(b"\x02" + enc)
def test_decoding_with_malformed_compressed(self):
enc = b(
@@ -807,7 +886,7 @@ class ECDSA(unittest.TestCase):
)
with self.assertRaises(MalformedPointError):
- VerifyingKey.from_string(b("\x01") + enc[:24])
+ VerifyingKey.from_string(b"\x01" + enc[:24])
def test_decoding_with_inconsistent_hybrid(self):
enc = b(
@@ -817,7 +896,7 @@ class ECDSA(unittest.TestCase):
)
with self.assertRaises(MalformedPointError):
- VerifyingKey.from_string(b("\x07") + enc)
+ VerifyingKey.from_string(b"\x07" + enc)
def test_decoding_with_point_not_on_curve(self):
enc = b(
@@ -827,18 +906,18 @@ class ECDSA(unittest.TestCase):
)
with self.assertRaises(MalformedPointError):
- VerifyingKey.from_string(enc[:47] + b("\x00"))
+ VerifyingKey.from_string(enc[:47] + b"\x00")
def test_decoding_with_point_at_infinity(self):
# decoding it is unsupported, as it's not necessary to encode it
with self.assertRaises(MalformedPointError):
- VerifyingKey.from_string(b("\x00"))
+ VerifyingKey.from_string(b"\x00")
def test_not_lying_on_curve(self):
enc = number_to_string(NIST192p.curve.p(), NIST192p.curve.p() + 1)
with self.assertRaises(MalformedPointError):
- VerifyingKey.from_string(b("\x02") + enc)
+ VerifyingKey.from_string(b"\x02" + enc)
def test_from_string_with_invalid_curve_too_short_ver_key_len(self):
# both verifying_key_length and baselen are calculated internally
@@ -849,7 +928,7 @@ class ECDSA(unittest.TestCase):
curve.baselen = 32
with self.assertRaises(MalformedPointError):
- VerifyingKey.from_string(b("\x00") * 16, curve)
+ VerifyingKey.from_string(b"\x00" * 16, curve)
def test_from_string_with_invalid_curve_too_long_ver_key_len(self):
# both verifying_key_length and baselen are calculated internally
@@ -860,7 +939,7 @@ class ECDSA(unittest.TestCase):
curve.baselen = 16
with self.assertRaises(MalformedPointError):
- VerifyingKey.from_string(b("\x00") * 16, curve)
+ VerifyingKey.from_string(b"\x00" * 16, curve)
@pytest.mark.parametrize(
@@ -870,9 +949,9 @@ def test_VerifyingKey_decode_with_small_values(val, even):
enc = number_to_string(val, NIST192p.order)
if even:
- enc = b("\x02") + enc
+ enc = b"\x02" + enc
else:
- enc = b("\x03") + enc
+ enc = b"\x03" + enc
# small values can both be actual valid public keys and not, verify that
# only expected exceptions are raised if they are not
@@ -903,6 +982,24 @@ def test_VerifyingKey_encode_decode(curve, encoding):
assert vk.pubkey.point == from_enc.pubkey.point
+if "--fast" in sys.argv: # pragma: no cover
+ params = [NIST192p, BRAINPOOLP160r1]
+else:
+ params = curves
+
+
[email protected]("curve", params)
+def test_lengths(curve):
+ priv = SigningKey.generate(curve=curve)
+ pub1 = priv.get_verifying_key()
+ pub2 = VerifyingKey.from_string(pub1.to_string(), curve)
+ assert pub1.to_string() == pub2.to_string()
+ assert len(pub1.to_string()) == curve.verifying_key_length
+ sig = priv.sign(b"data")
+ assert len(sig) == curve.signature_length
+
+
class OpenSSL(unittest.TestCase):
# test interoperability with OpenSSL tools. Note that openssl's ECDSA
# sign/verify arguments changed between 0.9.8 and 1.0.0: the early
@@ -939,6 +1036,7 @@ class OpenSSL(unittest.TestCase):
# vk: 3:OpenSSL->python 4:python->OpenSSL
# sig: 5:OpenSSL->python 6:python->OpenSSL
+ @pytest.mark.slow
@pytest.mark.skipif(
"secp112r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support secp112r1",
@@ -946,6 +1044,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_secp112r1(self):
return self.do_test_from_openssl(SECP112r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"secp112r2" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support secp112r2",
@@ -953,6 +1052,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_secp112r2(self):
return self.do_test_from_openssl(SECP112r2)
+ @pytest.mark.slow
@pytest.mark.skipif(
"secp128r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support secp128r1",
@@ -960,6 +1060,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_secp128r1(self):
return self.do_test_from_openssl(SECP128r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"secp160r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support secp160r1",
@@ -967,6 +1068,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_secp160r1(self):
return self.do_test_from_openssl(SECP160r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"prime192v1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support prime192v1",
@@ -974,6 +1076,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_nist192p(self):
return self.do_test_from_openssl(NIST192p)
+ @pytest.mark.slow
@pytest.mark.skipif(
"prime192v1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support prime192v1",
@@ -981,6 +1084,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_nist192p_sha256(self):
return self.do_test_from_openssl(NIST192p, "SHA256")
+ @pytest.mark.slow
@pytest.mark.skipif(
"secp224r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support secp224r1",
@@ -988,6 +1092,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_nist224p(self):
return self.do_test_from_openssl(NIST224p)
+ @pytest.mark.slow
@pytest.mark.skipif(
"prime256v1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support prime256v1",
@@ -995,6 +1100,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_nist256p(self):
return self.do_test_from_openssl(NIST256p)
+ @pytest.mark.slow
@pytest.mark.skipif(
"prime256v1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support prime256v1",
@@ -1002,6 +1108,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_nist256p_sha384(self):
return self.do_test_from_openssl(NIST256p, "SHA384")
+ @pytest.mark.slow
@pytest.mark.skipif(
"prime256v1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support prime256v1",
@@ -1009,6 +1116,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_nist256p_sha512(self):
return self.do_test_from_openssl(NIST256p, "SHA512")
+ @pytest.mark.slow
@pytest.mark.skipif(
"secp384r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support secp384r1",
@@ -1016,6 +1124,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_nist384p(self):
return self.do_test_from_openssl(NIST384p)
+ @pytest.mark.slow
@pytest.mark.skipif(
"secp521r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support secp521r1",
@@ -1023,6 +1132,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_nist521p(self):
return self.do_test_from_openssl(NIST521p)
+ @pytest.mark.slow
@pytest.mark.skipif(
"secp256k1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support secp256k1",
@@ -1030,6 +1140,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_secp256k1(self):
return self.do_test_from_openssl(SECP256k1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"brainpoolP160r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support brainpoolP160r1",
@@ -1037,6 +1148,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_brainpoolp160r1(self):
return self.do_test_from_openssl(BRAINPOOLP160r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"brainpoolP192r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support brainpoolP192r1",
@@ -1044,6 +1156,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_brainpoolp192r1(self):
return self.do_test_from_openssl(BRAINPOOLP192r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"brainpoolP224r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support brainpoolP224r1",
@@ -1051,6 +1164,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_brainpoolp224r1(self):
return self.do_test_from_openssl(BRAINPOOLP224r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"brainpoolP256r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support brainpoolP256r1",
@@ -1058,6 +1172,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_brainpoolp256r1(self):
return self.do_test_from_openssl(BRAINPOOLP256r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"brainpoolP320r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support brainpoolP320r1",
@@ -1065,6 +1180,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_brainpoolp320r1(self):
return self.do_test_from_openssl(BRAINPOOLP320r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"brainpoolP384r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support brainpoolP384r1",
@@ -1072,6 +1188,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_brainpoolp384r1(self):
return self.do_test_from_openssl(BRAINPOOLP384r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"brainpoolP512r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support brainpoolP512r1",
@@ -1079,6 +1196,62 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_brainpoolp512r1(self):
return self.do_test_from_openssl(BRAINPOOLP512r1)
+ @pytest.mark.slow
+ @pytest.mark.skipif(
+ "brainpoolP160t1" not in OPENSSL_SUPPORTED_CURVES,
+ reason="system openssl does not support brainpoolP160t1",
+ )
+ def test_from_openssl_brainpoolp160t1(self):
+ return self.do_test_from_openssl(BRAINPOOLP160t1)
+
+ @pytest.mark.slow
+ @pytest.mark.skipif(
+ "brainpoolP192t1" not in OPENSSL_SUPPORTED_CURVES,
+ reason="system openssl does not support brainpoolP192t1",
+ )
+ def test_from_openssl_brainpoolp192t1(self):
+ return self.do_test_from_openssl(BRAINPOOLP192t1)
+
+ @pytest.mark.slow
+ @pytest.mark.skipif(
+ "brainpoolP224t1" not in OPENSSL_SUPPORTED_CURVES,
+ reason="system openssl does not support brainpoolP224t1",
+ )
+ def test_from_openssl_brainpoolp224t1(self):
+ return self.do_test_from_openssl(BRAINPOOLP224t1)
+
+ @pytest.mark.slow
+ @pytest.mark.skipif(
+ "brainpoolP256t1" not in OPENSSL_SUPPORTED_CURVES,
+ reason="system openssl does not support brainpoolP256t1",
+ )
+ def test_from_openssl_brainpoolp256t1(self):
+ return self.do_test_from_openssl(BRAINPOOLP256t1)
+
+ @pytest.mark.slow
+ @pytest.mark.skipif(
+ "brainpoolP320t1" not in OPENSSL_SUPPORTED_CURVES,
+ reason="system openssl does not support brainpoolP320t1",
+ )
+ def test_from_openssl_brainpoolp320t1(self):
+ return self.do_test_from_openssl(BRAINPOOLP320t1)
+
+ @pytest.mark.slow
+ @pytest.mark.skipif(
+ "brainpoolP384t1" not in OPENSSL_SUPPORTED_CURVES,
+ reason="system openssl does not support brainpoolP384t1",
+ )
+ def test_from_openssl_brainpoolp384t1(self):
+ return self.do_test_from_openssl(BRAINPOOLP384t1)
+
+ @pytest.mark.slow
+ @pytest.mark.skipif(
+ "brainpoolP512t1" not in OPENSSL_SUPPORTED_CURVES,
+ reason="system openssl does not support brainpoolP512t1",
+ )
+ def test_from_openssl_brainpoolp512t1(self):
+ return self.do_test_from_openssl(BRAINPOOLP512t1)
+
def do_test_from_openssl(self, curve, hash_name="SHA1"):
curvename = curve.openssl_name
assert curvename
@@ -1090,7 +1263,7 @@ class OpenSSL(unittest.TestCase):
os.mkdir("t")
run_openssl("ecparam -name %s -genkey -out t/privkey.pem" % curvename)
run_openssl("ec -in t/privkey.pem -pubout -out t/pubkey.pem")
- data = b("data")
+ data = b"data"
with open("t/data.txt", "wb") as e:
e.write(data)
run_openssl(
@@ -1131,6 +1304,7 @@ class OpenSSL(unittest.TestCase):
sk_from_p8 = SigningKey.from_pem(privkey_p8_pem)
self.assertEqual(sk, sk_from_p8)
+ @pytest.mark.slow
@pytest.mark.skipif(
"secp112r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support secp112r1",
@@ -1138,6 +1312,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_secp112r1(self):
self.do_test_to_openssl(SECP112r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"secp112r2" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support secp112r2",
@@ -1145,6 +1320,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_secp112r2(self):
self.do_test_to_openssl(SECP112r2)
+ @pytest.mark.slow
@pytest.mark.skipif(
"secp128r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support secp128r1",
@@ -1152,6 +1328,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_secp128r1(self):
self.do_test_to_openssl(SECP128r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"secp160r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support secp160r1",
@@ -1159,6 +1336,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_secp160r1(self):
self.do_test_to_openssl(SECP160r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"prime192v1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support prime192v1",
@@ -1166,6 +1344,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_nist192p(self):
self.do_test_to_openssl(NIST192p)
+ @pytest.mark.slow
@pytest.mark.skipif(
"prime192v1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support prime192v1",
@@ -1173,6 +1352,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_nist192p_sha256(self):
self.do_test_to_openssl(NIST192p, "SHA256")
+ @pytest.mark.slow
@pytest.mark.skipif(
"secp224r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support secp224r1",
@@ -1180,6 +1360,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_nist224p(self):
self.do_test_to_openssl(NIST224p)
+ @pytest.mark.slow
@pytest.mark.skipif(
"prime256v1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support prime256v1",
@@ -1187,6 +1368,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_nist256p(self):
self.do_test_to_openssl(NIST256p)
+ @pytest.mark.slow
@pytest.mark.skipif(
"prime256v1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support prime256v1",
@@ -1194,6 +1376,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_nist256p_sha384(self):
self.do_test_to_openssl(NIST256p, "SHA384")
+ @pytest.mark.slow
@pytest.mark.skipif(
"prime256v1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support prime256v1",
@@ -1201,6 +1384,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_nist256p_sha512(self):
self.do_test_to_openssl(NIST256p, "SHA512")
+ @pytest.mark.slow
@pytest.mark.skipif(
"secp384r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support secp384r1",
@@ -1208,6 +1392,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_nist384p(self):
self.do_test_to_openssl(NIST384p)
+ @pytest.mark.slow
@pytest.mark.skipif(
"secp521r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support secp521r1",
@@ -1215,6 +1400,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_nist521p(self):
self.do_test_to_openssl(NIST521p)
+ @pytest.mark.slow
@pytest.mark.skipif(
"secp256k1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support secp256k1",
@@ -1222,6 +1408,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_secp256k1(self):
self.do_test_to_openssl(SECP256k1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"brainpoolP160r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support brainpoolP160r1",
@@ -1229,6 +1416,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_brainpoolp160r1(self):
self.do_test_to_openssl(BRAINPOOLP160r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"brainpoolP192r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support brainpoolP192r1",
@@ -1236,6 +1424,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_brainpoolp192r1(self):
self.do_test_to_openssl(BRAINPOOLP192r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"brainpoolP224r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support brainpoolP224r1",
@@ -1243,6 +1432,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_brainpoolp224r1(self):
self.do_test_to_openssl(BRAINPOOLP224r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"brainpoolP256r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support brainpoolP256r1",
@@ -1250,6 +1440,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_brainpoolp256r1(self):
self.do_test_to_openssl(BRAINPOOLP256r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"brainpoolP320r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support brainpoolP320r1",
@@ -1257,6 +1448,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_brainpoolp320r1(self):
self.do_test_to_openssl(BRAINPOOLP320r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"brainpoolP384r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support brainpoolP384r1",
@@ -1264,6 +1456,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_brainpoolp384r1(self):
self.do_test_to_openssl(BRAINPOOLP384r1)
+ @pytest.mark.slow
@pytest.mark.skipif(
"brainpoolP512r1" not in OPENSSL_SUPPORTED_CURVES,
reason="system openssl does not support brainpoolP512r1",
@@ -1271,6 +1464,62 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_brainpoolp512r1(self):
self.do_test_to_openssl(BRAINPOOLP512r1)
+ @pytest.mark.slow
+ @pytest.mark.skipif(
+ "brainpoolP160t1" not in OPENSSL_SUPPORTED_CURVES,
+ reason="system openssl does not support brainpoolP160t1",
+ )
+ def test_to_openssl_brainpoolp160t1(self):
+ self.do_test_to_openssl(BRAINPOOLP160t1)
+
+ @pytest.mark.slow
+ @pytest.mark.skipif(
+ "brainpoolP192t1" not in OPENSSL_SUPPORTED_CURVES,
+ reason="system openssl does not support brainpoolP192t1",
+ )
+ def test_to_openssl_brainpoolp192t1(self):
+ self.do_test_to_openssl(BRAINPOOLP192t1)
+
+ @pytest.mark.slow
+ @pytest.mark.skipif(
+ "brainpoolP224t1" not in OPENSSL_SUPPORTED_CURVES,
+ reason="system openssl does not support brainpoolP224t1",
+ )
+ def test_to_openssl_brainpoolp224t1(self):
+ self.do_test_to_openssl(BRAINPOOLP224t1)
+
+ @pytest.mark.slow
+ @pytest.mark.skipif(
+ "brainpoolP256t1" not in OPENSSL_SUPPORTED_CURVES,
+ reason="system openssl does not support brainpoolP256t1",
+ )
+ def test_to_openssl_brainpoolp256t1(self):
+ self.do_test_to_openssl(BRAINPOOLP256t1)
+
+ @pytest.mark.slow
+ @pytest.mark.skipif(
+ "brainpoolP320t1" not in OPENSSL_SUPPORTED_CURVES,
+ reason="system openssl does not support brainpoolP320t1",
+ )
+ def test_to_openssl_brainpoolp320t1(self):
+ self.do_test_to_openssl(BRAINPOOLP320t1)
+
+ @pytest.mark.slow
+ @pytest.mark.skipif(
+ "brainpoolP384t1" not in OPENSSL_SUPPORTED_CURVES,
+ reason="system openssl does not support brainpoolP384t1",
+ )
+ def test_to_openssl_brainpoolp384t1(self):
+ self.do_test_to_openssl(BRAINPOOLP384t1)
+
+ @pytest.mark.slow
+ @pytest.mark.skipif(
+ "brainpoolP512t1" not in OPENSSL_SUPPORTED_CURVES,
+ reason="system openssl does not support brainpoolP512t1",
+ )
+ def test_to_openssl_brainpoolp512t1(self):
+ self.do_test_to_openssl(BRAINPOOLP512t1)
+
def do_test_to_openssl(self, curve, hash_name="SHA1"):
curvename = curve.openssl_name
assert curvename
@@ -1282,7 +1531,7 @@ class OpenSSL(unittest.TestCase):
os.mkdir("t")
sk = SigningKey.generate(curve=curve)
vk = sk.get_verifying_key()
- data = b("data")
+ data = b"data"
with open("t/pubkey.der", "wb") as e:
e.write(vk.to_der()) # 4
with open("t/pubkey.pem", "wb") as e:
@@ -1298,7 +1547,7 @@ class OpenSSL(unittest.TestCase):
with open("t/data.txt", "wb") as e:
e.write(data)
with open("t/baddata.txt", "wb") as e:
- e.write(data + b("corrupt"))
+ e.write(data + b"corrupt")
self.assertRaises(
SubprocessError,
@@ -1359,17 +1608,15 @@ class OpenSSL(unittest.TestCase):
OPENSSL_SUPPORTED_TYPES = set()
try:
if "-rawin" in run_openssl("pkeyutl -help"):
- OPENSSL_SUPPORTED_TYPES = set(
+ OPENSSL_SUPPORTED_TYPES = set( # pragma: no branch
c.lower()
for c in ("ED25519", "ED448")
if c in run_openssl("list -public-key-methods")
)
- except SubprocessError:
+ except SubprocessError: # pragma: no cover
pass
def do_eddsa_test_to_openssl(self, curve):
- curvename = curve.name.upper()
-
if os.path.isdir("t"):
shutil.rmtree("t")
os.mkdir("t")
@@ -1406,6 +1653,7 @@ class OpenSSL(unittest.TestCase):
# in practice at least OpenSSL 3.0.0 is needed to make EdDSA signatures
# earlier versions support EdDSA only in X.509 certificates
+ @pytest.mark.slow
@pytest.mark.skipif(
"ed25519" not in OPENSSL_SUPPORTED_TYPES,
reason="system openssl does not support signing with Ed25519",
@@ -1413,6 +1661,7 @@ class OpenSSL(unittest.TestCase):
def test_to_openssl_ed25519(self):
return self.do_eddsa_test_to_openssl(Ed25519)
+ @pytest.mark.slow
@pytest.mark.skipif(
"ed448" not in OPENSSL_SUPPORTED_TYPES,
reason="system openssl does not support signing with Ed448",
@@ -1456,6 +1705,7 @@ class OpenSSL(unittest.TestCase):
shutil.rmtree("t")
+ @pytest.mark.slow
@pytest.mark.skipif(
"ed25519" not in OPENSSL_SUPPORTED_TYPES,
reason="system openssl does not support signing with Ed25519",
@@ -1463,6 +1713,7 @@ class OpenSSL(unittest.TestCase):
def test_from_openssl_ed25519(self):
return self.do_eddsa_test_from_openssl(Ed25519)
+ @pytest.mark.slow
@pytest.mark.skipif(
"ed448" not in OPENSSL_SUPPORTED_TYPES,
reason="system openssl does not support signing with Ed448",
@@ -1483,7 +1734,7 @@ class TooSmallCurve(unittest.TestCase):
)
def test_sign_too_small_curve_dont_allow_truncate_raises(self):
sk = SigningKey.generate(curve=NIST192p)
- data = b("data")
+ data = b"data"
with self.assertRaises(BadDigestError):
sk.sign(
data,
@@ -1499,7 +1750,7 @@ class TooSmallCurve(unittest.TestCase):
def test_verify_too_small_curve_dont_allow_truncate_raises(self):
sk = SigningKey.generate(curve=NIST192p)
vk = sk.get_verifying_key()
- data = b("data")
+ data = b"data"
sig_der = sk.sign(
data,
hashfunc=partial(hashlib.new, "SHA256"),
@@ -1518,69 +1769,70 @@ class TooSmallCurve(unittest.TestCase):
class DER(unittest.TestCase):
def test_integer(self):
- self.assertEqual(der.encode_integer(0), b("\x02\x01\x00"))
- self.assertEqual(der.encode_integer(1), b("\x02\x01\x01"))
- self.assertEqual(der.encode_integer(127), b("\x02\x01\x7f"))
- self.assertEqual(der.encode_integer(128), b("\x02\x02\x00\x80"))
- self.assertEqual(der.encode_integer(256), b("\x02\x02\x01\x00"))
- # self.assertEqual(der.encode_integer(-1), b("\x02\x01\xff"))
+ self.assertEqual(der.encode_integer(0), b"\x02\x01\x00")
+ self.assertEqual(der.encode_integer(1), b"\x02\x01\x01")
+ self.assertEqual(der.encode_integer(127), b"\x02\x01\x7f")
+ self.assertEqual(der.encode_integer(128), b"\x02\x02\x00\x80")
+ self.assertEqual(der.encode_integer(256), b"\x02\x02\x01\x00")
+ # self.assertEqual(der.encode_integer(-1), b"\x02\x01\xff")
def s(n):
- return der.remove_integer(der.encode_integer(n) + b("junk"))
+ return der.remove_integer(der.encode_integer(n) + b"junk")
- self.assertEqual(s(0), (0, b("junk")))
- self.assertEqual(s(1), (1, b("junk")))
- self.assertEqual(s(127), (127, b("junk")))
- self.assertEqual(s(128), (128, b("junk")))
- self.assertEqual(s(256), (256, b("junk")))
+ self.assertEqual(s(0), (0, b"junk"))
+ self.assertEqual(s(1), (1, b"junk"))
+ self.assertEqual(s(127), (127, b"junk"))
+ self.assertEqual(s(128), (128, b"junk"))
+ self.assertEqual(s(256), (256, b"junk"))
self.assertEqual(
s(1234567890123456789012345678901234567890),
- (1234567890123456789012345678901234567890, b("junk")),
+ (1234567890123456789012345678901234567890, b"junk"),
)
def test_number(self):
- self.assertEqual(der.encode_number(0), b("\x00"))
- self.assertEqual(der.encode_number(127), b("\x7f"))
- self.assertEqual(der.encode_number(128), b("\x81\x00"))
- self.assertEqual(der.encode_number(3 * 128 + 7), b("\x83\x07"))
+ self.assertEqual(der.encode_number(0), b"\x00")
+ self.assertEqual(der.encode_number(127), b"\x7f")
+ self.assertEqual(der.encode_number(128), b"\x81\x00")
+ self.assertEqual(der.encode_number(3 * 128 + 7), b"\x83\x07")
# self.assertEqual(der.read_number("\x81\x9b" + "more"), (155, 2))
- # self.assertEqual(der.encode_number(155), b("\x81\x9b"))
+ # self.assertEqual(der.encode_number(155), b"\x81\x9b")
for n in (0, 1, 2, 127, 128, 3 * 128 + 7, 840, 10045): # , 155):
- x = der.encode_number(n) + b("more")
+ x = der.encode_number(n) + b"more"
n1, llen = der.read_number(x)
self.assertEqual(n1, n)
- self.assertEqual(x[llen:], b("more"))
+ self.assertEqual(x[llen:], b"more")
def test_length(self):
- self.assertEqual(der.encode_length(0), b("\x00"))
- self.assertEqual(der.encode_length(127), b("\x7f"))
- self.assertEqual(der.encode_length(128), b("\x81\x80"))
- self.assertEqual(der.encode_length(255), b("\x81\xff"))
- self.assertEqual(der.encode_length(256), b("\x82\x01\x00"))
- self.assertEqual(der.encode_length(3 * 256 + 7), b("\x82\x03\x07"))
- self.assertEqual(der.read_length(b("\x81\x9b") + b("more")), (155, 2))
- self.assertEqual(der.encode_length(155), b("\x81\x9b"))
+ self.assertEqual(der.encode_length(0), b"\x00")
+ self.assertEqual(der.encode_length(127), b"\x7f")
+ self.assertEqual(der.encode_length(128), b"\x81\x80")
+ self.assertEqual(der.encode_length(255), b"\x81\xff")
+ self.assertEqual(der.encode_length(256), b"\x82\x01\x00")
+ self.assertEqual(der.encode_length(3 * 256 + 7), b"\x82\x03\x07")
+ self.assertEqual(der.read_length(b"\x81\x9b" + b"more"), (155, 2))
+ self.assertEqual(der.encode_length(155), b"\x81\x9b")
for n in (0, 1, 2, 127, 128, 255, 256, 3 * 256 + 7, 155):
- x = der.encode_length(n) + b("more")
+ x = der.encode_length(n) + b"more"
n1, llen = der.read_length(x)
self.assertEqual(n1, n)
- self.assertEqual(x[llen:], b("more"))
+ self.assertEqual(x[llen:], b"more")
def test_sequence(self):
- x = der.encode_sequence(b("ABC"), b("DEF")) + b("GHI")
- self.assertEqual(x, b("\x30\x06ABCDEFGHI"))
+ x = der.encode_sequence(b"ABC", b"DEF") + b"GHI"
+ self.assertEqual(x, b"\x30\x06ABCDEFGHI")
x1, rest = der.remove_sequence(x)
- self.assertEqual(x1, b("ABCDEF"))
- self.assertEqual(rest, b("GHI"))
+ self.assertEqual(x1, b"ABCDEF")
+ self.assertEqual(rest, b"GHI")
def test_constructed(self):
x = der.encode_constructed(0, NIST224p.encoded_oid)
- self.assertEqual(hexlify(x), b("a007") + b("06052b81040021"))
- x = der.encode_constructed(1, unhexlify(b("0102030a0b0c")))
- self.assertEqual(hexlify(x), b("a106") + b("0102030a0b0c"))
+ self.assertEqual(hexlify(x), b"a007" + b"06052b81040021")
+ x = der.encode_constructed(1, unhexlify(b"0102030a0b0c"))
+ self.assertEqual(hexlify(x), b"a106" + b"0102030a0b0c")
class Util(unittest.TestCase):
+ @pytest.mark.slow
def test_trytryagain(self):
tta = util.randrange_from_seed__trytryagain
for i in range(1000):
@@ -1599,7 +1851,7 @@ class Util(unittest.TestCase):
# this trytryagain *does* provide long-term stability
self.assertEqual(
("%x" % (tta("seed", NIST224p.order))).encode(),
- b("6fa59d73bf0446ae8743cf748fc5ac11d5585a90356417e97155c3bc"),
+ b"6fa59d73bf0446ae8743cf748fc5ac11d5585a90356417e97155c3bc",
)
def test_trytryagain_single(self):
@@ -1610,9 +1862,10 @@ class Util(unittest.TestCase):
# known issue: https://github.com/warner/python-ecdsa/issues/221
if sys.version_info < (3, 0): # pragma: no branch
self.assertEqual(n, 228)
- else:
+ else: # pragma: no branch
self.assertEqual(n, 18)
+ @settings(**HYP_SETTINGS)
@given(st.integers(min_value=0, max_value=10**200))
def test_randrange(self, i):
# util.randrange does not provide long-term stability: we might
@@ -1656,8 +1909,8 @@ class RFC6979(unittest.TestCase):
self._do(
generator=SECP256k1.generator,
secexp=int("9d0219792467d7d37b4d43298a7d0c05", 16),
- hsh=sha256(b("sample")).digest(),
- hash_func=sha256,
+ hsh=hashlib.sha256(b"sample").digest(),
+ hash_func=hashlib.sha256,
expected=int(
"8fa1f95d514760e498f28957b824ee6ec39ed64826ff4fecc2b5739ec45b91cd",
16,
@@ -1671,8 +1924,8 @@ class RFC6979(unittest.TestCase):
"cca9fbcc1b41e5a95d369eaa6ddcff73b61a4efaa279cfc6567e8daa39cbaf50",
16,
),
- hsh=sha256(b("sample")).digest(),
- hash_func=sha256,
+ hsh=hashlib.sha256(b"sample").digest(),
+ hash_func=hashlib.sha256,
expected=int(
"2df40ca70e639d89528a6b670d9d48d9165fdc0febc0974056bdce192b8e16a3",
16,
@@ -1683,8 +1936,8 @@ class RFC6979(unittest.TestCase):
self._do(
generator=SECP256k1.generator,
secexp=0x1,
- hsh=sha256(b("Satoshi Nakamoto")).digest(),
- hash_func=sha256,
+ hsh=hashlib.sha256(b"Satoshi Nakamoto").digest(),
+ hash_func=hashlib.sha256,
expected=0x8F8A276C19F4149656B280621E358CCE24F5F52542772691EE69063B74F15D15,
)
@@ -1692,12 +1945,10 @@ class RFC6979(unittest.TestCase):
self._do(
generator=SECP256k1.generator,
secexp=0x1,
- hsh=sha256(
- b(
- "All those moments will be lost in time, like tears in rain. Time to die..."
- )
+ hsh=hashlib.sha256(
+ b"All those moments will be lost in time, like tears in rain. Time to die..."
).digest(),
- hash_func=sha256,
+ hash_func=hashlib.sha256,
expected=0x38AA22D72376B4DBC472E06C3BA403EE0A394DA63FC58D88686C611ABA98D6B3,
)
@@ -1705,8 +1956,8 @@ class RFC6979(unittest.TestCase):
self._do(
generator=SECP256k1.generator,
secexp=0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140,
- hsh=sha256(b("Satoshi Nakamoto")).digest(),
- hash_func=sha256,
+ hsh=hashlib.sha256(b"Satoshi Nakamoto").digest(),
+ hash_func=hashlib.sha256,
expected=0x33A19B60E25FB6F4435AF53A3D42D493644827367E6453928554F43E49AA6F90,
)
@@ -1714,8 +1965,8 @@ class RFC6979(unittest.TestCase):
self._do(
generator=SECP256k1.generator,
secexp=0xF8B8AF8CE3C7CCA5E300D33939540C10D45CE001B8F252BFBC57BA0342904181,
- hsh=sha256(b("Alan Turing")).digest(),
- hash_func=sha256,
+ hsh=hashlib.sha256(b"Alan Turing").digest(),
+ hash_func=hashlib.sha256,
expected=0x525A82B70E67874398067543FD84C83D30C175FDC45FDEEE082FE13B1D7CFDF1,
)
@@ -1734,7 +1985,7 @@ class RFC6979(unittest.TestCase):
"AF2BDBE1AA9B6EC1E2ADE1D694F41FC71A831D0268E9891562113D8A62ADD1BF"
)
),
- hash_func=sha256,
+ hash_func=hashlib.sha256,
expected=int("23AF4074C90A02B3FE61D286D5C87F425E6BDD81B", 16),
)
@@ -1742,8 +1993,8 @@ class RFC6979(unittest.TestCase):
self._do(
generator=NIST192p.generator,
secexp=int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16),
- hsh=sha1(b("sample")).digest(),
- hash_func=sha1,
+ hsh=hashlib.sha1(b"sample").digest(),
+ hash_func=hashlib.sha1,
expected=int(
"37D7CA00D2C7B0E5E412AC03BD44BA837FDD5B28CD3B0021", 16
),
@@ -1753,8 +2004,8 @@ class RFC6979(unittest.TestCase):
self._do(
generator=NIST192p.generator,
secexp=int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16),
- hsh=sha256(b("sample")).digest(),
- hash_func=sha256,
+ hsh=hashlib.sha256(b"sample").digest(),
+ hash_func=hashlib.sha256,
expected=int(
"32B1B6D7D42A05CB449065727A84804FB1A3E34D8F261496", 16
),
@@ -1764,8 +2015,8 @@ class RFC6979(unittest.TestCase):
self._do(
generator=NIST192p.generator,
secexp=int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16),
- hsh=sha512(b("sample")).digest(),
- hash_func=sha512,
+ hsh=hashlib.sha512(b"sample").digest(),
+ hash_func=hashlib.sha512,
expected=int(
"A2AC7AB055E4F20692D49209544C203A7D1F2C0BFBC75DB1", 16
),
@@ -1775,8 +2026,8 @@ class RFC6979(unittest.TestCase):
self._do(
generator=NIST192p.generator,
secexp=int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16),
- hsh=sha1(b("test")).digest(),
- hash_func=sha1,
+ hsh=hashlib.sha1(b"test").digest(),
+ hash_func=hashlib.sha1,
expected=int(
"D9CF9C3D3297D3260773A1DA7418DB5537AB8DD93DE7FA25", 16
),
@@ -1786,8 +2037,8 @@ class RFC6979(unittest.TestCase):
self._do(
generator=NIST192p.generator,
secexp=int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16),
- hsh=sha256(b("test")).digest(),
- hash_func=sha256,
+ hsh=hashlib.sha256(b"test").digest(),
+ hash_func=hashlib.sha256,
expected=int(
"5C4CE89CF56D9E7C77C8585339B006B97B5F0680B4306C6C", 16
),
@@ -1797,8 +2048,8 @@ class RFC6979(unittest.TestCase):
self._do(
generator=NIST192p.generator,
secexp=int("6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4", 16),
- hsh=sha512(b("test")).digest(),
- hash_func=sha512,
+ hsh=hashlib.sha512(b"test").digest(),
+ hash_func=hashlib.sha512,
expected=int(
"0758753A5254759C7CFBAD2E2D9B0792EEE44136C9480527", 16
),
@@ -1811,8 +2062,8 @@ class RFC6979(unittest.TestCase):
"0FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538",
16,
),
- hsh=sha1(b("sample")).digest(),
- hash_func=sha1,
+ hsh=hashlib.sha1(b"sample").digest(),
+ hash_func=hashlib.sha1,
expected=int(
"089C071B419E1C2820962321787258469511958E80582E95D8378E0C2CCDB3CB42BEDE42F50E3FA3C71F5A76724281D31D9C89F0F91FC1BE4918DB1C03A5838D0F9",
16,
@@ -1826,8 +2077,8 @@ class RFC6979(unittest.TestCase):
"0FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538",
16,
),
- hsh=sha256(b("sample")).digest(),
- hash_func=sha256,
+ hsh=hashlib.sha256(b"sample").digest(),
+ hash_func=hashlib.sha256,
expected=int(
"0EDF38AFCAAECAB4383358B34D67C9F2216C8382AAEA44A3DAD5FDC9C32575761793FEF24EB0FC276DFC4F6E3EC476752F043CF01415387470BCBD8678ED2C7E1A0",
16,
@@ -1841,8 +2092,8 @@ class RFC6979(unittest.TestCase):
"0FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538",
16,
),
- hsh=sha512(b("test")).digest(),
- hash_func=sha512,
+ hsh=hashlib.sha512(b"test").digest(),
+ hash_func=hashlib.sha512,
expected=int(
"16200813020EC986863BEDFC1B121F605C1215645018AEA1A7B215A564DE9EB1B38A67AA1128B80CE391C4FB71187654AAA3431027BFC7F395766CA988C964DC56D",
16,
@@ -1945,6 +2196,7 @@ class RFC6932(ECDH):
),
)
+ @pytest.mark.slow
def test_brainpoolP384r1(self):
self._do(
curve=curve_brainpoolp384r1,
@@ -1991,6 +2243,7 @@ class RFC6932(ECDH):
),
)
+ @pytest.mark.slow
def test_brainpoolP512r1(self):
self._do(
curve=curve_brainpoolp512r1,
@@ -2095,6 +2348,7 @@ class RFC7027(ECDH):
),
)
+ @pytest.mark.slow
def test_brainpoolP384r1(self):
self._do(
curve=curve_brainpoolp384r1,
@@ -2141,6 +2395,7 @@ class RFC7027(ECDH):
),
)
+ @pytest.mark.slow
def test_brainpoolP512r1(self):
self._do(
curve=curve_brainpoolp512r1,
@@ -2206,7 +2461,7 @@ class RFC7027(ECDH):
"6FC98BD7E50211A4A27102FA3549DF79EBCB4BF246B80945CDDFE7D509BBFD7D",
"9E56F509196784D963D1C0A401510EE7ADA3DCC5DEE04B154BF61AF1D5A6DECE",
b"abc",
- sha256,
+ hashlib.sha256,
"CB28E0999B9C7715FD0A80D8E47A77079716CBBF917DD72E97566EA1C066957C",
"86FA3BB4E26CAD5BF90B7F81899256CE7594BB1EA0C89212748BFF3B3D5B0315",
NIST256p,
@@ -2222,7 +2477,7 @@ class RFC7027(ECDH):
"B4B74E44D71A13D568003D7489908D564C7761E229C58CBFA18950096EB7463B"
"854D7FA992F934D927376285E63414FA",
b"abc",
- sha384,
+ hashlib.sha384,
"FB017B914E29149432D8BAC29A514640B46F53DDAB2C69948084E2930F1C8F7E"
"08E07C9C63F2D21A07DCB56A6AF56EB3",
"B263A1305E057F984D38726A1B46874109F417BCA112674C528262A40A629AF1"
@@ -2244,7 +2499,7 @@ class RFC7027(ECDH):
"373778F9DE6B6497B1EF825FF24F42F9B4A4BD7382CFC3378A540B1B7F0C1B95"
"6C2F",
b"abc",
- sha512,
+ hashlib.sha512,
"0154FD3836AF92D0DCA57DD5341D3053988534FDE8318FC6AAAAB68E2E6F4339"
"B19F2F281A7E0B22C269D93CF8794A9278880ED7DBB8D9362CAEACEE54432055"
"2251",
diff --git a/frozen_deps/ecdsa/test_sha3.py b/frozen_deps/ecdsa/test_sha3.py
index 2c6bd15..d30381d 100644
--- a/frozen_deps/ecdsa/test_sha3.py
+++ b/frozen_deps/ecdsa/test_sha3.py
@@ -8,7 +8,7 @@ try:
from gmpy2 import mpz
GMPY = True
-except ImportError:
+except ImportError: # pragma: no cover
try:
from gmpy import mpz
@@ -43,7 +43,7 @@ class TestBytesToInt(unittest.TestCase):
int_to_bytes(0, byteorder="middle")
[email protected](GMPY == False, reason="requites gmpy or gmpy2")
[email protected](GMPY == False, reason="requires gmpy or gmpy2")
def test_int_to_bytes_with_gmpy():
assert int_to_bytes(mpz(1)) == b"\x01"
diff --git a/frozen_deps/ecdsa/util.py b/frozen_deps/ecdsa/util.py
index 9a56110..639bc0c 100644
--- a/frozen_deps/ecdsa/util.py
+++ b/frozen_deps/ecdsa/util.py
@@ -1,3 +1,16 @@
+"""
+This module includes some utility functions.
+
+The methods most typically used are the sigencode and sigdecode functions
+to be used with :func:`~ecdsa.keys.SigningKey.sign` and
+:func:`~ecdsa.keys.VerifyingKey.verify`
+respectively. See the :func:`sigencode_strings`, :func:`sigdecode_string`,
+:func:`sigencode_der`, :func:`sigencode_strings_canonize`,
+:func:`sigencode_string_canonize`, :func:`sigencode_der_canonize`,
+:func:`sigdecode_strings`, :func:`sigdecode_string`, and
+:func:`sigdecode_der` functions.
+"""
+
from __future__ import division
import os
@@ -5,10 +18,11 @@ import math
import binascii
import sys
from hashlib import sha256
-from six import PY2, int2byte, b, next
+from six import PY2, int2byte, next
from . import der
from ._compat import normalise_bytes
+
# RFC5480:
# The "unrestricted" algorithm identifier is:
# id-ecPublicKey OBJECT IDENTIFIER ::= {
@@ -188,7 +202,7 @@ def randrange_from_seed__trytryagain(seed, order):
bits, bytes, extrabits = bits_and_bytes(order)
generate = PRNG(seed)
while True:
- extrabyte = b("")
+ extrabyte = b""
if extrabits:
extrabyte = int2byte(ord(generate(1)) & lsb_of_ones(extrabits))
guess = string_to_number(extrabyte + generate(bytes)) + 1
@@ -221,12 +235,24 @@ def string_to_number_fixedlen(string, order):
return int(binascii.hexlify(string), 16)
-# these methods are useful for the sigencode= argument to SK.sign() and the
-# sigdecode= argument to VK.verify(), and control how the signature is packed
-# or unpacked.
+def sigencode_strings(r, s, order):
+ """
+ Encode the signature to a pair of strings in a tuple
+
+ Encodes signature into raw encoding (:term:`raw encoding`) with the
+ ``r`` and ``s`` parts of the signature encoded separately.
+ It's expected that this function will be used as a ``sigencode=`` parameter
+ in :func:`ecdsa.keys.SigningKey.sign` method.
-def sigencode_strings(r, s, order):
+ :param int r: first parameter of the signature
+ :param int s: second parameter of the signature
+ :param int order: the order of the curve over which the signature was
+ computed
+
+ :return: raw encoding of ECDSA signature
+ :rtype: tuple(bytes, bytes)
+ """
r_str = number_to_string(r, order)
s_str = number_to_string(s, order)
return (r_str, s_str)
@@ -236,7 +262,7 @@ def sigencode_string(r, s, order):
"""
Encode the signature to raw format (:term:`raw encoding`)
- It's expected that this function will be used as a `sigencode=` parameter
+ It's expected that this function will be used as a ``sigencode=`` parameter
in :func:`ecdsa.keys.SigningKey.sign` method.
:param int r: first parameter of the signature
@@ -264,7 +290,7 @@ def sigencode_der(r, s, order):
s INTEGER
}
- It's expected that this function will be used as a `sigencode=` parameter
+ It's expected that this function will be used as a ``sigencode=`` parameter
in :func:`ecdsa.keys.SigningKey.sign` method.
:param int r: first parameter of the signature
@@ -278,23 +304,83 @@ def sigencode_der(r, s, order):
return der.encode_sequence(der.encode_integer(r), der.encode_integer(s))
-# canonical versions of sigencode methods
-# these enforce low S values, by negating the value (modulo the order) if
-# above order/2 see CECKey::Sign()
-# https://github.com/bitcoin/bitcoin/blob/master/src/key.cpp#L214
def sigencode_strings_canonize(r, s, order):
+ """
+ Encode the signature to a pair of strings in a tuple
+
+ Encodes signature into raw encoding (:term:`raw encoding`) with the
+ ``r`` and ``s`` parts of the signature encoded separately.
+
+ Makes sure that the signature is encoded in the canonical format, where
+ the ``s`` parameter is always smaller than ``order / 2``.
+ Most commonly used in bitcoin.
+
+ It's expected that this function will be used as a ``sigencode=`` parameter
+ in :func:`ecdsa.keys.SigningKey.sign` method.
+
+ :param int r: first parameter of the signature
+ :param int s: second parameter of the signature
+ :param int order: the order of the curve over which the signature was
+ computed
+
+ :return: raw encoding of ECDSA signature
+ :rtype: tuple(bytes, bytes)
+ """
if s > order / 2:
s = order - s
return sigencode_strings(r, s, order)
def sigencode_string_canonize(r, s, order):
+ """
+ Encode the signature to raw format (:term:`raw encoding`)
+
+ Makes sure that the signature is encoded in the canonical format, where
+ the ``s`` parameter is always smaller than ``order / 2``.
+ Most commonly used in bitcoin.
+
+ It's expected that this function will be used as a ``sigencode=`` parameter
+ in :func:`ecdsa.keys.SigningKey.sign` method.
+
+ :param int r: first parameter of the signature
+ :param int s: second parameter of the signature
+ :param int order: the order of the curve over which the signature was
+ computed
+
+ :return: raw encoding of ECDSA signature
+ :rtype: bytes
+ """
if s > order / 2:
s = order - s
return sigencode_string(r, s, order)
def sigencode_der_canonize(r, s, order):
+ """
+ Encode the signature into the ECDSA-Sig-Value structure using :term:`DER`.
+
+ Makes sure that the signature is encoded in the canonical format, where
+ the ``s`` parameter is always smaller than ``order / 2``.
+ Most commonly used in bitcoin.
+
+ Encodes the signature to the following :term:`ASN.1` structure::
+
+ Ecdsa-Sig-Value ::= SEQUENCE {
+ r INTEGER,
+ s INTEGER
+ }
+
+ It's expected that this function will be used as a ``sigencode=`` parameter
+ in :func:`ecdsa.keys.SigningKey.sign` method.
+
+ :param int r: first parameter of the signature
+ :param int s: second parameter of the signature
+ :param int order: the order of the curve over which the signature was
+ computed
+
+ :return: DER encoding of ECDSA signature
+ :rtype: bytes
+ """
if s > order / 2:
s = order - s
return sigencode_der(r, s, order)
@@ -321,7 +407,7 @@ def sigdecode_string(signature, order):
the signature, with each encoded using the same amount of bytes depending
on curve size/order.
- It's expected that this function will be used as the `sigdecode=`
+ It's expected that this function will be used as the ``sigdecode=``
parameter to the :func:`ecdsa.keys.VerifyingKey.verify` method.
:param signature: encoded signature
@@ -331,7 +417,7 @@ def sigdecode_string(signature, order):
:raises MalformedSignature: when the encoding of the signature is invalid
- :return: tuple with decoded 'r' and 's' values of signature
+ :return: tuple with decoded ``r`` and ``s`` values of signature
:rtype: tuple of ints
"""
signature = normalise_bytes(signature)
@@ -350,10 +436,10 @@ def sigdecode_strings(rs_strings, order):
"""
Decode the signature from two strings.
- First string needs to be a big endian encoding of 'r', second needs to
- be a big endian encoding of the 's' parameter of an ECDSA signature.
+ First string needs to be a big endian encoding of ``r``, second needs to
+ be a big endian encoding of the ``s`` parameter of an ECDSA signature.
- It's expected that this function will be used as the `sigdecode=`
+ It's expected that this function will be used as the ``sigdecode=``
parameter to the :func:`ecdsa.keys.VerifyingKey.verify` method.
:param list rs_strings: list of two bytes-like objects, each encoding one
@@ -362,7 +448,7 @@ def sigdecode_strings(rs_strings, order):
:raises MalformedSignature: when the encoding of the signature is invalid
- :return: tuple with decoded 'r' and 's' values of signature
+ :return: tuple with decoded ``r`` and ``s`` values of signature
:rtype: tuple of ints
"""
if not len(rs_strings) == 2:
@@ -404,7 +490,7 @@ def sigdecode_der(sig_der, order):
s INTEGER
}
- It's expected that this function will be used as as the `sigdecode=`
+ It's expected that this function will be used as as the ``sigdecode=``
parameter to the :func:`ecdsa.keys.VerifyingKey.verify` method.
:param sig_der: encoded signature
@@ -414,7 +500,7 @@ def sigdecode_der(sig_der, order):
:raises UnexpectedDER: when the encoding of signature is invalid
- :return: tuple with decoded 'r' and 's' values of signature
+ :return: tuple with decoded ``r`` and ``s`` values of signature
:rtype: tuple of ints
"""
sig_der = normalise_bytes(sig_der)
diff --git a/frozen_deps/keytree.py-0.2-py3.9.egg-info/PKG-INFO b/frozen_deps/keytree.py-0.2-py3.9.egg-info/PKG-INFO
deleted file mode 100644
index c7e2d6d..0000000
--- a/frozen_deps/keytree.py-0.2-py3.9.egg-info/PKG-INFO
+++ /dev/null
@@ -1,10 +0,0 @@
-Metadata-Version: 1.0
-Name: keytree.py
-Version: 0.2
-Summary: Derive BIP32 key pairs from BIP39 mnemonic
-Home-page: http://github.com/Determinant/keytree.py
-Author: Ted Yin
-Author-email: [email protected]
-License: MIT
-Description: UNKNOWN
-Platform: UNKNOWN
diff --git a/frozen_deps/keytree.py-0.2-py3.9.egg-info/SOURCES.txt b/frozen_deps/keytree.py-0.2-py3.9.egg-info/SOURCES.txt
deleted file mode 100644
index d4728c7..0000000
--- a/frozen_deps/keytree.py-0.2-py3.9.egg-info/SOURCES.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-README.rst
-bech32.py
-keytree.py
-setup.py
-keytree.py.egg-info/PKG-INFO
-keytree.py.egg-info/SOURCES.txt
-keytree.py.egg-info/dependency_links.txt
-keytree.py.egg-info/requires.txt
-keytree.py.egg-info/top_level.txt \ No newline at end of file
diff --git a/frozen_deps/keytree.py-0.2-py3.9.egg-info/dependency_links.txt b/frozen_deps/keytree.py-0.2-py3.9.egg-info/dependency_links.txt
deleted file mode 100644
index 8b13789..0000000
--- a/frozen_deps/keytree.py-0.2-py3.9.egg-info/dependency_links.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/frozen_deps/keytree.py-0.2-py3.9.egg-info/installed-files.txt b/frozen_deps/keytree.py-0.2-py3.9.egg-info/installed-files.txt
deleted file mode 100644
index 143b9e8..0000000
--- a/frozen_deps/keytree.py-0.2-py3.9.egg-info/installed-files.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-../../../bin/keytree.py
-../__pycache__/bech32.cpython-39.pyc
-../bech32.py
-PKG-INFO
-SOURCES.txt
-dependency_links.txt
-requires.txt
-top_level.txt
diff --git a/frozen_deps/keytree.py-0.2-py3.9.egg-info/requires.txt b/frozen_deps/keytree.py-0.2-py3.9.egg-info/requires.txt
deleted file mode 100644
index 72fb65a..0000000
--- a/frozen_deps/keytree.py-0.2-py3.9.egg-info/requires.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-ecdsa
-base58
-pysha3
-pycryptodomex
-mnemonic
diff --git a/frozen_deps/keytree.py-0.2-py3.9.egg-info/top_level.txt b/frozen_deps/keytree.py-0.2-py3.9.egg-info/top_level.txt
deleted file mode 100644
index e5e2a6a..0000000
--- a/frozen_deps/keytree.py-0.2-py3.9.egg-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-bech32
diff --git a/frozen_deps/keytree.py-0.2.dist-info/INSTALLER b/frozen_deps/keytree.py-0.2.dist-info/INSTALLER
deleted file mode 100644
index a1b589e..0000000
--- a/frozen_deps/keytree.py-0.2.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/frozen_deps/keytree.py-0.2.dist-info/METADATA b/frozen_deps/keytree.py-0.2.dist-info/METADATA
deleted file mode 100644
index 880f6b3..0000000
--- a/frozen_deps/keytree.py-0.2.dist-info/METADATA
+++ /dev/null
@@ -1,14 +0,0 @@
-Metadata-Version: 2.1
-Name: keytree.py
-Version: 0.2
-Summary: Derive BIP32 key pairs from BIP39 mnemonic
-Home-page: http://github.com/Determinant/keytree.py
-Author: Ted Yin
-Author-email: [email protected]
-License: MIT
-Requires-Dist: ecdsa
-Requires-Dist: base58
-Requires-Dist: pysha3
-Requires-Dist: pycryptodomex
-Requires-Dist: mnemonic
-
diff --git a/frozen_deps/keytree.py-0.2.dist-info/RECORD b/frozen_deps/keytree.py-0.2.dist-info/RECORD
deleted file mode 100644
index e4d5ef6..0000000
--- a/frozen_deps/keytree.py-0.2.dist-info/RECORD
+++ /dev/null
@@ -1,11 +0,0 @@
-../../bin/__pycache__/keytree.cpython-310.pyc,,
-../../bin/keytree.py,sha256=wcn6oUNgFzfpIot7tCRVjrblmDcGGAX4MkF9xHM4-yU,16467
-__pycache__/bech32.cpython-310.pyc,,
-bech32.py,sha256=QZdU7nY1UUzeYfV-5ASwhe3PA3YVVnClyGGrtgJIjsE,4376
-keytree.py-0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-keytree.py-0.2.dist-info/METADATA,sha256=jp3ESWEdzOw82fECFY9_0qWHwmvYuDwVy9uv0l28o7k,340
-keytree.py-0.2.dist-info/RECORD,,
-keytree.py-0.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-keytree.py-0.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
-keytree.py-0.2.dist-info/direct_url.json,sha256=appPoRbvitJQonSqtARctmTb0amTShpFDmrPTT5LEQM,79
-keytree.py-0.2.dist-info/top_level.txt,sha256=oESACl4kH99axdjvTQuJATlgqujLpRc8iCwiqjvbI8M,7
diff --git a/frozen_deps/keytree.py-0.2.dist-info/REQUESTED b/frozen_deps/keytree.py-0.2.dist-info/REQUESTED
deleted file mode 100644
index e69de29..0000000
--- a/frozen_deps/keytree.py-0.2.dist-info/REQUESTED
+++ /dev/null
diff --git a/frozen_deps/keytree.py-0.2.dist-info/WHEEL b/frozen_deps/keytree.py-0.2.dist-info/WHEEL
deleted file mode 100644
index becc9a6..0000000
--- a/frozen_deps/keytree.py-0.2.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.37.1)
-Root-Is-Purelib: true
-Tag: py3-none-any
-
diff --git a/frozen_deps/keytree.py-0.2.dist-info/direct_url.json b/frozen_deps/keytree.py-0.2.dist-info/direct_url.json
deleted file mode 100644
index 78f25ff..0000000
--- a/frozen_deps/keytree.py-0.2.dist-info/direct_url.json
+++ /dev/null
@@ -1 +0,0 @@
-{"dir_info": {}, "url": "file:///home/ymf/work/archive/2020_summer/keytree.py"} \ No newline at end of file
diff --git a/frozen_deps/keytree.py-0.2.dist-info/top_level.txt b/frozen_deps/keytree.py-0.2.dist-info/top_level.txt
deleted file mode 100644
index e5e2a6a..0000000
--- a/frozen_deps/keytree.py-0.2.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-bech32
diff --git a/frozen_deps/pycryptodomex-3.15.0.dist-info/AUTHORS.rst b/frozen_deps/pycryptodomex-3.15.0.dist-info/AUTHORS.rst
deleted file mode 100644
index 79adf3c..0000000
--- a/frozen_deps/pycryptodomex-3.15.0.dist-info/AUTHORS.rst
+++ /dev/null
@@ -1,50 +0,0 @@
-Simon Arneaud
-Nevins Bartolomeo
-Thorsten E. Behrens
-Tim Berners-Lee
-Frédéric Bertolus
-Ian Bicking
-Joris Bontje
-Antoon Bosselaers
-Andrea Bottoni
-Jean-Paul Calderone
-Sergey Chernov
-Geremy Condra
-Jan Dittberner
-Andrew Eland
-Philippe Frycia
-Peter Gutmann
-Hirendra Hindocha
-Nikhil Jhingan
-Sebastian Kayser
-Ryan Kelly
-Andrew M. Kuchling
-Piers Lauder
-Legrandin
-M.-A. Lemburg
-Wim Lewis
-Darsey C. Litzenberger
-Richard Mitchell
-Mark Moraes
-Lim Chee Siang
-Bryan Olson
-Wallace Owen
-Colin Plumb
-Robey Pointer
-Lorenz Quack
-Sebastian Ramacher
-Jeethu Rao
-James P. Rutledge
-Matt Schreiner
-Peter Simmons
-Janne Snabb
-Tom St. Denis
-Anders Sundman
-Paul Swartz
-Fabrizio Tarizzo
-Kevin M. Turner
-Barry A. Warsaw
-Eric Young
-Hannes van Niekerk
-Stefan Seering
-Koki Takahashi
diff --git a/frozen_deps/pycryptodomex-3.15.0.dist-info/INSTALLER b/frozen_deps/pycryptodomex-3.15.0.dist-info/INSTALLER
deleted file mode 100644
index a1b589e..0000000
--- a/frozen_deps/pycryptodomex-3.15.0.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/frozen_deps/pycryptodomex-3.15.0.dist-info/LICENSE.rst b/frozen_deps/pycryptodomex-3.15.0.dist-info/LICENSE.rst
deleted file mode 100644
index 3008ff7..0000000
--- a/frozen_deps/pycryptodomex-3.15.0.dist-info/LICENSE.rst
+++ /dev/null
@@ -1,61 +0,0 @@
-The source code in PyCryptodome is partially in the public domain
-and partially released under the BSD 2-Clause license.
-
-In either case, there are minimal if no restrictions on the redistribution,
-modification and usage of the software.
-
-Public domain
-=============
-
-All code originating from PyCrypto is free and unencumbered software
-released into the public domain.
-
-Anyone is free to copy, modify, publish, use, compile, sell, or
-distribute this software, either in source code form or as a compiled
-binary, for any purpose, commercial or non-commercial, and by any
-means.
-
-In jurisdictions that recognize copyright laws, the author or authors
-of this software dedicate any and all copyright interest in the
-software to the public domain. We make this dedication for the benefit
-of the public at large and to the detriment of our heirs and
-successors. We intend this dedication to be an overt act of
-relinquishment in perpetuity of all present and future rights to this
-software under copyright law.
-
-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 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.
-
-For more information, please refer to <http://unlicense.org>
-
-BSD license
-===========
-
-All direct contributions to PyCryptodome are released under the following
-license. The copyright of each piece belongs to the respective author.
-
-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.
diff --git a/frozen_deps/pycryptodomex-3.15.0.dist-info/METADATA b/frozen_deps/pycryptodomex-3.15.0.dist-info/METADATA
deleted file mode 100644
index 8e2c564..0000000
--- a/frozen_deps/pycryptodomex-3.15.0.dist-info/METADATA
+++ /dev/null
@@ -1,84 +0,0 @@
-Metadata-Version: 2.1
-Name: pycryptodomex
-Version: 3.15.0
-Summary: Cryptographic library for Python
-Home-page: https://www.pycryptodome.org
-Author: Helder Eijs
-Author-email: [email protected]
-License: BSD, Public Domain
-Project-URL: Source, https://github.com/Legrandin/pycryptodome/
-Platform: Posix; MacOS X; Windows
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: License :: OSI Approved :: BSD License
-Classifier: License :: OSI Approved :: Apache Software License
-Classifier: License :: Public Domain
-Classifier: Intended Audience :: Developers
-Classifier: Operating System :: Unix
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Topic :: Security :: Cryptography
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
-Classifier: Programming Language :: Python :: 3.10
-Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*
-
-
-PyCryptodome
-============
-
-PyCryptodome is a self-contained Python package of low-level
-cryptographic primitives.
-
-It supports Python 2.7, Python 3.5 and newer, and PyPy.
-
-You can install it with::
-
- pip install pycryptodomex
-
-All modules are installed under the ``Cryptodome`` package.
-
-Check the pycryptodome_ project for the equivalent library that
-works under the ``Crypto`` package.
-
-PyCryptodome is a fork of PyCrypto. It brings several enhancements
-with respect to the last official version of PyCrypto (2.6.1),
-for instance:
-
-* Authenticated encryption modes (GCM, CCM, EAX, SIV, OCB)
-* Accelerated AES on Intel platforms via AES-NI
-* First class support for PyPy
-* Elliptic curves cryptography (NIST P-curves; Ed25519, Ed448)
-* Better and more compact API (`nonce` and `iv` attributes for ciphers,
- automatic generation of random nonces and IVs, simplified CTR cipher mode,
- and more)
-* SHA-3 (including SHAKE XOFs) and BLAKE2 hash algorithms
-* Salsa20 and ChaCha20 stream ciphers
-* scrypt and HKDF
-* Deterministic (EC)DSA and EdDSA
-* Password-protected PKCS#8 key containers
-* Shamir's Secret Sharing scheme
-* Random numbers get sourced directly from the OS (and not from a CSPRNG in userspace)
-* Simplified install process, including better support for Windows
-* Cleaner RSA and DSA key generation (largely based on FIPS 186-4)
-* Major clean ups and simplification of the code base
-
-PyCryptodome is not a wrapper to a separate C library like *OpenSSL*.
-To the largest possible extent, algorithms are implemented in pure Python.
-Only the pieces that are extremely critical to performance (e.g. block ciphers)
-are implemented as C extensions.
-
-For more information, see the `homepage`_.
-
-All the code can be downloaded from `GitHub`_.
-
-.. _pycryptodome: https://pypi.python.org/pypi/pycryptodome
-.. _`homepage`: http://www.pycryptodome.org
-.. _GitHub: https://github.com/Legrandin/pycryptodome
-
-
diff --git a/frozen_deps/pycryptodomex-3.15.0.dist-info/RECORD b/frozen_deps/pycryptodomex-3.15.0.dist-info/RECORD
deleted file mode 100644
index a8a2698..0000000
--- a/frozen_deps/pycryptodomex-3.15.0.dist-info/RECORD
+++ /dev/null
@@ -1,512 +0,0 @@
-Cryptodome/Cipher/AES.py,sha256=0psUOUf5OlLbARevPPEtHCPS6voEf6g2DszHOREhMtU,9553
-Cryptodome/Cipher/AES.pyi,sha256=3ahEn43wmFv37xdmnlibzjWOmRAgSSeiFToFMIoLVUk,1387
-Cryptodome/Cipher/ARC2.py,sha256=NwO42KWBpuTXS5Thx0gsDRmxyrvfiudx7PKed1KR0CI,7026
-Cryptodome/Cipher/ARC2.pyi,sha256=zgMfUY35w1AuEi0apkFuHo_NQOfzsCxuZ9gN1s3oAhg,982
-Cryptodome/Cipher/ARC4.py,sha256=x_8L_KA_pDkoeIOSCQZyVPwhD3na4-xShkPkeNRka58,5168
-Cryptodome/Cipher/ARC4.pyi,sha256=sMw73yZHeonmGx9BhiyA7__4PQJocU04SMRcDjnyJ2Y,431
-Cryptodome/Cipher/Blowfish.py,sha256=K5hF6nb2r8FsHhgLX2irdyUMqg4PCwrAgu68NNhU1ag,5976
-Cryptodome/Cipher/Blowfish.pyi,sha256=kDooazMxY1973SMtPuhNJ9f68PS4cNWynyYa7CoWC48,1018
-Cryptodome/Cipher/CAST.py,sha256=3XDjtVBsia2kPvducB19_FEc3zM7hSK8JKKmK-b8cvU,6087
-Cryptodome/Cipher/CAST.pyi,sha256=XgVk9wOv_V77LbQmm24O2R-PDss8JiHfw11karavKCI,983
-Cryptodome/Cipher/ChaCha20.py,sha256=vs7UgkZyHritK0lXGqUMDpqxFkxGgIzcTqeMYAj1bpM,10780
-Cryptodome/Cipher/ChaCha20.pyi,sha256=_l1xhtOyBmYEHP7Ftmk8EQZpKegX9p3N5tckC_PPve0,762
-Cryptodome/Cipher/ChaCha20_Poly1305.py,sha256=W0tOmBkoNzfwtwgPG9Tw0dUm3sZ8IVhnehTbAc2jRt4,11561
-Cryptodome/Cipher/ChaCha20_Poly1305.pyi,sha256=h1U5ixODzM9NwLpX9oaIJdeQ0ubYeDeY9m6ur05dKCc,1068
-Cryptodome/Cipher/DES.py,sha256=ebgHOqNGjCYlIoFh3W5KXY17aQnvckjhQC9TPEKqPuY,5963
-Cryptodome/Cipher/DES.pyi,sha256=thNZATxZ0Q-vOh_V7QVZu6J_ESvr9mcA67WlQV_nP1A,963
-Cryptodome/Cipher/DES3.py,sha256=qmIagOLhMGG221sC7BAH9xe5lnxk2iyilbeYoC3it4c,6941
-Cryptodome/Cipher/DES3.pyi,sha256=arv4Uhv7lSgAL36B_Vx5DL-s_18Kc9_TejNxftMp4H4,1033
-Cryptodome/Cipher/PKCS1_OAEP.py,sha256=-FrP1ZsCGmi-BizJdTSxFu6Q3np-WT2dB-OHW2l_pxo,8883
-Cryptodome/Cipher/PKCS1_OAEP.pyi,sha256=XRZ5_0v8w2LUYD04Gz3Ekey9PxYBZJnUl-0rVv2q_gY,1183
-Cryptodome/Cipher/PKCS1_v1_5.py,sha256=H3RBr3v8fE3Tev63KfNXWVlNFHvZwnBwtAinSXKLYfY,8173
-Cryptodome/Cipher/PKCS1_v1_5.pyi,sha256=frCjzmSJrlPVp-Z0P_Eef9yYSfBNZXfejxv-017G6Jo,690
-Cryptodome/Cipher/Salsa20.py,sha256=SuzaYhBc_Q7voODDmQ2rCzILndPpmF1n6qitDMmk7no,6369
-Cryptodome/Cipher/Salsa20.pyi,sha256=4vjq_HN8NK7U9VdaaHIgs17-fyW8SRPDZaHy3jKVkto,744
-Cryptodome/Cipher/_ARC4.abi3.so,sha256=EIiTtbeekCNX8Yf88U_Z4IsCGk1KjNuEqCNBTjLGfGM,13768
-Cryptodome/Cipher/_EKSBlowfish.py,sha256=fi6TEeN0bXcznFkyLzsaoLxNmu9iPT-Tmp3CLvJsE0A,5217
-Cryptodome/Cipher/_EKSBlowfish.pyi,sha256=6JhAXsSVbJMYlcudpNwSNEDB9X5NjhfRGPzZvcOc_As,270
-Cryptodome/Cipher/_Salsa20.abi3.so,sha256=VFwPkXZoqkHXwSMyzXBQ-ZWaoteY5pdiwk3GK2KDTrM,26784
-Cryptodome/Cipher/__init__.py,sha256=Cdau3A_ZsmqOFM8yK4Q2C_hFeV2xjd9_fU812_ferXM,2888
-Cryptodome/Cipher/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-Cryptodome/Cipher/__pycache__/AES.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/ARC2.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/ARC4.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/Blowfish.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/CAST.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/ChaCha20.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/ChaCha20_Poly1305.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/DES.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/DES3.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/PKCS1_OAEP.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/PKCS1_v1_5.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/Salsa20.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/_EKSBlowfish.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_cbc.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_ccm.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_cfb.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_ctr.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_eax.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_ecb.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_gcm.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_ocb.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_ofb.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_openpgp.cpython-310.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_siv.cpython-310.pyc,,
-Cryptodome/Cipher/_chacha20.abi3.so,sha256=EZOsXRmosJzfx2bXftuYvZQNwZ8Bfz_7sNwzDA178yo,28224
-Cryptodome/Cipher/_mode_cbc.py,sha256=cDaa-zgNIbosLHJhwsDtt7YOTE-jzRUi4ODfj95SBsM,10971
-Cryptodome/Cipher/_mode_cbc.pyi,sha256=qH5pEQNuefabeRV-Xz-6AA953MFd_Z20zGeBTwa6t0s,691
-Cryptodome/Cipher/_mode_ccm.py,sha256=zqq91jARvmdPXs58u0uCP-D8ctzsg65Lf8nW9VQYezs,24476
-Cryptodome/Cipher/_mode_ccm.pyi,sha256=ZSs4SOlivIG_JUxknDjQKs4ZYGmkwAO7K2DKcbz_14M,1600
-Cryptodome/Cipher/_mode_cfb.py,sha256=lfIeHxJmyqmBWk84d4z9030OooTSBX1gfaVIaRqIPyE,10821
-Cryptodome/Cipher/_mode_cfb.pyi,sha256=PM0slBBfWdA4Ec0JjM-OJheiZkCFPWAADvLsvKpDRCY,731
-Cryptodome/Cipher/_mode_ctr.py,sha256=vEEFc9kj3_m9cdUjI23V_vxTHtGJVpA35qkfphDKx9M,15870
-Cryptodome/Cipher/_mode_ctr.pyi,sha256=UcZ1zOZlVnTSlka9R1yFo7kaDhreiLKCe7AU05AcAuI,804
-Cryptodome/Cipher/_mode_eax.py,sha256=XXOc-GKbZ2hRagr5I5FihKWaGh8hXP1Si2kY3D85-ls,14543
-Cryptodome/Cipher/_mode_eax.pyi,sha256=VHPtTdA-2btCvRE-4npRtGCrApg7rBNWpHSZV1po8J0,1545
-Cryptodome/Cipher/_mode_ecb.py,sha256=2ciIC6I7cXgGDZW9wdkJ_UKAcxsrHHcv7jzVreLeDqE,8321
-Cryptodome/Cipher/_mode_ecb.pyi,sha256=PgzUPsVY2DRM72wM-h74vCiceNF_yeaBxOA6bt_ZfmA,596
-Cryptodome/Cipher/_mode_gcm.py,sha256=oAOWTQ1qynOv7BfuueXokEF1TghERzKOXEgHKMj50wg,21402
-Cryptodome/Cipher/_mode_gcm.pyi,sha256=5t72QHQS0gDq6wtzYfaVqTxmjBzpUvsQvDaP2DqNvLE,1541
-Cryptodome/Cipher/_mode_ocb.py,sha256=QeHiPunUGWKt4iG8A50xgWV9b3C7qW0uwJPRcta5bC8,19838
-Cryptodome/Cipher/_mode_ocb.pyi,sha256=SXMUa1s1dY-272lktxSOtyOoqLdtPvfNkRXqmXjBE4o,1231
-Cryptodome/Cipher/_mode_ofb.py,sha256=sXdbumASGN-K7ps89z7c-knnMnnYtuO97X7y-VYZvyA,10301
-Cryptodome/Cipher/_mode_ofb.pyi,sha256=mPIZ2e_X-URk-8LBNiZyacfcS3Ei1vgT8YlhyI-0C8k,695
-Cryptodome/Cipher/_mode_openpgp.py,sha256=whIc90qioqxMiL2RCys5-XwfDntDneVYJx4Br6X3zD4,7061
-Cryptodome/Cipher/_mode_openpgp.pyi,sha256=FoLrFqnvxJf0F_npHOgPURfUyGSt6DxyIp2ikoXi-CI,556
-Cryptodome/Cipher/_mode_siv.py,sha256=nRqGJBjqxmKikUpVBLgMN3TGwg2f3boCNtUtGcn9uEU,14094
-Cryptodome/Cipher/_mode_siv.pyi,sha256=syb3kXnyuhoQV6FXvozIjudWCQBCadOb1I2BuV-6Ai0,1261
-Cryptodome/Cipher/_pkcs1_decode.abi3.so,sha256=Gs7MlHLXtYS9vJwtYP9C_SFgixaj3lh_Zh0z1_HPq0I,28096
-Cryptodome/Cipher/_raw_aes.abi3.so,sha256=5O73otJZh11nJmZiDz8NHBOt_6D47Y2k3CYPEYFrz2M,66256
-Cryptodome/Cipher/_raw_aesni.abi3.so,sha256=AO0rOdUByVCWcLCTBh6IuKQbJAC0q8J8WlsR8cMyHPY,101136
-Cryptodome/Cipher/_raw_arc2.abi3.so,sha256=oy1fxEbBQ5iS9QSDAU5ytB8GMq15XTEEIlS_dkXalic,43776
-Cryptodome/Cipher/_raw_blowfish.abi3.so,sha256=cFJp3WClitn38q5Rd-iifcdNTLh-70jQUOwIkgNC2SI,69976
-Cryptodome/Cipher/_raw_cast.abi3.so,sha256=CNaYLRpqkaAj32xIgWHjPih9zgadaBhn8PG-4NKoHDA,42976
-Cryptodome/Cipher/_raw_cbc.abi3.so,sha256=cYJR9e74bnOiwDVFVz3rlVsDcHkl3dyCXauU9htkP_c,20736
-Cryptodome/Cipher/_raw_cfb.abi3.so,sha256=wKD1yOzB3q0mH3zuCu03yYyi5R30ElNXanKCZC_OVpA,25440
-Cryptodome/Cipher/_raw_ctr.abi3.so,sha256=cEjMcn97VwcErB4Wl2GpSgSsd0E5ip0DDIY10c_6qxs,28600
-Cryptodome/Cipher/_raw_des.abi3.so,sha256=zMDcDJtZEHcJ7binMxMuPik4jdUqIbFHTJ8v-gjdVJ8,75672
-Cryptodome/Cipher/_raw_des3.abi3.so,sha256=PXX7XjQTsvfKVWAwAKOLS0Lgphf8rJ-pdFZWRdYl4vg,76480
-Cryptodome/Cipher/_raw_ecb.abi3.so,sha256=DpU9hHt2cIK1sHBO6pfEarydsoygj8mW2EhpBCxMGuw,12440
-Cryptodome/Cipher/_raw_eksblowfish.abi3.so,sha256=WKkPH_kO_ekcYtHIOsLoSGkRFP2ipkj5MUbuW2IQ3Po,166264
-Cryptodome/Cipher/_raw_ocb.abi3.so,sha256=qN5BJM7CWH_JGcLM76corvlAPN1qwx9dAQlXJxgTBHo,37344
-Cryptodome/Cipher/_raw_ofb.abi3.so,sha256=4uEWvDqWhRqHYaxSl0AylXzZpOroiwzBdb2FvruL844,15368
-Cryptodome/Hash/BLAKE2b.py,sha256=WEV8u2cm18T_j9BwjCDPaSJ6AappqpwO1u7mHG6Sgnk,9440
-Cryptodome/Hash/BLAKE2b.pyi,sha256=U4K3mapdYeHVHrlIEgffKV9IfALVbqkOrVbJRujns10,906
-Cryptodome/Hash/BLAKE2s.py,sha256=uBxYbWDZleCmsOvSEmVRXPywTS2TM-qq3oyN4FJp68c,9446
-Cryptodome/Hash/BLAKE2s.pyi,sha256=9jsL4jLQq5_Mb8WM99LPurH1D-FL-gLAeZyBf8QiWt0,739
-Cryptodome/Hash/CMAC.py,sha256=jS4K2sJENptd8U95nUkOo_xIZPB-n-3xhXDIHDDIxsw,10379
-Cryptodome/Hash/CMAC.pyi,sha256=kZXAeUzxQ38nY-aYbIPrZZmROxgja2HnvUz7xuAXuoE,822
-Cryptodome/Hash/HMAC.py,sha256=4OfX8pS1b3a2nGF_yLNk6kh8_WjIGU75GP1nJzAWpmc,7048
-Cryptodome/Hash/HMAC.pyi,sha256=fAyHBEf5Ee6LoiYYTZ9PZpmIRvitU6OriKGfjFUM_4c,624
-Cryptodome/Hash/KMAC128.py,sha256=EuMneuZPXmX3sbCpN9ciVQyVa7p0OaaZg2bpQTif5-g,5957
-Cryptodome/Hash/KMAC128.pyi,sha256=CHcjiaNKjvWQgLXsawb3Vxttxmt_hVK-Dv-5RVs6oOE,903
-Cryptodome/Hash/KMAC256.py,sha256=F6GaAt4qtEiDgKxczWyrXROVFQaLQ2fee3vqs1uxjqo,2910
-Cryptodome/Hash/KMAC256.pyi,sha256=oAeKgyta2iqjV9Yv818xoW5eJ2ixeLP4joUP8XUi2e0,226
-Cryptodome/Hash/KangarooTwelve.py,sha256=VudGHs0siJcBTH1iP_yXaDglCcC-S2mWM-pQjenFDhA,9041
-Cryptodome/Hash/KangarooTwelve.pyi,sha256=shf_g18EQxoJ8O9Kzuah17jw6J-vzmMsuqz1mAUY5WE,572
-Cryptodome/Hash/MD2.py,sha256=mfucNRXYIj8iOXGKEXGN4TIwyHHhIglb2ScSowyg5tc,6123
-Cryptodome/Hash/MD2.pyi,sha256=wa7GSYUpzL27so4YgiJEZo0dO201KyHK87Q20Pvm-bM,492
-Cryptodome/Hash/MD4.py,sha256=FSGY7k8rYayR6PE0hNpICRTa1uNiISVxixIpaC28zzg,6598
-Cryptodome/Hash/MD4.pyi,sha256=7ZtZQEgJCwIswneb0NBov_uL0_Toglh9EPMnLVFGqwo,532
-Cryptodome/Hash/MD5.py,sha256=Cd5wtZ4OBW-O7tvebvObsay_jI6tRtoUfIfkbE0aqMQ,6630
-Cryptodome/Hash/MD5.pyi,sha256=c4MCJHvYTi2YL4hmqEu9ivbSvkBJdR-S2ldUqEpzK8s,492
-Cryptodome/Hash/Poly1305.py,sha256=xESe_sBaJg7jBJE88_S3jWU0uIu8l18NaQjmol_uIeA,8106
-Cryptodome/Hash/Poly1305.pyi,sha256=TSGottirLPIRyivSjZucQB7aPaYfhrUkn8oot6OrmmU,665
-Cryptodome/Hash/RIPEMD.py,sha256=0oRaGuKcTUVTfBZXZm5NZLQAvyPbAhjBpgzN5Kf2a6g,1211
-Cryptodome/Hash/RIPEMD.pyi,sha256=-DzZk9OtiAZE-E2_PCyFz4pHQ3RouoLlUo3Neabf3Sc,98
-Cryptodome/Hash/RIPEMD160.py,sha256=GYDiBSw_D7SCOPA80i3l3mjZsPvmmhZSVVENKwkUs_k,6410
-Cryptodome/Hash/RIPEMD160.pyi,sha256=RQ9yXxjH1BSaU3mwhsCn9-67C0a_Bcv3MDdafQCiuPs,516
-Cryptodome/Hash/SHA.py,sha256=1-O3GFKbm1ht2jV7M9pdKu6GpACsCSnARPHllFcFTAo,1156
-Cryptodome/Hash/SHA.pyi,sha256=RJHp4vuV_19StgE4qxlnIfDltgFjx-L9q6H0tjh-Rk0,169
-Cryptodome/Hash/SHA1.py,sha256=oyz9PdGgaVa90S6O1NPhe7OPq7AvDbJIsH6pICDpTN4,6702
-Cryptodome/Hash/SHA1.pyi,sha256=vNtB_b4MytJq8Io1xufdOO6VL-nMBcCnDPIgJQuNPCM,536
-Cryptodome/Hash/SHA224.py,sha256=RQ3ECOkVJsnh2a5fCPL7Aienpi22lcpsuRNUypkWfBs,6913
-Cryptodome/Hash/SHA224.pyi,sha256=8RsbyIwIfO8Fc_fpWw1MnFw04Z4n-qL0G01qCQZwvx8,544
-Cryptodome/Hash/SHA256.py,sha256=2fhVNPGKrifj49B0ExaxrMCubtDTcQiHarrzN0JPVUA,6909
-Cryptodome/Hash/SHA256.pyi,sha256=zndNEjv6DZOWaOpuoUKsA2hTi2J7-oJFgOQ10sSRnXE,612
-Cryptodome/Hash/SHA384.py,sha256=aDu5NdDbICyrSt2sj0N4fIWwGurEu08WYB5mMiqfW7g,6911
-Cryptodome/Hash/SHA384.pyi,sha256=KIWbD-lBbd7lvWgFquIqUAMaisovey0HV0Nmmq-pvOY,544
-Cryptodome/Hash/SHA3_224.py,sha256=QMB4LKdsBwHios4BZpd5pZB4ARDAv-8_m6iefFERH9I,6191
-Cryptodome/Hash/SHA3_224.pyi,sha256=YNvN-GxVpPK6_-ee0_n-7wgAhq7JzBaBaeGiNdVoQdk,605
-Cryptodome/Hash/SHA3_256.py,sha256=2dt3EToYFzCfB-SLXxLAf6GfeCN31EFoGxUZUudJi74,6191
-Cryptodome/Hash/SHA3_256.pyi,sha256=JlPOiVtEVNJerGWRuBDunXBT19WX_6ObpUuMaX7QdEs,605
-Cryptodome/Hash/SHA3_384.py,sha256=kSg7aQ8Lv4-jfDGplQ31WCTRWqCb_K8X7AOtO5looXM,6286
-Cryptodome/Hash/SHA3_384.pyi,sha256=c3wb0c6RjlcMcK22mV4RZWsDmUA2NszaghLAXIrN8T8,605
-Cryptodome/Hash/SHA3_512.py,sha256=FPtL81mBU7Gi1ije5M2EXwCPj598AoSOyKRrri4GTPU,6143
-Cryptodome/Hash/SHA3_512.pyi,sha256=bZ0WozTD_mQ_5t_z4SWCpCn61YhCVamF501jsQdUjps,605
-Cryptodome/Hash/SHA512.py,sha256=rmSnd1Rka2NCImO0e-suLbzAF9EEXrY1ipnnS8RlG-Q,7732
-Cryptodome/Hash/SHA512.pyi,sha256=VfMzHx-0U4efCyZCrgs_aOz17W8t0ZHL_3uR8zaYzCU,622
-Cryptodome/Hash/SHAKE128.py,sha256=zU7uDVCatsWrg20zbBgWyrlQZCPdffn_p80PhK9-nP4,4773
-Cryptodome/Hash/SHAKE128.pyi,sha256=wLhV8lh8YYWzi7PkhAB3_JQn_hOZNvkiZYg-JjiPpfs,437
-Cryptodome/Hash/SHAKE256.py,sha256=YHXXxK-1cqZv0CRwvTYyEWwf2OfZdVBW6_Jpw8ESOcM,4774
-Cryptodome/Hash/SHAKE256.pyi,sha256=9Uq_FaeYwDx_6dLv331Wv1snnGxA2UhFcUdELHkwU9U,437
-Cryptodome/Hash/TupleHash128.py,sha256=zixd7Pc-uBYkPoqV6PdJfY_hwKRTgDE3CCHhsSG-Dss,4724
-Cryptodome/Hash/TupleHash128.pyi,sha256=fXkKNiV-HubXeCBcBTlAtHlYXwWeQ3iDcOWCs11iIfk,652
-Cryptodome/Hash/TupleHash256.py,sha256=mV6ygJKOY6FUUnYVUFQr3qzxlVT2GC0Wu_4zQjReXwg,2910
-Cryptodome/Hash/TupleHash256.pyi,sha256=esuouWh2HmCu3M4kLjCgu5jrQ87NrBQU5h9o5x21kl0,144
-Cryptodome/Hash/_BLAKE2b.abi3.so,sha256=rk9tPFurUM1tLtloHo59tqMRs7RIvYJGhDLvHQja30Q,21888
-Cryptodome/Hash/_BLAKE2s.abi3.so,sha256=AgnTEq1__qPHvWZnofBb-6Dx4v8jpNA49lwfGmNOUzg,21712
-Cryptodome/Hash/_MD2.abi3.so,sha256=G1xHOoNRg_ovYMYpivT_WWw4tVZcnpb6mGTYbsExZJg,20128
-Cryptodome/Hash/_MD4.abi3.so,sha256=Chb-bqxLPevnCXpxFusErdsgz5QjynMQ8vzg_Q-T0Pw,25576
-Cryptodome/Hash/_MD5.abi3.so,sha256=GNCB_dmGXyuAstTpUekMWZpsTUx_JCTQvhbtxfg_Kuc,31704
-Cryptodome/Hash/_RIPEMD160.abi3.so,sha256=tm5wJWBsY6x9456Ydu3GE8kera119wpNQV4ZC0SGUA8,55608
-Cryptodome/Hash/_SHA1.abi3.so,sha256=HLUzfXUAta_Hc9OhzTkZPgP9sPDLcxq94iei0_8SohE,74416
-Cryptodome/Hash/_SHA224.abi3.so,sha256=nIzcwdudljksQZt4xm9D_Wjy-E6bRcittLF7zFYmJNs,43792
-Cryptodome/Hash/_SHA256.abi3.so,sha256=fPQsB17w0oozWP1RwWWRULvdaE7zNXqzXjjXaA1-Ow4,43872
-Cryptodome/Hash/_SHA384.abi3.so,sha256=x_gHKHoOIEi87bwUjmoyeMcJ462UkpaHEkS-vWpH8BI,50520
-Cryptodome/Hash/_SHA512.abi3.so,sha256=JzPo_PEMB_4QwbaBHWwGi92qYKpynNp9XA5J1AbuigI,50624
-Cryptodome/Hash/__init__.py,sha256=vaCd9NlWJbYWuDUu8QZAt_6DdW0mk1OAmVDvyG7-Izg,1239
-Cryptodome/Hash/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-Cryptodome/Hash/__pycache__/BLAKE2b.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/BLAKE2s.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/CMAC.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/HMAC.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/KMAC128.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/KMAC256.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/KangarooTwelve.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/MD2.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/MD4.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/MD5.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/Poly1305.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/RIPEMD.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/RIPEMD160.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/SHA.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/SHA1.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/SHA224.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/SHA256.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/SHA384.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/SHA3_224.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/SHA3_256.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/SHA3_384.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/SHA3_512.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/SHA512.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/SHAKE128.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/SHAKE256.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/TupleHash128.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/TupleHash256.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/cSHAKE128.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/cSHAKE256.cpython-310.pyc,,
-Cryptodome/Hash/__pycache__/keccak.cpython-310.pyc,,
-Cryptodome/Hash/_ghash_clmul.abi3.so,sha256=10DxDhDR3ioWi4_jTZsbXks8Y_WVBKHrwqK5DQwuv4w,50160
-Cryptodome/Hash/_ghash_portable.abi3.so,sha256=dA74EksFW2fzD3kI2W2qXOjPU63U9QrCZdo4VuzkiCo,17432
-Cryptodome/Hash/_keccak.abi3.so,sha256=trhgcIdYGuRwZdWf37Y3maxEAne5I20djgOVgQBod0M,35064
-Cryptodome/Hash/_poly1305.abi3.so,sha256=ijhYY5jdTRZEhtpZNSVhogK8Rygbs1p37hDOwHDX4vI,33360
-Cryptodome/Hash/cSHAKE128.py,sha256=hJea8EFx0wre-IAOxqVb0LMCXrUtzToc6kXWDVv_rAw,6333
-Cryptodome/Hash/cSHAKE128.pyi,sha256=ILenFDiznj1cjIXbjIBvzEqfFOjObKXWyMsOr63awUo,499
-Cryptodome/Hash/cSHAKE256.py,sha256=CEOEmp5VUTahU-dTEjrI7YXR2pUFvpgTS7jok1G7hK8,2210
-Cryptodome/Hash/cSHAKE256.pyi,sha256=MrVXayegTwcQej1ZWv24QDjJtjnUMocs_Z6Li52ejq0,235
-Cryptodome/Hash/keccak.py,sha256=10FAft3funlFws9lcRlB0cKNUC9q6bsgJeuhaTa_5GA,7555
-Cryptodome/Hash/keccak.pyi,sha256=pXAZaNfayZCXMxB7IDFr2F8Hi06_hwFB3GXjNzY7sBM,741
-Cryptodome/IO/PEM.py,sha256=TPPdUiCHLEauwRAIZ1Y0uxtIGzz5Vz5eF5EZsP3dGRc,6972
-Cryptodome/IO/PEM.pyi,sha256=a1G07RQtZvEtXHlybxdDcoTPM3nqMbdONNjzcz5HGtE,303
-Cryptodome/IO/PKCS8.py,sha256=8pbvHQrbZFN7oqaxTp_NiE8SBXO8c8ZCmvhlCc576ck,9086
-Cryptodome/IO/PKCS8.pyi,sha256=2O5vmzNz8oGsXT_iV0qL0HRzlJFfHFX6A5QWLQB3IfU,484
-Cryptodome/IO/_PBES.py,sha256=ZAoljR3_saaEGvNmv1Zjkcp-Up925t6lH0GHbPAzZP4,16352
-Cryptodome/IO/_PBES.pyi,sha256=QWJLbYh7ywy2wlRWnbUQG_hqlv6zfobF5o6FKh7reWA,489
-Cryptodome/IO/__init__.py,sha256=QUvnoDWlmuOGEjxXh_uXHMoSmoPi_nSeh-Et7MSofeg,1540
-Cryptodome/IO/__pycache__/PEM.cpython-310.pyc,,
-Cryptodome/IO/__pycache__/PKCS8.cpython-310.pyc,,
-Cryptodome/IO/__pycache__/_PBES.cpython-310.pyc,,
-Cryptodome/IO/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/Math/Numbers.py,sha256=2fQR0NxDh4r8rxGGrIahadGXQ5ssQb2nNPuhC1O9S0Q,2042
-Cryptodome/Math/Numbers.pyi,sha256=DBEdhel2f5i097pHa5ZTccxyGf0rKfhXtJP4GiNbP_Q,88
-Cryptodome/Math/Primality.py,sha256=1Y9yDY1B8P3b0cVOxjyctOQs67Ib2Furtvw8QcPWNYI,11387
-Cryptodome/Math/Primality.pyi,sha256=iXAY0gUmciIS_FvH5VJwhQfK-0tDmaH2vcDLHHFyxIE,823
-Cryptodome/Math/_IntegerBase.py,sha256=IhXzQnSDATrbX03Kmo4_FqyOgB2DO3uxbtEXrWqgSd8,10516
-Cryptodome/Math/_IntegerBase.pyi,sha256=Ovo8qweHd6TR7h5506CiwaN9v0L-isgOfUu9YJb6Fr4,3470
-Cryptodome/Math/_IntegerCustom.py,sha256=GI7-e6DTg089x7YzZodhDzxZpKiuRCirMCE1APgecsY,4266
-Cryptodome/Math/_IntegerCustom.pyi,sha256=s9UZigBEgUvHS4IOdt8jXhsZ33O9j19p7lieob1R-EY,135
-Cryptodome/Math/_IntegerGMP.py,sha256=J0TYHwbZHUXWJwB-BTH7B_CCPMYbo6AqN3VIFGi2jok,26755
-Cryptodome/Math/_IntegerGMP.pyi,sha256=UcJOGMYT1d-G0PjbC5ByShFl5oyorFR8h38fFt0uY9s,78
-Cryptodome/Math/_IntegerNative.py,sha256=mg6jDm4kvTMZvWa_LUHV8t1Zgi3M3omO5kzIwGpQeEg,11595
-Cryptodome/Math/_IntegerNative.pyi,sha256=pZaN1xXnB8u7VfrMgp6jqi_jCaJ4x4t0Ecs7qZ_2x-4,81
-Cryptodome/Math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-Cryptodome/Math/__pycache__/Numbers.cpython-310.pyc,,
-Cryptodome/Math/__pycache__/Primality.cpython-310.pyc,,
-Cryptodome/Math/__pycache__/_IntegerBase.cpython-310.pyc,,
-Cryptodome/Math/__pycache__/_IntegerCustom.cpython-310.pyc,,
-Cryptodome/Math/__pycache__/_IntegerGMP.cpython-310.pyc,,
-Cryptodome/Math/__pycache__/_IntegerNative.cpython-310.pyc,,
-Cryptodome/Math/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/Math/_modexp.abi3.so,sha256=C8DwJW3oU_w1-hLXRstKQqKoYriSd_2IrO3XTUrrQx0,294464
-Cryptodome/Protocol/KDF.py,sha256=nmwDb1qTj5fHNSWZdLVwl_CyjlbOjM6rUDSl8wNLcUM,19897
-Cryptodome/Protocol/KDF.pyi,sha256=OfuAajDDJIDIny-zMuGsfhqCLZr4x8bZnV5Tonbg00E,1383
-Cryptodome/Protocol/SecretSharing.py,sha256=ZNw_YhVs4TYrJ7075g6WwaiiCJRRmy0fpT_LoEMV3Ww,8794
-Cryptodome/Protocol/SecretSharing.pyi,sha256=-lErV2RvaNPuOA0z4c44WmNSu9irCw_DDb7wPgCS2BY,798
-Cryptodome/Protocol/__init__.py,sha256=eXlh5nJVd6NoXfUjJ-mNGgm5oE8r6MYDBOIHXWdzTPw,1548
-Cryptodome/Protocol/__init__.pyi,sha256=RNdrwMgjt9b9LmckdRkaYYC4PCzNV-1Hi2T3B2MHgds,43
-Cryptodome/Protocol/__pycache__/KDF.cpython-310.pyc,,
-Cryptodome/Protocol/__pycache__/SecretSharing.cpython-310.pyc,,
-Cryptodome/Protocol/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/Protocol/_scrypt.abi3.so,sha256=sXGTqBkIBy0Yy1-4gJI4dVLNF5_aJ2Nnjre5dtdYFrw,25024
-Cryptodome/PublicKey/DSA.py,sha256=SMeRm30ER5SXkNZoypeV5JZ1SL5rl_H65BZcM56IS8M,22434
-Cryptodome/PublicKey/DSA.pyi,sha256=t6y3t_w_odo5exLTS4K3_d76ObdqfN6R1QHKOff_LA4,1381
-Cryptodome/PublicKey/ECC.py,sha256=LIhFKa0ZpMJV_AR2x4F1DKfEjkn0EI_Gq_OI6u5jZi8,64692
-Cryptodome/PublicKey/ECC.pyi,sha256=xuYWrrPI0Ox7vA1wTfFN4AP5i5t13V9hiMEwS99aTSg,2567
-Cryptodome/PublicKey/ElGamal.py,sha256=qe1JXZRLCnMQO8u892VZA80u92IBXnTq-rV0CcvMKa8,8631
-Cryptodome/PublicKey/ElGamal.pyi,sha256=-s3ty0v_o-8Rq8_nrYh32Vo6ihr8OaSWdc_H7_CVGCo,674
-Cryptodome/PublicKey/RSA.py,sha256=mINA8PTwVuzfK92odBbdEpCjEWHn1uvL1W8k4pIkD3g,29118
-Cryptodome/PublicKey/RSA.pyi,sha256=UpGjHMfe8UvuQPVX6NaMMezyAQw8TmltVxrLeUzr2tc,1865
-Cryptodome/PublicKey/__init__.py,sha256=b7qxFPdI5bbSq5kLLiGtQHtueuDrKhqXAUeZHVyID_Y,3146
-Cryptodome/PublicKey/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-Cryptodome/PublicKey/__pycache__/DSA.cpython-310.pyc,,
-Cryptodome/PublicKey/__pycache__/ECC.cpython-310.pyc,,
-Cryptodome/PublicKey/__pycache__/ElGamal.cpython-310.pyc,,
-Cryptodome/PublicKey/__pycache__/RSA.cpython-310.pyc,,
-Cryptodome/PublicKey/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/PublicKey/__pycache__/_openssh.cpython-310.pyc,,
-Cryptodome/PublicKey/_ec_ws.abi3.so,sha256=a0LjIvJ7c2H7_yt7_1Bpwu7_ehDtFS3XXE_issknhF8,1068008
-Cryptodome/PublicKey/_ed25519.abi3.so,sha256=RkRLQJjk0lPnNl70umyAlbFOGczpS6DWhk5BGxhrd10,578280
-Cryptodome/PublicKey/_ed448.abi3.so,sha256=HnXQi8UZnk49S2XQEiP7Xb-r6-T8w3JQlDQNaPgOC7E,329424
-Cryptodome/PublicKey/_openssh.py,sha256=t8Z8fOJDh64ZXmqpSCqlds-OKb2C5FncQmqCstfGImM,5146
-Cryptodome/PublicKey/_openssh.pyi,sha256=ywCy9UDu2_AQI60ChWxGxyqHiZoYwMKC3TVXJn_ZVIM,324
-Cryptodome/PublicKey/_x25519.abi3.so,sha256=dbOfmyCjJlelCs7aWvVV_GalZOlDTxkenZs0t8MZEFA,124632
-Cryptodome/Random/__init__.py,sha256=EJnd9lTXo5ZFvmgrAzv2wHX8b87SNPO3sDGB3UofVe0,1813
-Cryptodome/Random/__init__.pyi,sha256=ieifhoMB2veKusRRBZWQp6igPri5027VrqfddO5b-WU,367
-Cryptodome/Random/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/Random/__pycache__/random.cpython-310.pyc,,
-Cryptodome/Random/random.py,sha256=aWcD7vA4eWrRmjIkho-YGxbrVC3anFTzHa_N_7Sds64,5246
-Cryptodome/Random/random.pyi,sha256=Lgo1h6wtyUDhEuroDRyt-eYvPFEgQOo0fxfAE68S2cM,807
-Cryptodome/SelfTest/Cipher/__init__.py,sha256=nI0MW4-BVQHwCwYqgWxa7MhL9OxYmwYSIJcp5qe_n9Y,3708
-Cryptodome/SelfTest/Cipher/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/common.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_AES.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_ARC2.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_ARC4.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_Blowfish.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_CAST.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_CBC.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_CCM.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_CFB.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_CTR.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_ChaCha20.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_ChaCha20_Poly1305.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_DES.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_DES3.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_EAX.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_GCM.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_OCB.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_OFB.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_OpenPGP.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_SIV.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_Salsa20.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_pkcs1_15.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_pkcs1_oaep.cpython-310.pyc,,
-Cryptodome/SelfTest/Cipher/common.py,sha256=CESk5eoHx2JAa75YyaAeBMHHvQPEUK_v0uAoPbdNXbg,17336
-Cryptodome/SelfTest/Cipher/test_AES.py,sha256=vANeFFPc2fuUWyI7Tj1k6XBvu0STiW1Cv1f78fgi2Bw,71751
-Cryptodome/SelfTest/Cipher/test_ARC2.py,sha256=gH2ig-tNiYbN5_jsv6HseQWwRdkK6Z1RrQPRJ9an468,6474
-Cryptodome/SelfTest/Cipher/test_ARC4.py,sha256=qTb9rtaqd0cnx4soCOheEI6Dz95U8QhwQQbSc9aeAzY,24746
-Cryptodome/SelfTest/Cipher/test_Blowfish.py,sha256=H3L9l_IfNvxzvtxixq4frH5ToLOA1HGnQoF08DHB5LM,7242
-Cryptodome/SelfTest/Cipher/test_CAST.py,sha256=N-JSM-XxnsbaCk2lNcDVIARuM1oKqRKh2cEXzGBSaLI,3291
-Cryptodome/SelfTest/Cipher/test_CBC.py,sha256=uFPMTC2Lb7_q36TNL_wHfRJDlT1jSpKJrAkJDTVe2oU,20222
-Cryptodome/SelfTest/Cipher/test_CCM.py,sha256=ClkcCmUY1STuLkwZFruBgw0qnSzO5M9rXfwH3SmPsWY,37332
-Cryptodome/SelfTest/Cipher/test_CFB.py,sha256=IRdRnbh4PHKVVY8fIlsrnxUuSRuBGOFucg0NueyesbQ,16085
-Cryptodome/SelfTest/Cipher/test_CTR.py,sha256=rP21pAWZ6nBJ2JuEcYptWdEVi47xlS16PaGQuCCdgMk,21334
-Cryptodome/SelfTest/Cipher/test_ChaCha20.py,sha256=yCLZ61H1ovarvEhW-qoeIIDBuEQix--AqFY2QUjAZro,20340
-Cryptodome/SelfTest/Cipher/test_ChaCha20_Poly1305.py,sha256=zmntnmKmEhIhVavSLZLDUVafkGsX7E_5E2voUXvaSlQ,30531
-Cryptodome/SelfTest/Cipher/test_DES.py,sha256=EsgQR9gvvJEdrr58FCD1aUzmyjbLT-FMawoFY_gMqo4,15951
-Cryptodome/SelfTest/Cipher/test_DES3.py,sha256=25EfIOeEgGstrwWK4i5IBCDecuaDbhOdQ4_4d_n52ls,6585
-Cryptodome/SelfTest/Cipher/test_EAX.py,sha256=K8zhU9gfDMqQy24xKgSllnNqeUTNegQZKI8SXcUgEP0,28851
-Cryptodome/SelfTest/Cipher/test_GCM.py,sha256=UDSFocg2zPJufcXLv8Gjwvsx44tizbWJ3Twg2UFRk78,37308
-Cryptodome/SelfTest/Cipher/test_OCB.py,sha256=-6fQfH0Lx8zbuI__EXJfLoQnczeUiE-qeBq5IW1M3lo,28081
-Cryptodome/SelfTest/Cipher/test_OFB.py,sha256=zHzonGcFTQibtsETUlIJtAmui6cgxzug4YpQtGhhFD0,9395
-Cryptodome/SelfTest/Cipher/test_OpenPGP.py,sha256=Q4rOCU0axh_z7U4MSUGda39nujktPlBUaqVVfE5kMhs,8497
-Cryptodome/SelfTest/Cipher/test_SIV.py,sha256=fDE9kmdYmKn0M4bup4LzHCyzIGgEm8YKMf2M2pMSwNA,19967
-Cryptodome/SelfTest/Cipher/test_Salsa20.py,sha256=h8ubtHJCdfGDbxlKPM_pbTPJ3eoribIm36V-ieyL4z0,16607
-Cryptodome/SelfTest/Cipher/test_pkcs1_15.py,sha256=3Gmd9PbhgpvSu8c6YYzJ9ukRwLaHiVr_AX-wsQq3hjg,10972
-Cryptodome/SelfTest/Cipher/test_pkcs1_oaep.py,sha256=3BHUsR_dAJPg5I1VnR1Mb1gJ2MKK-LnK3MSBnThRNZ0,22322
-Cryptodome/SelfTest/Hash/__init__.py,sha256=dm5gAH4OQtUS3NfRVz9XyfdTSBWDw3Jx5iFIhCAHzmk,3805
-Cryptodome/SelfTest/Hash/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/common.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_BLAKE2.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_CMAC.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_HMAC.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_KMAC.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_KangarooTwelve.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_MD2.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_MD4.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_MD5.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_Poly1305.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_RIPEMD160.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA1.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA224.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA256.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA384.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA3_224.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA3_256.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA3_384.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA3_512.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA512.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHAKE.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_TupleHash.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_cSHAKE.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_keccak.cpython-310.pyc,,
-Cryptodome/SelfTest/Hash/common.py,sha256=_pT1G85L9g04kcFfbXMqhOkzQHDEPbaaOou6b4BFU6k,9906
-Cryptodome/SelfTest/Hash/test_BLAKE2.py,sha256=ezsH9MxKpteMzAJI51vCqRauKdQPqlEhpo0i5y1Yu5Q,16330
-Cryptodome/SelfTest/Hash/test_CMAC.py,sha256=hmOn4XLQJjRbThhejhyTW4EqOQy89q93lUFX3P_IABU,13392
-Cryptodome/SelfTest/Hash/test_HMAC.py,sha256=xqro9TABaXBBCfd8kYK_oAKSYnTlBlR0zshZjy_QsKU,19953
-Cryptodome/SelfTest/Hash/test_KMAC.py,sha256=9GJEEw30275onW7fDSat9A6IEA83GliVdKzyXdYjNtM,11720
-Cryptodome/SelfTest/Hash/test_KangarooTwelve.py,sha256=yi-BwMLLzlpbu7ye7q-omB0zqNdd9l2q9QtNxq9LWJw,10471
-Cryptodome/SelfTest/Hash/test_MD2.py,sha256=ElKzN0tL3U-0TeLVP0e7I8txskHXSA8Ys63aYjLW_BM,2336
-Cryptodome/SelfTest/Hash/test_MD4.py,sha256=9SFHZcbB3M2AhjYtK-Y9w0tWE_cdmeo2QrHvl3f9S4U,2359
-Cryptodome/SelfTest/Hash/test_MD5.py,sha256=Bj6C548u8dz0d-pGxg7JZlezPWuXfD_TBnj7QOJGtxw,3300
-Cryptodome/SelfTest/Hash/test_Poly1305.py,sha256=99gYRntogrqE_dha6UiuFA7-IQiuP5RcLeh7an18N2g,18329
-Cryptodome/SelfTest/Hash/test_RIPEMD160.py,sha256=V1q7YGF0xKe0DeXZhAmtc4hIbbDKhEpjkNfPsNkB-qE,2675
-Cryptodome/SelfTest/Hash/test_SHA1.py,sha256=5TO0WBmJoGUeQBoy9qhF3Oc4UqUQAl4ItuyT2zkTbic,2938
-Cryptodome/SelfTest/Hash/test_SHA224.py,sha256=Dz7sRLuh-AJZXarIZ7Lza4ZUy9tNNT5pUSsAm5Q6Ax0,2541
-Cryptodome/SelfTest/Hash/test_SHA256.py,sha256=pmV4r5WojFZmtVWAIFAl1uO55GO7wMWXCdE_I2e87J0,3637
-Cryptodome/SelfTest/Hash/test_SHA384.py,sha256=6_hL7uoZdQYAEoC0gT2mYuZQuCELHe9ebxcFhQZd4BM,2722
-Cryptodome/SelfTest/Hash/test_SHA3_224.py,sha256=e4ffDcIbVOrsJx3wgSC6GPxcH4jqI5qnWAOrUl4FC1Y,2850
-Cryptodome/SelfTest/Hash/test_SHA3_256.py,sha256=Gekywn54izdEym1g80S9G24cU8_9BS5fTWlZGU-QXuQ,2851
-Cryptodome/SelfTest/Hash/test_SHA3_384.py,sha256=ad0T2zBfNLCLYkLDdefvgFmrAuv-3pNmky8lU0xx40g,2850
-Cryptodome/SelfTest/Hash/test_SHA3_512.py,sha256=-OHjltf_USzOwEZMyJ7mIGnLQg67QUYkcx4OxWhkKN0,2851
-Cryptodome/SelfTest/Hash/test_SHA512.py,sha256=FfpO8kYCnx_fw7s8-FdiK-9245w-X8t49Ca2PG2gfUs,5210
-Cryptodome/SelfTest/Hash/test_SHAKE.py,sha256=kC0-dOsnXMQyofD8y8TnMphXNwMsL4ACEGelUppHrzw,4735
-Cryptodome/SelfTest/Hash/test_TupleHash.py,sha256=aMFuVqU2WfH73nEJoZkbp_ztJR2kV9AnwOi18i9PpaE,8147
-Cryptodome/SelfTest/Hash/test_cSHAKE.py,sha256=X0QOn_DKGU3AS_DBsXF8IEGPSFLWM-Yp-Ia_oIdZRLY,6820
-Cryptodome/SelfTest/Hash/test_keccak.py,sha256=-DjnqvCGwDCQ-VWVfpVP3Dwyfm2Lwk7P1E7_aIydioQ,8909
-Cryptodome/SelfTest/IO/__init__.py,sha256=62l-NkQk9WPrRYoDAbtWKMOc9LT5yAE6ENws7t7-uzU,2002
-Cryptodome/SelfTest/IO/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/SelfTest/IO/__pycache__/test_PBES.cpython-310.pyc,,
-Cryptodome/SelfTest/IO/__pycache__/test_PKCS8.cpython-310.pyc,,
-Cryptodome/SelfTest/IO/test_PBES.py,sha256=sCOtJYeUCsSYM1NRYpweWzlUgrrc8W4vSHLIdi2s_aE,3469
-Cryptodome/SelfTest/IO/test_PKCS8.py,sha256=5yCEFmxCYSGxD9_G9FKN5QyoQ2f4JoMpaAjSVchXMTU,17621
-Cryptodome/SelfTest/Math/__init__.py,sha256=EkOt_fJnPR9-LS36rE0xm0j1nlj-I0Y9CPnQk1KO29E,2113
-Cryptodome/SelfTest/Math/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/SelfTest/Math/__pycache__/test_Numbers.cpython-310.pyc,,
-Cryptodome/SelfTest/Math/__pycache__/test_Primality.cpython-310.pyc,,
-Cryptodome/SelfTest/Math/__pycache__/test_modexp.cpython-310.pyc,,
-Cryptodome/SelfTest/Math/test_Numbers.py,sha256=tCXXA2GSkvOk_y-oEJ7mIT1CgmCyDIfKKK6CQydVqoU,30802
-Cryptodome/SelfTest/Math/test_Primality.py,sha256=0V_gzcBWyk1SFYEBcsEgYVaPfw3-UZtcWl0etV_bgvA,4901
-Cryptodome/SelfTest/Math/test_modexp.py,sha256=rsoK86G8jDUNPiVg5uu3c3S6XVN4wz9dl_ty0oajcwI,8135
-Cryptodome/SelfTest/Protocol/__init__.py,sha256=M2Sh9OvDVzEqup__hYYipuAqXvBwEHSooPPz4meBCyo,1763
-Cryptodome/SelfTest/Protocol/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/SelfTest/Protocol/__pycache__/test_KDF.cpython-310.pyc,,
-Cryptodome/SelfTest/Protocol/__pycache__/test_SecretSharing.cpython-310.pyc,,
-Cryptodome/SelfTest/Protocol/__pycache__/test_rfc1751.cpython-310.pyc,,
-Cryptodome/SelfTest/Protocol/test_KDF.py,sha256=iz5LX9r30DmICJ-BYhsHgHeZLOGTJ-MPncTsr096FL0,34041
-Cryptodome/SelfTest/Protocol/test_SecretSharing.py,sha256=1VHyld5BrNuwZ8NnR55Zsmnex92F1DudMr-z2aMueKA,9701
-Cryptodome/SelfTest/Protocol/test_rfc1751.py,sha256=6QuxUUE-NP8_1tQNj9Macjtc540zk4j85Z7G1Nyy2cI,2220
-Cryptodome/SelfTest/PublicKey/__init__.py,sha256=4mg8NCPsjyaMn6ww46sHNpc2N12E2nTx9bggcIUxD6I,2122
-Cryptodome/SelfTest/PublicKey/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/SelfTest/PublicKey/__pycache__/test_DSA.cpython-310.pyc,,
-Cryptodome/SelfTest/PublicKey/__pycache__/test_ECC_25519.cpython-310.pyc,,
-Cryptodome/SelfTest/PublicKey/__pycache__/test_ECC_448.cpython-310.pyc,,
-Cryptodome/SelfTest/PublicKey/__pycache__/test_ECC_NIST.cpython-310.pyc,,
-Cryptodome/SelfTest/PublicKey/__pycache__/test_ElGamal.cpython-310.pyc,,
-Cryptodome/SelfTest/PublicKey/__pycache__/test_RSA.cpython-310.pyc,,
-Cryptodome/SelfTest/PublicKey/__pycache__/test_import_DSA.cpython-310.pyc,,
-Cryptodome/SelfTest/PublicKey/__pycache__/test_import_ECC.cpython-310.pyc,,
-Cryptodome/SelfTest/PublicKey/__pycache__/test_import_RSA.cpython-310.pyc,,
-Cryptodome/SelfTest/PublicKey/test_DSA.py,sha256=TMEwgUkYF467S9EHMoapNcl3QY6SAWZb3kiWEI65okk,9636
-Cryptodome/SelfTest/PublicKey/test_ECC_25519.py,sha256=HjSq3QWZk_4qq2p76NOsKhMdqKD4dcdE5gi3gPwkOc0,13464
-Cryptodome/SelfTest/PublicKey/test_ECC_448.py,sha256=mcyh3XmV095T-ogxBRzh0tThmsOLt922EG4S08hZOpo,14693
-Cryptodome/SelfTest/PublicKey/test_ECC_NIST.py,sha256=jQRrcO21-81L1UA7WMS4qprOTpPhvphGkU-DnF3x0Ow,49992
-Cryptodome/SelfTest/PublicKey/test_ElGamal.py,sha256=NaGeuJcKfcm5-E-x-WfbzA8oyfPDjR_94hNkvV0cKOE,8672
-Cryptodome/SelfTest/PublicKey/test_RSA.py,sha256=zZNy_X6BXj83p0cjnxoWvIO4Yrn4G6Kdkz2sNqtzai8,12297
-Cryptodome/SelfTest/PublicKey/test_import_DSA.py,sha256=6fLmKITSoP15dlaKZq1dt38gHpUsjmY6Z4gR0H5Bckc,25521
-Cryptodome/SelfTest/PublicKey/test_import_ECC.py,sha256=_6IxIIzIyjtFkS6wxnU5OoUPYRaD8Kj2ucThTXgEMt8,102846
-Cryptodome/SelfTest/PublicKey/test_import_RSA.py,sha256=4fo3HS8FarHTxLJt1AJHw2OKtwn869_Spdncm_L0Eck,25115
-Cryptodome/SelfTest/Random/__init__.py,sha256=vWmKA--IXzOIszf150wbGq1-OTAVBTI3sqInjutIBWk,1546
-Cryptodome/SelfTest/Random/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/SelfTest/Random/__pycache__/test_random.cpython-310.pyc,,
-Cryptodome/SelfTest/Random/test_random.py,sha256=VtbtEXdP_6EaxZ_hRL3rP-HrBVBEqb_ANN7l8HfoRFM,7014
-Cryptodome/SelfTest/Signature/__init__.py,sha256=4BxIOB9IMey1d1Xixyl7mRYJYnuzNpXk83KlzGBiEEM,1558
-Cryptodome/SelfTest/Signature/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/SelfTest/Signature/__pycache__/test_dss.cpython-310.pyc,,
-Cryptodome/SelfTest/Signature/__pycache__/test_eddsa.cpython-310.pyc,,
-Cryptodome/SelfTest/Signature/__pycache__/test_pkcs1_15.cpython-310.pyc,,
-Cryptodome/SelfTest/Signature/__pycache__/test_pss.cpython-310.pyc,,
-Cryptodome/SelfTest/Signature/test_dss.py,sha256=fLe0KW8pFdZH7KBmZaXgELY1ULLeuWpuaA4AandWD90,57130
-Cryptodome/SelfTest/Signature/test_eddsa.py,sha256=h8pFZsdJbUiD0QArIl9fFhfz48ldDM2AEE8Ac5ayPYY,24154
-Cryptodome/SelfTest/Signature/test_pkcs1_15.py,sha256=6pdQ_7oIKlDeaDOx0m5XSSpRI63IuaT7li3f8ntwxSg,13601
-Cryptodome/SelfTest/Signature/test_pss.py,sha256=U25BI7C3NOzmNLTsJB5ESh7aWhO07F49V1CVfaojlRo,15867
-Cryptodome/SelfTest/Util/__init__.py,sha256=0Ov0gHqo91NR0f639IzQMU-UX1pxOm90PI-uUaOJlro,2021
-Cryptodome/SelfTest/Util/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/SelfTest/Util/__pycache__/test_Counter.cpython-310.pyc,,
-Cryptodome/SelfTest/Util/__pycache__/test_Padding.cpython-310.pyc,,
-Cryptodome/SelfTest/Util/__pycache__/test_asn1.cpython-310.pyc,,
-Cryptodome/SelfTest/Util/__pycache__/test_number.cpython-310.pyc,,
-Cryptodome/SelfTest/Util/__pycache__/test_rfc1751.cpython-310.pyc,,
-Cryptodome/SelfTest/Util/__pycache__/test_strxor.cpython-310.pyc,,
-Cryptodome/SelfTest/Util/test_Counter.py,sha256=gXH9Dej6zfih8cA8DFJK_QIbLINYRenXmDw42vVlBtQ,2292
-Cryptodome/SelfTest/Util/test_Padding.py,sha256=bK0L7PoRRnD8DI-ktOMSNa514mLCYBnZnpyLBhAYmFk,5826
-Cryptodome/SelfTest/Util/test_asn1.py,sha256=dl3GK8IOau460vGumkdDZkQSuFhJKi9Tn8VFMT7xKKE,29347
-Cryptodome/SelfTest/Util/test_number.py,sha256=8NyFZ670B_QA04qBhusfYX-xaDJs_n6qO6Z4r4w6Ku4,8546
-Cryptodome/SelfTest/Util/test_rfc1751.py,sha256=iRu-xLLslb_ktNOPkKs4TAWPljrxDMksFnSqo25q9dA,1121
-Cryptodome/SelfTest/Util/test_strxor.py,sha256=BRVOZIin3ypmyMfdB52fsCbmXu1WMwdLFSx7sw3BUyw,10223
-Cryptodome/SelfTest/__init__.py,sha256=RSlgZ8QkSPoBK34ydUAVliBLhQiVsuX8ZqJaXBOWE18,3688
-Cryptodome/SelfTest/__main__.py,sha256=aQAx7W62ztb2utGTClg3Qgb8iD9zSCnThhil_cIdL84,1506
-Cryptodome/SelfTest/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/SelfTest/__pycache__/__main__.cpython-310.pyc,,
-Cryptodome/SelfTest/__pycache__/loader.cpython-310.pyc,,
-Cryptodome/SelfTest/__pycache__/st_common.cpython-310.pyc,,
-Cryptodome/SelfTest/loader.py,sha256=8p4YzhCE5KaxhBs5i8kVACuCBQQqqu--tddMbIEkcaQ,6743
-Cryptodome/SelfTest/st_common.py,sha256=XsoFHmR_gylMxGhRJrQHfarNnIT_Mu8t9oAebRPReck,1949
-Cryptodome/Signature/DSS.py,sha256=7jx5uEULjx8P16FBpdhKV94xG5VpZAngKM6LgtTUpjM,15352
-Cryptodome/Signature/DSS.pyi,sha256=zay6LNZ3NIlu42Q63ICT3mZEcz_aVG1rXLOkJ2tfasc,1102
-Cryptodome/Signature/PKCS1_PSS.py,sha256=o3Ky9DF9iI-wpGHDi5vZs7spzFSlANYIkqgqu0zCkAo,2103
-Cryptodome/Signature/PKCS1_PSS.pyi,sha256=fzw5vQvHchfJHvlHEr24CMTY2Gw8_pqsz76jNmMUBlc,280
-Cryptodome/Signature/PKCS1_v1_5.py,sha256=aEzzt1ccFM71pJfG6drwzGZeTI-ntM4-LLxBPyaFXLA,1993
-Cryptodome/Signature/PKCS1_v1_5.pyi,sha256=eqweCPvqayn2xiO9Aqv4Bc38GKOLcca6PazT9T87ufE,157
-Cryptodome/Signature/__init__.py,sha256=nkUODHAHwqmFvemdRLKTFXCY0lh6WdxmFlJuLD0IBfw,1695
-Cryptodome/Signature/__pycache__/DSS.cpython-310.pyc,,
-Cryptodome/Signature/__pycache__/PKCS1_PSS.cpython-310.pyc,,
-Cryptodome/Signature/__pycache__/PKCS1_v1_5.cpython-310.pyc,,
-Cryptodome/Signature/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/Signature/__pycache__/eddsa.cpython-310.pyc,,
-Cryptodome/Signature/__pycache__/pkcs1_15.cpython-310.pyc,,
-Cryptodome/Signature/__pycache__/pss.cpython-310.pyc,,
-Cryptodome/Signature/eddsa.py,sha256=yD-aOaKDCZyGHKqu0BRS0vqNx-pMsik_fOdryakQkNk,12366
-Cryptodome/Signature/eddsa.pyi,sha256=zhvwZlS3hPcBDg33bk97defwh5h7uMZULaBR01ioSIU,732
-Cryptodome/Signature/pkcs1_15.py,sha256=DUGi4HV7M7BfRsorONganSNTIlS8ql7A5f16OYJTxPI,8750
-Cryptodome/Signature/pkcs1_15.pyi,sha256=k8o74VVp_Zw11VmbhLBxPiU6CzzTm7NbaNwGeWeNn9A,568
-Cryptodome/Signature/pss.py,sha256=1443VYy8pEuvB7t8sWJ9p--pGHnRz2yqChKx3EowkXI,13494
-Cryptodome/Signature/pss.pyi,sha256=O_6YOe-iR4rHIzNnm6vCzcwxVNPGRgfAXhhzp1N9jPE,1044
-Cryptodome/Util/Counter.py,sha256=8qQaeEZGHtAhwGj0A9gJQ9e0ZihtjWpeCSeuS1h9KF8,3110
-Cryptodome/Util/Counter.pyi,sha256=2JrTHJYq263XosQSC_NIP0TufUsTlG7WUr-lRqjJCuA,290
-Cryptodome/Util/Padding.py,sha256=LPtSnQG_f8dT5Gq5IetTWtxcJWeiIQpoUKFDU2yCWbk,4317
-Cryptodome/Util/Padding.pyi,sha256=47R3H2kE66PtKO82eT_Vc5eCSgNe4qOFgqOIPRdlp9c,238
-Cryptodome/Util/RFC1751.py,sha256=zHC63Jx-PqZQ2ebcYGUhaG62vfkFSklQc8MZmapE7SY,21204
-Cryptodome/Util/RFC1751.pyi,sha256=B42LvsE6G786rNEsrhta_BANazgrpb0WoSBPqKyjt5g,159
-Cryptodome/Util/__init__.py,sha256=fsZWRqGXZR2gmM0jxuiogKW3WwzlzKuTRRWYiwtOOd0,1951
-Cryptodome/Util/__pycache__/Counter.cpython-310.pyc,,
-Cryptodome/Util/__pycache__/Padding.cpython-310.pyc,,
-Cryptodome/Util/__pycache__/RFC1751.cpython-310.pyc,,
-Cryptodome/Util/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/Util/__pycache__/_cpu_features.cpython-310.pyc,,
-Cryptodome/Util/__pycache__/_file_system.cpython-310.pyc,,
-Cryptodome/Util/__pycache__/_raw_api.cpython-310.pyc,,
-Cryptodome/Util/__pycache__/asn1.cpython-310.pyc,,
-Cryptodome/Util/__pycache__/number.cpython-310.pyc,,
-Cryptodome/Util/__pycache__/py3compat.cpython-310.pyc,,
-Cryptodome/Util/__pycache__/strxor.cpython-310.pyc,,
-Cryptodome/Util/_cpu_features.py,sha256=f_JiluwzxhmltMbptIQ8qA03YUdgSNBr3RwcyX9z-xc,1997
-Cryptodome/Util/_cpu_features.pyi,sha256=3wKXZ0Z8llc2uxADvbhz3dHV6YLyRrDujOsabXlffCQ,59
-Cryptodome/Util/_cpuid_c.abi3.so,sha256=LoLZvm6GLA4jOWQ6-FZVnN3uz2MfcoZLqq6YWzaQxyg,12776
-Cryptodome/Util/_file_system.py,sha256=m7HsPgKuKRsTQjgov6Vg02dn7Xsa52xhCLmqLjPIoZg,2183
-Cryptodome/Util/_file_system.pyi,sha256=5QruEWPE4urPtlCT5Eg8tBQyhV9ffBfZIAjmMo727dM,100
-Cryptodome/Util/_raw_api.py,sha256=p_2FjTLxRNw9OwBOHiZ21OUk3Pf4P3z-lmTeZJ-Kp_0,10238
-Cryptodome/Util/_raw_api.pyi,sha256=Ohc2rr6RS-nhs6T5AL1YyQtaqsx6BVrJa092CiwAvNM,906
-Cryptodome/Util/_strxor.abi3.so,sha256=y2-werLAQ_VckIphTn1w1oe1arub39k2Unxn9OzG-cw,14960
-Cryptodome/Util/asn1.py,sha256=bsZSxnt0HAZ3PbMH9-GGOV5kpMkRIVFcwutQx-J7T_k,31689
-Cryptodome/Util/asn1.pyi,sha256=xR4oQKBf4SXiz0IQ_K0lw427jvvgX9SiEXejIu9fdV8,3579
-Cryptodome/Util/number.py,sha256=cMIIREXRr9J_jXogGeuDY_7YGKWOG6DJR5B9t4ta_3Q,95733
-Cryptodome/Util/number.pyi,sha256=ixX1BS8EvvuPXN1_8aosdYHKmtXGB9NlRNVI9T9MAA8,975
-Cryptodome/Util/py3compat.py,sha256=FDpjB6AbLPyx13nRQu5hCyL6m44e81x5kRYbxg5wnNg,5530
-Cryptodome/Util/py3compat.pyi,sha256=lcLAXVV6t4d_y_EsUZOYEYgrOUczczMl_3IawItxYpw,837
-Cryptodome/Util/strxor.py,sha256=gInNJiw-NCqj3ULb7EBCZ_F3vbGSHGxcZrVI3Ot4PIQ,5449
-Cryptodome/Util/strxor.pyi,sha256=OuBvuuK_ezq3eaHY10J89xpER9IQ9wcYzFI7j1tpll0,243
-Cryptodome/__init__.py,sha256=t-JUcMSSnZhIFP8wNWKMkQah8dXuyhttfHa0Qda5GQo,185
-Cryptodome/__init__.pyi,sha256=e5Ea45Jy2RdOr6bmLF9jiS2Bw65WnYTD1NMLJlbGAaw,99
-Cryptodome/__pycache__/__init__.cpython-310.pyc,,
-Cryptodome/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pycryptodomex-3.15.0.dist-info/AUTHORS.rst,sha256=TL3mA8NQgoAcSU73HDEKSMnuix-f4GiSTxtFMy_CS9M,750
-pycryptodomex-3.15.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-pycryptodomex-3.15.0.dist-info/LICENSE.rst,sha256=TgRmDXfBxk6J15U3kZ-4JA-iFISn49sp81iyx_hOoHM,2926
-pycryptodomex-3.15.0.dist-info/METADATA,sha256=uG3EO9qmHt4RI0hfj8sLgo5OxSjUtgxgxu8VHntfrtI,3183
-pycryptodomex-3.15.0.dist-info/RECORD,,
-pycryptodomex-3.15.0.dist-info/WHEEL,sha256=NHVYCelbjQYaRHcLsSKkvd1e6nvZj0EwYHq59C6NexI,111
-pycryptodomex-3.15.0.dist-info/top_level.txt,sha256=eHU9ase6in1ZSBEtTDpl7fwIPION42nbqZ1uFTyccxs,11
diff --git a/frozen_deps/pycryptodomex-3.15.0.dist-info/WHEEL b/frozen_deps/pycryptodomex-3.15.0.dist-info/WHEEL
deleted file mode 100644
index 59c3897..0000000
--- a/frozen_deps/pycryptodomex-3.15.0.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.36.2)
-Root-Is-Purelib: false
-Tag: cp35-abi3-manylinux2010_x86_64
-
diff --git a/frozen_deps/pycryptodomex-3.15.0.dist-info/top_level.txt b/frozen_deps/pycryptodomex-3.15.0.dist-info/top_level.txt
deleted file mode 100644
index 9cbd375..0000000
--- a/frozen_deps/pycryptodomex-3.15.0.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-Cryptodome
diff --git a/frozen_deps/pycryptodomex-3.9.9.dist-info/AUTHORS.rst b/frozen_deps/pycryptodomex-3.9.9.dist-info/AUTHORS.rst
deleted file mode 100644
index bdafc82..0000000
--- a/frozen_deps/pycryptodomex-3.9.9.dist-info/AUTHORS.rst
+++ /dev/null
@@ -1,49 +0,0 @@
-Simon Arneaud
-Nevins Bartolomeo
-Thorsten E. Behrens
-Tim Berners-Lee
-Frédéric Bertolus
-Ian Bicking
-Joris Bontje
-Antoon Bosselaers
-Andrea Bottoni
-Jean-Paul Calderone
-Sergey Chernov
-Geremy Condra
-Jan Dittberner
-Andrew Eland
-Philippe Frycia
-Peter Gutmann
-Hirendra Hindocha
-Nikhil Jhingan
-Sebastian Kayser
-Ryan Kelly
-Andrew M. Kuchling
-Piers Lauder
-Legrandin
-M.-A. Lemburg
-Wim Lewis
-Darsey C. Litzenberger
-Richard Mitchell
-Mark Moraes
-Lim Chee Siang
-Bryan Olson
-Wallace Owen
-Colin Plumb
-Robey Pointer
-Lorenz Quack
-Sebastian Ramacher
-Jeethu Rao
-James P. Rutledge
-Matt Schreiner
-Peter Simmons
-Janne Snabb
-Tom St. Denis
-Anders Sundman
-Paul Swartz
-Fabrizio Tarizzo
-Kevin M. Turner
-Barry A. Warsaw
-Eric Young
-Hannes van Niekerk
-Stefan Seering
diff --git a/frozen_deps/pycryptodomex-3.9.9.dist-info/INSTALLER b/frozen_deps/pycryptodomex-3.9.9.dist-info/INSTALLER
deleted file mode 100644
index a1b589e..0000000
--- a/frozen_deps/pycryptodomex-3.9.9.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/frozen_deps/pycryptodomex-3.9.9.dist-info/LICENSE.rst b/frozen_deps/pycryptodomex-3.9.9.dist-info/LICENSE.rst
deleted file mode 100644
index 23f8f33..0000000
--- a/frozen_deps/pycryptodomex-3.9.9.dist-info/LICENSE.rst
+++ /dev/null
@@ -1,274 +0,0 @@
-The source code in PyCryptodome is partially in the public domain
-and partially released under the BSD 2-Clause license.
-
-In either case, there are minimal if no restrictions on the redistribution,
-modification and usage of the software.
-
-Public domain
-=============
-
-All code originating from PyCrypto is free and unencumbered software
-released into the public domain.
-
-Anyone is free to copy, modify, publish, use, compile, sell, or
-distribute this software, either in source code form or as a compiled
-binary, for any purpose, commercial or non-commercial, and by any
-means.
-
-In jurisdictions that recognize copyright laws, the author or authors
-of this software dedicate any and all copyright interest in the
-software to the public domain. We make this dedication for the benefit
-of the public at large and to the detriment of our heirs and
-successors. We intend this dedication to be an overt act of
-relinquishment in perpetuity of all present and future rights to this
-software under copyright law.
-
-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 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.
-
-For more information, please refer to <http://unlicense.org>
-
-BSD license
-===========
-
-All direct contributions to PyCryptodome are released under the following
-license. The copyright of each piece belongs to the respective author.
-
-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.
-
-OCB license
-===========
-
-The OCB cipher mode is patented in the US under patent numbers 7,949,129 and
-8,321,675. The directory Doc/ocb contains three free licenses for implementors
-and users. As a general statement, OCB can be freely used for software not meant
-for military purposes. Contact your attorney for further information.
-
-Apache 2.0 license (Wycheproof)
-===============================
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/frozen_deps/pycryptodomex-3.9.9.dist-info/METADATA b/frozen_deps/pycryptodomex-3.9.9.dist-info/METADATA
deleted file mode 100644
index c519e01..0000000
--- a/frozen_deps/pycryptodomex-3.9.9.dist-info/METADATA
+++ /dev/null
@@ -1,84 +0,0 @@
-Metadata-Version: 2.1
-Name: pycryptodomex
-Version: 3.9.9
-Summary: Cryptographic library for Python
-Home-page: https://www.pycryptodome.org
-Author: Helder Eijs
-Author-email: [email protected]
-License: BSD, Public Domain, Apache
-Project-URL: Source, https://github.com/Legrandin/pycryptodome/
-Platform: Posix; MacOS X; Windows
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: License :: OSI Approved :: BSD License
-Classifier: License :: OSI Approved :: Apache Software License
-Classifier: License :: Public Domain
-Classifier: Intended Audience :: Developers
-Classifier: Operating System :: Unix
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Topic :: Security :: Cryptography
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.6
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Requires-Python: >=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
-
-
-PyCryptodome
-============
-
-PyCryptodome is a self-contained Python package of low-level
-cryptographic primitives.
-
-It supports Python 2.6 and 2.7, Python 3.4 and newer, and PyPy.
-
-You can install it with::
-
- pip install pycryptodomex
-
-All modules are installed under the ``Cryptodome`` package.
-
-Check the pycryptodome_ project for the equivalent library that
-works under the ``Crypto`` package.
-
-PyCryptodome is a fork of PyCrypto. It brings several enhancements
-with respect to the last official version of PyCrypto (2.6.1),
-for instance:
-
-* Authenticated encryption modes (GCM, CCM, EAX, SIV, OCB)
-* Accelerated AES on Intel platforms via AES-NI
-* First class support for PyPy
-* Elliptic curves cryptography (NIST P-256, P-384 and P-521 curves only)
-* Better and more compact API (`nonce` and `iv` attributes for ciphers,
- automatic generation of random nonces and IVs, simplified CTR cipher mode,
- and more)
-* SHA-3 (including SHAKE XOFs) and BLAKE2 hash algorithms
-* Salsa20 and ChaCha20 stream ciphers
-* scrypt and HKDF
-* Deterministic (EC)DSA
-* Password-protected PKCS#8 key containers
-* Shamir's Secret Sharing scheme
-* Random numbers get sourced directly from the OS (and not from a CSPRNG in userspace)
-* Simplified install process, including better support for Windows
-* Cleaner RSA and DSA key generation (largely based on FIPS 186-4)
-* Major clean ups and simplification of the code base
-
-PyCryptodome is not a wrapper to a separate C library like *OpenSSL*.
-To the largest possible extent, algorithms are implemented in pure Python.
-Only the pieces that are extremely critical to performance (e.g. block ciphers)
-are implemented as C extensions.
-
-For more information, see the `homepage`_.
-
-All the code can be downloaded from `GitHub`_.
-
-.. _pycryptodome: https://pypi.python.org/pypi/pycryptodome
-.. _`homepage`: http://www.pycryptodome.org
-.. _GitHub: https://github.com/Legrandin/pycryptodome
-
-
diff --git a/frozen_deps/pycryptodomex-3.9.9.dist-info/RECORD b/frozen_deps/pycryptodomex-3.9.9.dist-info/RECORD
deleted file mode 100644
index 218f4ff..0000000
--- a/frozen_deps/pycryptodomex-3.9.9.dist-info/RECORD
+++ /dev/null
@@ -1,794 +0,0 @@
-Cryptodome/Cipher/AES.py,sha256=fbD_h8DbAF4NsFKrbhKz5sMFnqKYUza0XqT4k9f1SpE,9569
-Cryptodome/Cipher/AES.pyi,sha256=3ahEn43wmFv37xdmnlibzjWOmRAgSSeiFToFMIoLVUk,1387
-Cryptodome/Cipher/ARC2.py,sha256=NwO42KWBpuTXS5Thx0gsDRmxyrvfiudx7PKed1KR0CI,7026
-Cryptodome/Cipher/ARC2.pyi,sha256=zgMfUY35w1AuEi0apkFuHo_NQOfzsCxuZ9gN1s3oAhg,982
-Cryptodome/Cipher/ARC4.py,sha256=x_8L_KA_pDkoeIOSCQZyVPwhD3na4-xShkPkeNRka58,5168
-Cryptodome/Cipher/ARC4.pyi,sha256=sMw73yZHeonmGx9BhiyA7__4PQJocU04SMRcDjnyJ2Y,431
-Cryptodome/Cipher/Blowfish.py,sha256=K5hF6nb2r8FsHhgLX2irdyUMqg4PCwrAgu68NNhU1ag,5976
-Cryptodome/Cipher/Blowfish.pyi,sha256=kDooazMxY1973SMtPuhNJ9f68PS4cNWynyYa7CoWC48,1018
-Cryptodome/Cipher/CAST.py,sha256=3XDjtVBsia2kPvducB19_FEc3zM7hSK8JKKmK-b8cvU,6087
-Cryptodome/Cipher/CAST.pyi,sha256=XgVk9wOv_V77LbQmm24O2R-PDss8JiHfw11karavKCI,983
-Cryptodome/Cipher/ChaCha20.py,sha256=u7YX0kO9MBwV7Ibt_Dbyz_pHq-TG5POxoRnNOGy9ZPs,10754
-Cryptodome/Cipher/ChaCha20.pyi,sha256=_l1xhtOyBmYEHP7Ftmk8EQZpKegX9p3N5tckC_PPve0,762
-Cryptodome/Cipher/ChaCha20_Poly1305.py,sha256=W0tOmBkoNzfwtwgPG9Tw0dUm3sZ8IVhnehTbAc2jRt4,11561
-Cryptodome/Cipher/ChaCha20_Poly1305.pyi,sha256=h1U5ixODzM9NwLpX9oaIJdeQ0ubYeDeY9m6ur05dKCc,1068
-Cryptodome/Cipher/DES.py,sha256=ebgHOqNGjCYlIoFh3W5KXY17aQnvckjhQC9TPEKqPuY,5963
-Cryptodome/Cipher/DES.pyi,sha256=thNZATxZ0Q-vOh_V7QVZu6J_ESvr9mcA67WlQV_nP1A,963
-Cryptodome/Cipher/DES3.py,sha256=qmIagOLhMGG221sC7BAH9xe5lnxk2iyilbeYoC3it4c,6941
-Cryptodome/Cipher/DES3.pyi,sha256=arv4Uhv7lSgAL36B_Vx5DL-s_18Kc9_TejNxftMp4H4,1033
-Cryptodome/Cipher/PKCS1_OAEP.py,sha256=GtxJWWSmK5PCIc1xFZDkMucGmPrioWBRB3M3T_VeVDY,8880
-Cryptodome/Cipher/PKCS1_OAEP.pyi,sha256=XRZ5_0v8w2LUYD04Gz3Ekey9PxYBZJnUl-0rVv2q_gY,1183
-Cryptodome/Cipher/PKCS1_v1_5.py,sha256=IeTKcgsUJSYzct2EzvL0cPg4d2F7SjUMGjTQ4HjxnUc,7979
-Cryptodome/Cipher/PKCS1_v1_5.pyi,sha256=XzzxTLrPfBUqROLd-hhDua4w6YrzI7xjLmHrQN__Xck,571
-Cryptodome/Cipher/Salsa20.py,sha256=SuzaYhBc_Q7voODDmQ2rCzILndPpmF1n6qitDMmk7no,6369
-Cryptodome/Cipher/Salsa20.pyi,sha256=4vjq_HN8NK7U9VdaaHIgs17-fyW8SRPDZaHy3jKVkto,744
-Cryptodome/Cipher/_ARC4.cpython-39-x86_64-linux-gnu.so,sha256=xWcpiO-a7u0MoV4Y05f1g98p8qzLUoGcmIVR2wFaXmQ,14354
-Cryptodome/Cipher/_EKSBlowfish.py,sha256=fi6TEeN0bXcznFkyLzsaoLxNmu9iPT-Tmp3CLvJsE0A,5217
-Cryptodome/Cipher/_EKSBlowfish.pyi,sha256=6JhAXsSVbJMYlcudpNwSNEDB9X5NjhfRGPzZvcOc_As,270
-Cryptodome/Cipher/_Salsa20.cpython-39-x86_64-linux-gnu.so,sha256=s-GnzAs9Xpe35NV3rIHIrRRjOqhlqOmCL13dSCrTu48,21734
-Cryptodome/Cipher/__init__.py,sha256=Cdau3A_ZsmqOFM8yK4Q2C_hFeV2xjd9_fU812_ferXM,2888
-Cryptodome/Cipher/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-Cryptodome/Cipher/__pycache__/AES.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/ARC2.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/ARC4.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/Blowfish.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/CAST.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/ChaCha20.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/ChaCha20_Poly1305.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/DES.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/DES3.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/PKCS1_OAEP.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/PKCS1_v1_5.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/Salsa20.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/_EKSBlowfish.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_cbc.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_ccm.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_cfb.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_ctr.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_eax.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_ecb.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_gcm.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_ocb.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_ofb.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_openpgp.cpython-39.pyc,,
-Cryptodome/Cipher/__pycache__/_mode_siv.cpython-39.pyc,,
-Cryptodome/Cipher/_chacha20.cpython-39-x86_64-linux-gnu.so,sha256=3WR-g2uqji2AGtFbDn_NCXrbNiJwpfS-EwTmtNAf4nA,25741
-Cryptodome/Cipher/_mode_cbc.py,sha256=cDaa-zgNIbosLHJhwsDtt7YOTE-jzRUi4ODfj95SBsM,10971
-Cryptodome/Cipher/_mode_cbc.pyi,sha256=qH5pEQNuefabeRV-Xz-6AA953MFd_Z20zGeBTwa6t0s,691
-Cryptodome/Cipher/_mode_ccm.py,sha256=zqq91jARvmdPXs58u0uCP-D8ctzsg65Lf8nW9VQYezs,24476
-Cryptodome/Cipher/_mode_ccm.pyi,sha256=ZSs4SOlivIG_JUxknDjQKs4ZYGmkwAO7K2DKcbz_14M,1600
-Cryptodome/Cipher/_mode_cfb.py,sha256=lfIeHxJmyqmBWk84d4z9030OooTSBX1gfaVIaRqIPyE,10821
-Cryptodome/Cipher/_mode_cfb.pyi,sha256=PM0slBBfWdA4Ec0JjM-OJheiZkCFPWAADvLsvKpDRCY,731
-Cryptodome/Cipher/_mode_ctr.py,sha256=PFiqbWjboWaeLv0M0GnE4o8_vv6h7Aedv5cNq51VNlU,15920
-Cryptodome/Cipher/_mode_ctr.pyi,sha256=UcZ1zOZlVnTSlka9R1yFo7kaDhreiLKCe7AU05AcAuI,804
-Cryptodome/Cipher/_mode_eax.py,sha256=XXOc-GKbZ2hRagr5I5FihKWaGh8hXP1Si2kY3D85-ls,14543
-Cryptodome/Cipher/_mode_eax.pyi,sha256=VHPtTdA-2btCvRE-4npRtGCrApg7rBNWpHSZV1po8J0,1545
-Cryptodome/Cipher/_mode_ecb.py,sha256=h81F3mNQc08dVr__iP3_41ixeul00OsDw9mCI_Bh7I8,8222
-Cryptodome/Cipher/_mode_ecb.pyi,sha256=PgzUPsVY2DRM72wM-h74vCiceNF_yeaBxOA6bt_ZfmA,596
-Cryptodome/Cipher/_mode_gcm.py,sha256=oAOWTQ1qynOv7BfuueXokEF1TghERzKOXEgHKMj50wg,21402
-Cryptodome/Cipher/_mode_gcm.pyi,sha256=5t72QHQS0gDq6wtzYfaVqTxmjBzpUvsQvDaP2DqNvLE,1541
-Cryptodome/Cipher/_mode_ocb.py,sha256=QeHiPunUGWKt4iG8A50xgWV9b3C7qW0uwJPRcta5bC8,19838
-Cryptodome/Cipher/_mode_ocb.pyi,sha256=SXMUa1s1dY-272lktxSOtyOoqLdtPvfNkRXqmXjBE4o,1231
-Cryptodome/Cipher/_mode_ofb.py,sha256=sXdbumASGN-K7ps89z7c-knnMnnYtuO97X7y-VYZvyA,10301
-Cryptodome/Cipher/_mode_ofb.pyi,sha256=mPIZ2e_X-URk-8LBNiZyacfcS3Ei1vgT8YlhyI-0C8k,695
-Cryptodome/Cipher/_mode_openpgp.py,sha256=whIc90qioqxMiL2RCys5-XwfDntDneVYJx4Br6X3zD4,7061
-Cryptodome/Cipher/_mode_openpgp.pyi,sha256=FoLrFqnvxJf0F_npHOgPURfUyGSt6DxyIp2ikoXi-CI,556
-Cryptodome/Cipher/_mode_siv.py,sha256=nRqGJBjqxmKikUpVBLgMN3TGwg2f3boCNtUtGcn9uEU,14094
-Cryptodome/Cipher/_mode_siv.pyi,sha256=syb3kXnyuhoQV6FXvozIjudWCQBCadOb1I2BuV-6Ai0,1261
-Cryptodome/Cipher/_raw_aes.cpython-39-x86_64-linux-gnu.so,sha256=lTMCQ1DutmW-W1D37nQUp4FbyFJ-KrOe51Gvay2ej1s,54112
-Cryptodome/Cipher/_raw_aesni.cpython-39-x86_64-linux-gnu.so,sha256=tZsm7zoBviq0ezhAedvvl6Cjzur6WIn390k1st-E8pQ,52331
-Cryptodome/Cipher/_raw_arc2.cpython-39-x86_64-linux-gnu.so,sha256=LqtYOzeTSkU6_OsSPppx2e5YtzW66mg9iiK9GYWLOzw,18917
-Cryptodome/Cipher/_raw_blowfish.cpython-39-x86_64-linux-gnu.so,sha256=0zf8Xn-gH7QkhfJVcRZs1eZwlJFIZc79EmyU_8CQzFQ,26938
-Cryptodome/Cipher/_raw_cast.cpython-39-x86_64-linux-gnu.so,sha256=7CQRIIFRkD28_jp9C2DeHjQ8DobuiH84T_Nia5aNjKg,44422
-Cryptodome/Cipher/_raw_cbc.cpython-39-x86_64-linux-gnu.so,sha256=Qblmcc6tfybs3X23fYND0JkweNx3aUcai-sX8uxnhAA,17215
-Cryptodome/Cipher/_raw_cfb.cpython-39-x86_64-linux-gnu.so,sha256=DcP1rhzz7irFrlZjBPwQjUocNaLkNq64UZ-FOl7dnkc,22696
-Cryptodome/Cipher/_raw_ctr.cpython-39-x86_64-linux-gnu.so,sha256=GdmwdtXn9WCUxJPsN36Z1anpViVohCYK8o185GOoyGA,23249
-Cryptodome/Cipher/_raw_des.cpython-39-x86_64-linux-gnu.so,sha256=JPTqa7QTwPT4kwxk-wWttXO-Ff8ITv6NeXnv9UqwLoM,62525
-Cryptodome/Cipher/_raw_des3.cpython-39-x86_64-linux-gnu.so,sha256=2eWJrc1Uizrx0Jhc79SCxUqRCLJ-V2CIB_jdZPTS8R4,63370
-Cryptodome/Cipher/_raw_ecb.cpython-39-x86_64-linux-gnu.so,sha256=4sz2mcTVKV8Jlt_S0r573HBACcvqYzheBusXSyfNbfE,10893
-Cryptodome/Cipher/_raw_eksblowfish.cpython-39-x86_64-linux-gnu.so,sha256=qh_FkwkdzZc9HkQ9VY55JHRRnn7dxJfzYrfk31SO_qw,58926
-Cryptodome/Cipher/_raw_ocb.cpython-39-x86_64-linux-gnu.so,sha256=92L0rkhKMjKsdSHnN_odQvejX-b8i9fcNAjL1tTj-zo,30281
-Cryptodome/Cipher/_raw_ofb.cpython-39-x86_64-linux-gnu.so,sha256=cclGzRPHHeQ4UDL45GOWKlvdIPn7n3vvGcz576bfMQY,14743
-Cryptodome/Hash/BLAKE2b.py,sha256=WEV8u2cm18T_j9BwjCDPaSJ6AappqpwO1u7mHG6Sgnk,9440
-Cryptodome/Hash/BLAKE2b.pyi,sha256=9FsubGLHkCf6aPA5xZGVSop8WY4yLCWi3Vq53cGiSNo,877
-Cryptodome/Hash/BLAKE2s.py,sha256=uBxYbWDZleCmsOvSEmVRXPywTS2TM-qq3oyN4FJp68c,9446
-Cryptodome/Hash/BLAKE2s.pyi,sha256=9jsL4jLQq5_Mb8WM99LPurH1D-FL-gLAeZyBf8QiWt0,739
-Cryptodome/Hash/CMAC.py,sha256=06Hyo7r7XAgklKXWp7tttTiZFqKRTGINigxkEgWh6WY,10448
-Cryptodome/Hash/CMAC.pyi,sha256=8gybenApjooarPbVIWZohcOruj0tMyZuW5gJvrK_Vag,797
-Cryptodome/Hash/HMAC.py,sha256=pp450gCQNmw4vUfrQAJyDZ_h1ovwd-8wLvoyqd9t5hU,7062
-Cryptodome/Hash/HMAC.pyi,sha256=fAyHBEf5Ee6LoiYYTZ9PZpmIRvitU6OriKGfjFUM_4c,624
-Cryptodome/Hash/MD2.py,sha256=mfucNRXYIj8iOXGKEXGN4TIwyHHhIglb2ScSowyg5tc,6123
-Cryptodome/Hash/MD2.pyi,sha256=wa7GSYUpzL27so4YgiJEZo0dO201KyHK87Q20Pvm-bM,492
-Cryptodome/Hash/MD4.py,sha256=FSGY7k8rYayR6PE0hNpICRTa1uNiISVxixIpaC28zzg,6598
-Cryptodome/Hash/MD4.pyi,sha256=7ZtZQEgJCwIswneb0NBov_uL0_Toglh9EPMnLVFGqwo,532
-Cryptodome/Hash/MD5.py,sha256=Cd5wtZ4OBW-O7tvebvObsay_jI6tRtoUfIfkbE0aqMQ,6630
-Cryptodome/Hash/MD5.pyi,sha256=c4MCJHvYTi2YL4hmqEu9ivbSvkBJdR-S2ldUqEpzK8s,492
-Cryptodome/Hash/Poly1305.py,sha256=xESe_sBaJg7jBJE88_S3jWU0uIu8l18NaQjmol_uIeA,8106
-Cryptodome/Hash/Poly1305.pyi,sha256=TSGottirLPIRyivSjZucQB7aPaYfhrUkn8oot6OrmmU,665
-Cryptodome/Hash/RIPEMD.py,sha256=0oRaGuKcTUVTfBZXZm5NZLQAvyPbAhjBpgzN5Kf2a6g,1211
-Cryptodome/Hash/RIPEMD.pyi,sha256=-DzZk9OtiAZE-E2_PCyFz4pHQ3RouoLlUo3Neabf3Sc,98
-Cryptodome/Hash/RIPEMD160.py,sha256=GYDiBSw_D7SCOPA80i3l3mjZsPvmmhZSVVENKwkUs_k,6410
-Cryptodome/Hash/RIPEMD160.pyi,sha256=RQ9yXxjH1BSaU3mwhsCn9-67C0a_Bcv3MDdafQCiuPs,516
-Cryptodome/Hash/SHA.py,sha256=1-O3GFKbm1ht2jV7M9pdKu6GpACsCSnARPHllFcFTAo,1156
-Cryptodome/Hash/SHA.pyi,sha256=RJHp4vuV_19StgE4qxlnIfDltgFjx-L9q6H0tjh-Rk0,169
-Cryptodome/Hash/SHA1.py,sha256=oyz9PdGgaVa90S6O1NPhe7OPq7AvDbJIsH6pICDpTN4,6702
-Cryptodome/Hash/SHA1.pyi,sha256=vNtB_b4MytJq8Io1xufdOO6VL-nMBcCnDPIgJQuNPCM,536
-Cryptodome/Hash/SHA224.py,sha256=RQ3ECOkVJsnh2a5fCPL7Aienpi22lcpsuRNUypkWfBs,6913
-Cryptodome/Hash/SHA224.pyi,sha256=8RsbyIwIfO8Fc_fpWw1MnFw04Z4n-qL0G01qCQZwvx8,544
-Cryptodome/Hash/SHA256.py,sha256=2fhVNPGKrifj49B0ExaxrMCubtDTcQiHarrzN0JPVUA,6909
-Cryptodome/Hash/SHA256.pyi,sha256=zndNEjv6DZOWaOpuoUKsA2hTi2J7-oJFgOQ10sSRnXE,612
-Cryptodome/Hash/SHA384.py,sha256=aDu5NdDbICyrSt2sj0N4fIWwGurEu08WYB5mMiqfW7g,6911
-Cryptodome/Hash/SHA384.pyi,sha256=KIWbD-lBbd7lvWgFquIqUAMaisovey0HV0Nmmq-pvOY,544
-Cryptodome/Hash/SHA3_224.py,sha256=eoXfnjBCNjCD8nNxE8-S4vR7XJZBY11Xf6Lk__fNzU8,5302
-Cryptodome/Hash/SHA3_224.pyi,sha256=Dv2Xk6o9Sm1kcUMeo8sbuuP32HqQhEo_dV9p8yAyc0k,504
-Cryptodome/Hash/SHA3_256.py,sha256=z9IiiZvVV_J3Fpbl8c7-mjDMB_q-5Hrdx1tZpNxLy4A,5302
-Cryptodome/Hash/SHA3_256.pyi,sha256=MLvrZYxvRJ0l9TiGq2axjs66_13px5XlUx_lugQTVxM,504
-Cryptodome/Hash/SHA3_384.py,sha256=dGiHZHjbeU-Ul7zjQnpGfQebLWjixnVAtK_kPMNxIFY,5302
-Cryptodome/Hash/SHA3_384.pyi,sha256=pciFn3aMYw23Y3MZhAbf-cqXuyHIlI27qAmDo-6VtJY,504
-Cryptodome/Hash/SHA3_512.py,sha256=etHVIzMn11RfjalnGPGHqE3G_7iXxwffrh3Gh7ja5fo,5304
-Cryptodome/Hash/SHA3_512.pyi,sha256=HxxfMXlsnZ42ZQ_2YxWZU7aBdGhDPEtAT4EIF77kRzU,504
-Cryptodome/Hash/SHA512.py,sha256=rmSnd1Rka2NCImO0e-suLbzAF9EEXrY1ipnnS8RlG-Q,7732
-Cryptodome/Hash/SHA512.pyi,sha256=VfMzHx-0U4efCyZCrgs_aOz17W8t0ZHL_3uR8zaYzCU,622
-Cryptodome/Hash/SHAKE128.py,sha256=wNVbtzVBie6jczEfjiGjtRflEPEeYWji8CgHK5oak5c,4656
-Cryptodome/Hash/SHAKE128.pyi,sha256=wLhV8lh8YYWzi7PkhAB3_JQn_hOZNvkiZYg-JjiPpfs,437
-Cryptodome/Hash/SHAKE256.py,sha256=dBCwFGVqbythJH6Zy7tGVgtZKo5WCXFP9LVZICEvHjg,4656
-Cryptodome/Hash/SHAKE256.pyi,sha256=9Uq_FaeYwDx_6dLv331Wv1snnGxA2UhFcUdELHkwU9U,437
-Cryptodome/Hash/_BLAKE2b.cpython-39-x86_64-linux-gnu.so,sha256=IjrrTQSqvIqI4glmSbEfiUXEP6tYHlzWZTFVBbUDQ30,20015
-Cryptodome/Hash/_BLAKE2s.cpython-39-x86_64-linux-gnu.so,sha256=_y5ut2Z0kcu-mwy84rLMHQUSt2L9aWqzJKEkA1yyKrk,20807
-Cryptodome/Hash/_MD2.cpython-39-x86_64-linux-gnu.so,sha256=rQWB9TrDzFeUCFSqzzNSfdn97ocBDoiTk3JO3rXBc40,16919
-Cryptodome/Hash/_MD4.cpython-39-x86_64-linux-gnu.so,sha256=ObSaKR5A4LzDrHONuUrstHGVuusCf67LpiPkiKKWgqs,19072
-Cryptodome/Hash/_MD5.cpython-39-x86_64-linux-gnu.so,sha256=9PnxQVfQjEwXvq0nyq7vlQM4IugvzpDGypsKnnwE0GQ,25434
-Cryptodome/Hash/_RIPEMD160.cpython-39-x86_64-linux-gnu.so,sha256=-TxVP-Srj0PU01fqy4qBQhGJf-b5uYex1PCINbAVd3A,27226
-Cryptodome/Hash/_SHA1.cpython-39-x86_64-linux-gnu.so,sha256=LG_T0-TEJW_Tnqf7zuEkDyJkYw4MOhGVKSboR5Qc9wI,84273
-Cryptodome/Hash/_SHA224.cpython-39-x86_64-linux-gnu.so,sha256=apkE2B2fSlkW-k8vpwDHwkhycWi2apBL6m2lNVgWN_s,35822
-Cryptodome/Hash/_SHA256.cpython-39-x86_64-linux-gnu.so,sha256=gmFEw1xVydInNxnTU_qlh-chCQXxL7tSkKOJIFxgnRg,35806
-Cryptodome/Hash/_SHA384.cpython-39-x86_64-linux-gnu.so,sha256=ecCSMuiLu1FkJ_BXytayReFy3LlqQBFIBUfQtu-9-tM,41869
-Cryptodome/Hash/_SHA512.cpython-39-x86_64-linux-gnu.so,sha256=KvsQwAep5oCCYtyA5zEBwSRFDErf4H8sbfk1ht0SMNo,41967
-Cryptodome/Hash/__init__.py,sha256=jxsjQHZzCkphA6DkKfV200k5U6ipBEXf2YI__PQua7s,1119
-Cryptodome/Hash/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-Cryptodome/Hash/__pycache__/BLAKE2b.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/BLAKE2s.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/CMAC.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/HMAC.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/MD2.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/MD4.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/MD5.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/Poly1305.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/RIPEMD.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/RIPEMD160.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/SHA.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/SHA1.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/SHA224.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/SHA256.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/SHA384.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/SHA3_224.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/SHA3_256.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/SHA3_384.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/SHA3_512.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/SHA512.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/SHAKE128.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/SHAKE256.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/Hash/__pycache__/keccak.cpython-39.pyc,,
-Cryptodome/Hash/_ghash_clmul.cpython-39-x86_64-linux-gnu.so,sha256=C3-fn4Ytsqhuha3g94G2_KUoC7zksuGq8a0JCvu5AoY,34203
-Cryptodome/Hash/_ghash_portable.cpython-39-x86_64-linux-gnu.so,sha256=LikiumY1hUnV0JYfsId5e1dT1TQ-cS8NaELusWJ-1CA,18711
-Cryptodome/Hash/_keccak.cpython-39-x86_64-linux-gnu.so,sha256=Vkdqq7VELOneFdAkwd4BU8mFhiq0hAEqo2lEWQQIcGU,26749
-Cryptodome/Hash/_poly1305.cpython-39-x86_64-linux-gnu.so,sha256=6KO3KeOXS31CFmxYNkVPjHQD2DFhG13eLzryCll6YS8,25921
-Cryptodome/Hash/keccak.py,sha256=a6uqDYaAveDMk73ZAK4q2D1GkzHyEmnOgE91Fi5BnsA,7118
-Cryptodome/Hash/keccak.pyi,sha256=pXAZaNfayZCXMxB7IDFr2F8Hi06_hwFB3GXjNzY7sBM,741
-Cryptodome/IO/PEM.py,sha256=TPPdUiCHLEauwRAIZ1Y0uxtIGzz5Vz5eF5EZsP3dGRc,6972
-Cryptodome/IO/PEM.pyi,sha256=a1G07RQtZvEtXHlybxdDcoTPM3nqMbdONNjzcz5HGtE,303
-Cryptodome/IO/PKCS8.py,sha256=z-WihBqgcebhhkkK6jcuXE3-4i34RCXJlqefF3qaOg0,8711
-Cryptodome/IO/PKCS8.pyi,sha256=VxlDc05DEKa1DJ6lGPMbyuFC8XHTjm-pvviw90phLpU,474
-Cryptodome/IO/_PBES.py,sha256=ZAoljR3_saaEGvNmv1Zjkcp-Up925t6lH0GHbPAzZP4,16352
-Cryptodome/IO/_PBES.pyi,sha256=QWJLbYh7ywy2wlRWnbUQG_hqlv6zfobF5o6FKh7reWA,489
-Cryptodome/IO/__init__.py,sha256=QUvnoDWlmuOGEjxXh_uXHMoSmoPi_nSeh-Et7MSofeg,1540
-Cryptodome/IO/__pycache__/PEM.cpython-39.pyc,,
-Cryptodome/IO/__pycache__/PKCS8.cpython-39.pyc,,
-Cryptodome/IO/__pycache__/_PBES.cpython-39.pyc,,
-Cryptodome/IO/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/Math/Numbers.py,sha256=2fQR0NxDh4r8rxGGrIahadGXQ5ssQb2nNPuhC1O9S0Q,2042
-Cryptodome/Math/Numbers.pyi,sha256=DBEdhel2f5i097pHa5ZTccxyGf0rKfhXtJP4GiNbP_Q,88
-Cryptodome/Math/Primality.py,sha256=dElcPU2SbxTu3E5IGj_S18W4tEXMkI0AJNEz8Xd8f54,11352
-Cryptodome/Math/Primality.pyi,sha256=iXAY0gUmciIS_FvH5VJwhQfK-0tDmaH2vcDLHHFyxIE,823
-Cryptodome/Math/_IntegerBase.py,sha256=4fofn-eRAi5h_RTX4w44_fh-S_r36GISV2nbLtjUJ5w,10486
-Cryptodome/Math/_IntegerBase.pyi,sha256=8robOel28h7YCFIOEWhW-DtJE1GLzdowmDkWyUaWQR8,3417
-Cryptodome/Math/_IntegerCustom.py,sha256=viV3iZBDGkLLqsfBgY0ebmaAyXjTRdEKaMc5fi_J6x8,4016
-Cryptodome/Math/_IntegerCustom.pyi,sha256=s9UZigBEgUvHS4IOdt8jXhsZ33O9j19p7lieob1R-EY,135
-Cryptodome/Math/_IntegerGMP.py,sha256=kWG3VAWTzO1lJO0cpS5rk0Vb3ldplAHNpF3yu4ry69c,25317
-Cryptodome/Math/_IntegerGMP.pyi,sha256=UcJOGMYT1d-G0PjbC5ByShFl5oyorFR8h38fFt0uY9s,78
-Cryptodome/Math/_IntegerNative.py,sha256=j-v3xELayy7C0lOgOlDR4hyUDHc0TzUIguUBh1tJDn8,11076
-Cryptodome/Math/_IntegerNative.pyi,sha256=pZaN1xXnB8u7VfrMgp6jqi_jCaJ4x4t0Ecs7qZ_2x-4,81
-Cryptodome/Math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-Cryptodome/Math/__pycache__/Numbers.cpython-39.pyc,,
-Cryptodome/Math/__pycache__/Primality.cpython-39.pyc,,
-Cryptodome/Math/__pycache__/_IntegerBase.cpython-39.pyc,,
-Cryptodome/Math/__pycache__/_IntegerCustom.cpython-39.pyc,,
-Cryptodome/Math/__pycache__/_IntegerGMP.cpython-39.pyc,,
-Cryptodome/Math/__pycache__/_IntegerNative.cpython-39.pyc,,
-Cryptodome/Math/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/Math/_modexp.cpython-39-x86_64-linux-gnu.so,sha256=5-vEIHGvfjoUMBDJNd_h89Ywutz9V0sgLBi0DgzUUkQ,207274
-Cryptodome/Protocol/KDF.py,sha256=nmwDb1qTj5fHNSWZdLVwl_CyjlbOjM6rUDSl8wNLcUM,19897
-Cryptodome/Protocol/KDF.pyi,sha256=OfuAajDDJIDIny-zMuGsfhqCLZr4x8bZnV5Tonbg00E,1383
-Cryptodome/Protocol/SecretSharing.py,sha256=ZNw_YhVs4TYrJ7075g6WwaiiCJRRmy0fpT_LoEMV3Ww,8794
-Cryptodome/Protocol/SecretSharing.pyi,sha256=-lErV2RvaNPuOA0z4c44WmNSu9irCw_DDb7wPgCS2BY,798
-Cryptodome/Protocol/__init__.py,sha256=eXlh5nJVd6NoXfUjJ-mNGgm5oE8r6MYDBOIHXWdzTPw,1548
-Cryptodome/Protocol/__init__.pyi,sha256=RNdrwMgjt9b9LmckdRkaYYC4PCzNV-1Hi2T3B2MHgds,43
-Cryptodome/Protocol/__pycache__/KDF.cpython-39.pyc,,
-Cryptodome/Protocol/__pycache__/SecretSharing.cpython-39.pyc,,
-Cryptodome/Protocol/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/Protocol/_scrypt.cpython-39-x86_64-linux-gnu.so,sha256=9FXGunId0uwDPBugaPMcsPK4TrHbmqWrhDAmO4DpTBA,16510
-Cryptodome/PublicKey/DSA.py,sha256=r3Vo6fyCWAngyfI8hWsrOms9Srj_lvzIfoHcdlwFMCM,22363
-Cryptodome/PublicKey/DSA.pyi,sha256=Q4s-ZAx5xV8ue2lxfVhOtQQzYuawu3qhDz0O5ThoLdM,1353
-Cryptodome/PublicKey/ECC.py,sha256=62eaTeNl_6VcHjwyaA28vcjmWM-WEKMnFdq-3GOr8Lk,42053
-Cryptodome/PublicKey/ECC.pyi,sha256=KhDMYrqTioBcZa0FWeMdJelJWmN47M2KWfS7y78ILVw,2358
-Cryptodome/PublicKey/ElGamal.py,sha256=qe1JXZRLCnMQO8u892VZA80u92IBXnTq-rV0CcvMKa8,8631
-Cryptodome/PublicKey/ElGamal.pyi,sha256=-s3ty0v_o-8Rq8_nrYh32Vo6ihr8OaSWdc_H7_CVGCo,674
-Cryptodome/PublicKey/RSA.py,sha256=jn4L8zDEPRB1haBoVKikrgUb9cOl5Dg2fU2gYiGx7J0,28834
-Cryptodome/PublicKey/RSA.pyi,sha256=53HgZFdczCzVYl8hVQLay9RA0KqcVBGtyKG0u2r5S-8,1837
-Cryptodome/PublicKey/__init__.py,sha256=2yP0pjkXKBr0C0QA5xS8Jxd9nHz9VT5uoNIS59KC4Kw,3123
-Cryptodome/PublicKey/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-Cryptodome/PublicKey/__pycache__/DSA.cpython-39.pyc,,
-Cryptodome/PublicKey/__pycache__/ECC.cpython-39.pyc,,
-Cryptodome/PublicKey/__pycache__/ElGamal.cpython-39.pyc,,
-Cryptodome/PublicKey/__pycache__/RSA.cpython-39.pyc,,
-Cryptodome/PublicKey/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/PublicKey/__pycache__/_openssh.cpython-39.pyc,,
-Cryptodome/PublicKey/_ec_ws.cpython-39-x86_64-linux-gnu.so,sha256=34CMkryzmqEFTIrxn9Ri1rNVCjSlAqgDL1cmaTZ7c0c,1000375
-Cryptodome/PublicKey/_openssh.py,sha256=t8Z8fOJDh64ZXmqpSCqlds-OKb2C5FncQmqCstfGImM,5146
-Cryptodome/PublicKey/_openssh.pyi,sha256=ywCy9UDu2_AQI60ChWxGxyqHiZoYwMKC3TVXJn_ZVIM,324
-Cryptodome/Random/__init__.py,sha256=EJnd9lTXo5ZFvmgrAzv2wHX8b87SNPO3sDGB3UofVe0,1813
-Cryptodome/Random/__init__.pyi,sha256=ieifhoMB2veKusRRBZWQp6igPri5027VrqfddO5b-WU,367
-Cryptodome/Random/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/Random/__pycache__/random.cpython-39.pyc,,
-Cryptodome/Random/random.py,sha256=aWcD7vA4eWrRmjIkho-YGxbrVC3anFTzHa_N_7Sds64,5246
-Cryptodome/Random/random.pyi,sha256=Lgo1h6wtyUDhEuroDRyt-eYvPFEgQOo0fxfAE68S2cM,807
-Cryptodome/SelfTest/Cipher/__init__.py,sha256=nI0MW4-BVQHwCwYqgWxa7MhL9OxYmwYSIJcp5qe_n9Y,3708
-Cryptodome/SelfTest/Cipher/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/common.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_AES.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_ARC2.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_ARC4.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_Blowfish.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_CAST.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_CBC.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_CCM.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_CFB.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_CTR.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_ChaCha20.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_ChaCha20_Poly1305.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_DES.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_DES3.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_EAX.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_GCM.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_OCB.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_OFB.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_OpenPGP.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_SIV.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_Salsa20.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_pkcs1_15.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/__pycache__/test_pkcs1_oaep.cpython-39.pyc,,
-Cryptodome/SelfTest/Cipher/common.py,sha256=HpeH9ouK2m5kcrfcb0vRSw2q1LehsuicQfGuT1jnclg,17016
-Cryptodome/SelfTest/Cipher/test_AES.py,sha256=PpAFYq6sGbzd-tFNi--37LLD-hI_A6KCw4J5DB5nlDo,71827
-Cryptodome/SelfTest/Cipher/test_ARC2.py,sha256=gOXQEu0PBG3vD7D_sT7y0AqfrXfAA4U-qsbArNOujBI,6550
-Cryptodome/SelfTest/Cipher/test_ARC4.py,sha256=5YgyIIhAn1_Ca5q3Sh2Cx1yLsQhrZK6t0aQdAVtdCdo,24749
-Cryptodome/SelfTest/Cipher/test_Blowfish.py,sha256=fC6tYqaKzCuo7gIqyenNsoxvS-hSyC8FAkqUIadrv_w,7318
-Cryptodome/SelfTest/Cipher/test_CAST.py,sha256=WjrbmsHybravO0qPALVVyBRskQTlRiemhsh-ud5MvxU,3367
-Cryptodome/SelfTest/Cipher/test_CBC.py,sha256=dr5yzeU-HaLlTFVaJeRjm59uZuJYjdQqFvFAPoWNSDg,20419
-Cryptodome/SelfTest/Cipher/test_CCM.py,sha256=FB0ElwRqrWNUlOmeNup21HC2MVCxRObrRzG_8UJ2WVw,38039
-Cryptodome/SelfTest/Cipher/test_CFB.py,sha256=WNkgDVTR1BacaVPnVDscddLFkfAUENfABdR6enu4CtM,16162
-Cryptodome/SelfTest/Cipher/test_CTR.py,sha256=X2d0y1ZktQd29BxgEmeiC86OIUGgVrl_41dOuxJyHX0,21402
-Cryptodome/SelfTest/Cipher/test_ChaCha20.py,sha256=0Aj4tJWSxW8Lbn5EbXk9PyNbTDB9zIOK4_a4k0-NBYQ,20017
-Cryptodome/SelfTest/Cipher/test_ChaCha20_Poly1305.py,sha256=pKisgjpYWUB6GE-Vj9U_wdWzNGArBIYTF0fXwvKhKXQ,31070
-Cryptodome/SelfTest/Cipher/test_DES.py,sha256=5nGk-NGJg4iap191mOJgiNpLgjZ38Qwq_5oktYz58cs,16027
-Cryptodome/SelfTest/Cipher/test_DES3.py,sha256=DnPIMMsAf2N-yl0j7JILr1GGvJNzAi3A4Qsi3P-3HE4,6724
-Cryptodome/SelfTest/Cipher/test_EAX.py,sha256=b-qiqzx_wpBUDaQ1cgybM5V_Eoh_dJte3TMn4-uFTpc,29491
-Cryptodome/SelfTest/Cipher/test_GCM.py,sha256=p-4TGNvjhCY2EZl1HrVpxU5X0o3cE4BYJP02u3x5-MM,38246
-Cryptodome/SelfTest/Cipher/test_OCB.py,sha256=-lvM3XRSouW29b1m3bhhno4TgKI9TUI2DKxBbfd1dCA,28406
-Cryptodome/SelfTest/Cipher/test_OFB.py,sha256=bKcBCLL39YIz8xr0YEGySWWJxxzQ6pgmRLZv2FxCxUo,9327
-Cryptodome/SelfTest/Cipher/test_OpenPGP.py,sha256=Q4rOCU0axh_z7U4MSUGda39nujktPlBUaqVVfE5kMhs,8497
-Cryptodome/SelfTest/Cipher/test_SIV.py,sha256=h_SPw8YaOZOQ4Bw7BCRms9K7qbfY5byDzLbisDLNtbA,21125
-Cryptodome/SelfTest/Cipher/test_Salsa20.py,sha256=1AuzeYLpnYhuzdqqbdkUguIpZlT7kbbpParNYF220QY,16767
-Cryptodome/SelfTest/Cipher/test_pkcs1_15.py,sha256=s_t7dHvCIKc-QobF8CJHZcRsb1Q4qRUslxEkih19ZVA,10594
-Cryptodome/SelfTest/Cipher/test_pkcs1_oaep.py,sha256=s8-2D2puFnmmUcbRkcXro8h1CE4cAhYO_8_rYjChwV0,22998
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCGFSbox128.rsp,sha256=jU0y_RjZc7Rae4Ra71JZdnuZjOVYRxAp1IGe4aYSabY,2787
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCGFSbox192.rsp,sha256=fjvAZvU59Szb-jHISNXS2eJwyxCNSfUUZtuj4EBBL3k,2609
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCGFSbox256.rsp,sha256=V9hpYePiv0Idf-261mYVpmHGtDFVA10iyd8R-x4dKpc,2367
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCKeySbox128.rsp,sha256=dbpmQvcgZvrPzNBCOxGnqCQuEKuKvLOZWP8ECuNw-V4,7990
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCKeySbox192.rsp,sha256=lr4vtlL_4gVhySVIlxg01kVY351NpTNfhutiXPLENYI,9874
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCKeySbox256.rsp,sha256=JELpUAjt036FZn87hQAiV4bwz3rXlHjR2ZStkB9sM4k,7154
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCMCT128.rsp,sha256=jk8YVL-7jYSPWGHPshIQTfYb1tEUKXiSYArqP7ovJ2Q,37376
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCMCT192.rsp,sha256=LTXLqH_ODWAW53y2Xe_bdALPxDjTOhMtyvAlvtN-9Gs,40576
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCMCT256.rsp,sha256=I7H3lzMhXUSCCp6MTV8y2GKwnyHkCng7DglNkVeVmL0,43776
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCMMT128.rsp,sha256=hgKmNyD7pJJbFBOF9ZC-8z4Q0qYcLJPX8wsLgIzLJ74,9654
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCMMT192.rsp,sha256=kxK_gWyWXZMpsixh-Nfz5zTpwORBDEvDdHh_Wys7bBI,9974
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCMMT256.rsp,sha256=vfQ3mslBnS4ejLIFaGEapETh8rTvfTuUOK-kNqlwBLc,10294
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCVarKey128.rsp,sha256=CG8rZuSGmdaCofMPCRv-RBlW8CymmSNf49_s_HBsr9E,47849
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCVarKey192.rsp,sha256=IK1mvGNLPgnAyNACs3RsXPItkRb4RKcm9ZYQPZkzn1M,77929
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCVarKey256.rsp,sha256=3AyzgBafQ6g8Sv-G7rFG1YYafgJHkIEG-Lb9N5Aul_g,112105
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCVarTxt128.rsp,sha256=NuIPk6FOKn_HyvD0eKbMUEMelNXn203qZkLFhDx4fd0,47849
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCVarTxt192.rsp,sha256=myc4SHgTQ_R0NslkNNBvxIemJm8ycws1mt0fvoPOX3M,51945
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CBCVarTxt256.rsp,sha256=E8WwhsZMgW5D_8ZXtgLP5qcjG-qCl-vJqWsJMtNR8VU,56041
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128GFSbox128.rsp,sha256=PetBa4V9l8tZucoVdmnTcG2yxGmXV5zggGAs6BjyJrM,2790
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128GFSbox192.rsp,sha256=4pLczu5j53_ZEJN3QbGtb9s1BPckiwM-B4Xy9FEmmfc,2612
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128GFSbox256.rsp,sha256=2U8vwvdS2yN5UPGAxKcHq7jHwFymgHfCGbNNyg5nshE,2370
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128KeySbox128.rsp,sha256=o87VaOGVb2A0vBEzf8wxTcgBKdJ7qyv5aTNDJrdbgSk,7993
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128KeySbox192.rsp,sha256=aOrrWPE21kdquhb2-NF7BV__wJh2VfWXyZ2yEoezwGI,9877
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128KeySbox256.rsp,sha256=PM1Kl9FkTLqkBPAXKuk_0hjbi-ktnL21YZ6UZJ4oaKQ,7157
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128MCT128.rsp,sha256=qssStFCa3Xi9-x0RB3Y4hQUXqw1vAwXnH-cc8vuQonI,37379
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128MCT192.rsp,sha256=uvFr2372lGeK9DD4S1ulwwqAXusEkc3Aok7Zbu6-WME,40579
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128MCT256.rsp,sha256=ptLz5OsPykXQx_j4_BxRX1OWRxKbRsdfvGFG0hi6uBo,43779
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128MMT128.rsp,sha256=QysTd7nANa2-aYZZtjeSnvqjfkmsiBasoMN1FqmsRQw,9657
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128MMT192.rsp,sha256=SCubxxY-Xz2uJCsD_N3Gm4PcH0f_Gfrj74Opar0mIJU,9977
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128MMT256.rsp,sha256=C2AkiXUSrDlMAxFKkaPxdDBQH0Codt4YDWAI4To_H34,10297
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128VarKey128.rsp,sha256=lMpe6dc1E2S1BTK1CSJubsXCNUcylc1Juyj0CjZX0v8,47852
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128VarKey192.rsp,sha256=JRwBrwNDy5npksDoi1UwjnL40vGWEeJG7cezM7Ep50w,77932
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128VarKey256.rsp,sha256=rfwz1yvXvU4DN2ZxNkPFE5wajQcREZbO76mvOo_GLsQ,112108
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128VarTxt128.rsp,sha256=UFUNsGaH5PAijmRJ3wli320O0u4smpQMvxKLaTr-aU4,47852
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128VarTxt192.rsp,sha256=a52sEs1Sn_A1CMD16vC-mHDAw_CD2dZcGJolAcFC46U,51948
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB128VarTxt256.rsp,sha256=_FRB9oN5Q-KyVVbNMsnLionMBYFVfx7CX_rSb9Lmg5o,56044
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8GFSbox128.rsp,sha256=hMQY14LzloH3lWaW5Wa_w_xrPmYC_4-mkt5zbjlSyY0,1948
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8GFSbox192.rsp,sha256=PINYd4KRk623-kA7c13ekEWrxbrhidZOTNQVWCZSw9M,1890
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8GFSbox256.rsp,sha256=VUbW4eab0v3SNO5BRdNcd6bGXxaZ4thkxOfq6S7Dw-U,1768
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8KeySbox128.rsp,sha256=lXccJkglpMet2HdG_hVxPHUA5T9ye7w3RNtXbROqz2Y,5471
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8KeySbox192.rsp,sha256=dde2y-QM22fXMMdRL6A8DIofghIZihRBxmC2w3HZMy0,6995
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8KeySbox256.rsp,sha256=41SLZ_y0h0qdyzfHWhYSkzu2e7SDes8nTzHvpvkdd40,5235
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8MCT128.rsp,sha256=D3yf9MGKx78BNoN4GkNnHFwco6enBlY_G0wf07FEPxc,25377
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8MCT192.rsp,sha256=MQumbDtwDZOOVY66sOODkLjiygHMwRF5iwDC1_7RpdM,28577
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8MCT256.rsp,sha256=DxHJ-AmB8z--Ly3Kt_inweIwUVECXWgBXvujaIbD5kY,31777
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8MMT128.rsp,sha256=lP20fsuv0fqhnbdWG-YiHiDp8tNPjdVuIRc3wiE20nE,3055
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8MMT192.rsp,sha256=sBqsFN3TMkQO7Zbl7I_n8sloD52zxeLgiq5zYH4Oyy8,3375
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8MMT256.rsp,sha256=4NOc6LASPWEnD-50boVm5MomaWhYTYbQhzLCPybGddo,3695
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8VarKey128.rsp,sha256=mvHAmSr092Z32a3kveZlNruin3zWe2tIQpqqfWTeXPI,32490
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8VarKey192.rsp,sha256=01L3kHeD-LqSfE--mpFjnGGkeenqOSas8s-I82Vfpw8,54890
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8VarKey256.rsp,sha256=6Aooiamd3pB-ZUOmrBcsCbaXwR7BI-i9QCM5tWY9r40,81386
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8VarTxt128.rsp,sha256=jrHzMizQegT39uay0-m_U_fCYRp2SXSNNb162zb4m9w,32490
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8VarTxt192.rsp,sha256=D3mN2TULDZ9UWIB5GfZo27SlYSUCCpN1pSCOpf9gQvA,36586
-Cryptodome/SelfTest/Cipher/test_vectors/AES/CFB8VarTxt256.rsp,sha256=PMX7Tm87AiMU17lrRB5SBlgUkfCQMurFhZ8U1gXd_DM,40682
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBGFSbox128.rsp,sha256=NqmhVuhGhk3KiDpdoLHj2aStP0mrQ8ltYMAWPf09V7w,2787
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBGFSbox192.rsp,sha256=i8YFQ_bSRpAARg3o0cypWgXVNg4LJQEpaT-MueuBi80,2609
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBGFSbox256.rsp,sha256=QQvrbGgDg13HR6sG9Y4NYJG9Fno1GiDhksD7WsbEnGI,2367
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBKeySbox128.rsp,sha256=zYZzoBHZJywm8-PXGkdh0M92lt69q1Xlez6pT36jXyM,7990
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBKeySbox192.rsp,sha256=LpaZlABRpjAHBI6Wb5FrgtYQCgYiqQJ5pA5LgoS6sv8,9874
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBKeySbox256.rsp,sha256=sJzuWVShDIACWoUw9ZKIfuPG4bBl9dqvZ0_nWV5Ykvg,7154
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBMCT128.rsp,sha256=AW0pmMOE2FdpcJOY0OUT6AluNbIJmY4ymqsTryRBj_E,37376
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBMCT192.rsp,sha256=hff1UxqKGO1wIP9SQ2g6OCWsoBdnivefOw0SrKkX-q4,40576
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBMCT256.rsp,sha256=8ixrgFsp_27dSKskpR0Omy9FE6nQw9Q3ZiwJwadbK_s,43776
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBMMT128.rsp,sha256=aEps11PAOdDX_p5pzR8IrK4oLaGal6NVHYTvimGheV0,9654
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBMMT192.rsp,sha256=UN9R1JN8LPSgp7m-YVbnwrxw5u6wu9_n39T5vQmleMY,9974
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBMMT256.rsp,sha256=ULROQmjB5MnVIhWgp2mY8hNbTzxZsw10EtMDPncNq40,10294
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBVarKey128.rsp,sha256=-wNByOr7EMG_6ZXa3usWmI7DE6SxaYhCJiZHQhrrMQY,47849
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBVarKey192.rsp,sha256=aAE8BEABWnKPgbvs2OtQCb5UAOLVoC3X8gDfZd4mw20,77929
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBVarKey256.rsp,sha256=2Pzwktz9Ff5i7lNCvHqjmD1pYDUCCjpsGoOBDfbhUeQ,112105
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBVarTxt128.rsp,sha256=Jowo6O7I1UKWPGQUBL6lPKOVbSQecaTv4eFJoihGrmA,47849
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBVarTxt192.rsp,sha256=DjaxbJUulI8uZ9Aw_N-f5OZijPScGK-1A62TbI19eag,51945
-Cryptodome/SelfTest/Cipher/test_vectors/AES/OFBVarTxt256.rsp,sha256=bupYeO4v-gv_bLKAgIV4CN6_J4odWn11xE7boL8Qjtc,56041
-Cryptodome/SelfTest/Cipher/test_vectors/AES/README.txt,sha256=60TZ8t3yT6VSsa8Em-WuA3U8b4YZxo5ZacUyGq6G890,360
-Cryptodome/SelfTest/Cipher/test_vectors/AES/gcmDecrypt128.rsp,sha256=DR-Y0Mnhdu3h8-hUhN0T3pLDQ2ypffN47DSB4EwZpzI,2748606
-Cryptodome/SelfTest/Cipher/test_vectors/AES/gcmEncryptExtIV128.rsp,sha256=MBViNvdosNgeWKPlvTvXnOKUz57wugqEz3uGnInr2f0,2930939
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/README.txt,sha256=hDeBnqtd185cf-MlzMsAUHtTQMTQA3AWXlRwieQu_NE,195
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCBCMMT2.rsp,sha256=w9zaXFSlBUkSgOd9EIv-uJjZMd5Kq4CCh1Mw39Ef5SI,6492
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCBCMMT3.rsp,sha256=01k6aw7y1P3YU1O1tMGJxfzU_hQTSv-cu-ZFLwUoO0I,6492
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCBCinvperm.rsp,sha256=_zs_hHhOHk8R0jqalJfZv5W9YLR0JZwouXlUNVb4D70,15890
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCBCpermop.rsp,sha256=Jo3PnThZZS_EbimNgAhLZ_885v2CYFgUSKrLzInKvpc,8020
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCBCsubtab.rsp,sha256=5900Cila5IOo5VpUDtrB8RDRtOIPWsrroTAGsc4oULM,4819
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCBCvarkey.rsp,sha256=2lA8JmREU52Vp9X5pJWQa6rLCMzGYnUDi5VG6Yr5CYA,13915
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCBCvartext.rsp,sha256=6qE0bIigNfJslrVQDGWZV7YkXBG3-hwOgjsuIhzyQrc,15900
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCFB64MMT2.rsp,sha256=TpBVhZUmX2C4sRoCDROvQDuQv5gVOk0aFxm1pp6bfA4,6494
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCFB64MMT3.rsp,sha256=mMwx1bCOtw0AcJrsYxrhmBycW4B3VaHvfgPGHrnpHKs,6494
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCFB64invperm.rsp,sha256=BVMb18Mm1Hin3tgHjnxrfPSb4P4Y2mvfh2B9V5Zy9Xc,15892
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCFB64permop.rsp,sha256=6ZwOKZ5Ej8ErjfZEnWOBT19WgTx5Uyq6j0bi1Qr6Vu8,8022
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCFB64subtab.rsp,sha256=RPLhWK13522rsiUgBnbgCk57_yDSEbqtXY1QZy8SRQA,4821
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCFB64varkey.rsp,sha256=whxavgBPUbeGwSAlDqy1wWgELMtQs9PQE0LUzFzcBsY,13917
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCFB64vartext.rsp,sha256=DCRrqKJ3cE7sPTd5Nov00szLB3UsZvhhIIlYyXClhjM,15902
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCFB8MMT2.rsp,sha256=BtKIJNMPMQiuTRUb2GVrFYPfeMkFvGUkpzfQcj9hmKo,3413
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCFB8MMT3.rsp,sha256=iR2pfe1o2D6uXaWhYIyI104EiwMoSh_xQvlACak2jdc,3413
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCFB8invperm.rsp,sha256=y1BhaDajhJK6sgi_WoCpivnunEcQz3s_YP6S0cx5cYY,12307
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCFB8permop.rsp,sha256=UunDHgTlkgu5SX-_rbwru7Cb14r71p_52mGgk1eA4Yg,6229
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCFB8subtab.rsp,sha256=Pz9gt4Yg56ZhpJaNdWIXm0rrEuFgRDVJE3BSRXRXB4I,3756
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCFB8varkey.rsp,sha256=OUnAab1XVxlUkcHR0hpZM4WzF4aLnkbPorYPs3LeLlk,10780
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TCFB8vartext.rsp,sha256=4qzDlfCrKSgqizeSaWSSCbdMXu7wWupnWYI2J9Zy0JM,12317
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TECBMMT2.rsp,sha256=iD7ZSuiJkln6dzwrs9CmSXt6nd-rkVK1dOQ7Yvuq-jM,6032
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TECBMMT3.rsp,sha256=4jD9aPnKbr9QvC6bBzzznaFXknd2ryXoUG2UyAXxVz4,6032
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TOFBMMT2.rsp,sha256=90ejMmcQJAAva5oDHZfVFtV8PfJwcCAJ-VZvrvdVP4M,6492
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TOFBMMT3.rsp,sha256=0C3349hXpEGwP8fryw8jAzo2yxlxHUloeMyALrFyxEg,6492
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TOFBinvperm.rsp,sha256=jhBskIqunOstw3z9ECnLPjY3le5CV3GkbsZimghIFik,15890
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TOFBpermop.rsp,sha256=9kwCTwvwrMICoK13_yYU9l8mJk_5N5_91bqMFm56aws,8020
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TOFBsubtab.rsp,sha256=sVfYcy66WOKFcT4vfy_ykavEt8fFP-5TzUNdR0gs5sY,4819
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TOFBvarkey.rsp,sha256=HmcozNR9lqGmiNcyI9QqAI3GasIQfkuWK6LmE52A2Ak,13915
-Cryptodome/SelfTest/Cipher/test_vectors/TDES/TOFBvartext.rsp,sha256=kkrk9qQzO-tzAH0YYR4QtyGQAfyiu_JQ8vIv0-KcvBg,15900
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/aead_aes_siv_cmac_test.json,sha256=pUC3FoitW8wK8OntE4DlwN7iquDH9BLRRf5uBta3kGI,405682
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/aes_ccm_test.json,sha256=zus5i_I7cLNlM2essEx__Ae4NrtPlJ3Wo3AwfTJbpQA,236978
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/aes_eax_test.json,sha256=iYDZEI3B_4j0OXdyfii49rIDQeaWpq-HKBC6J5WND_4,84816
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/aes_gcm_test.json,sha256=xj96NNX0m-Uvjy9aXEd1C0GK8wQmWGn3fNS6y44dL1E,133455
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/aes_siv_cmac_test.json,sha256=weGSoUbwEUmiIjpWUHs6y2XT0rVgxZFcGcxGwLKh4v0,177708
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/chacha20_poly1305_test.json,sha256=S17zmflWIUIn2lScioTZ0JdTjACj0THeV0ithQgQWuw,196184
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_2048_sha1_mgf1sha1_test.json,sha256=k3KUn7gP3nLejBN_1jsVYlXKn-o2iQQzQ-pZZBFVkLo,35337
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_2048_sha224_mgf1sha1_test.json,sha256=DB8sKJtW7C6MixB6xl-LGZqUTxGRBYyOFNUAAezkvp4,27669
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_2048_sha224_mgf1sha224_test.json,sha256=gomskn7LU4tbT0n6z3CqDNgIuGrv_k31OzJcN3gG_e4,32722
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_2048_sha256_mgf1sha1_test.json,sha256=qn09ZvlxI2FtRB1j6nkjht9PGLV3AuRyVrp9S9fMzbc,27647
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_2048_sha256_mgf1sha256_test.json,sha256=BjZddqcYpQxuI1WDknKJIDrt8MRt-WUf4l2QqSbf7rU,36411
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_2048_sha384_mgf1sha1_test.json,sha256=ou0E0xKYvocIgueLOXXGVJqvJm5WRsVoFjVJGE9UoDU,27583
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_2048_sha384_mgf1sha384_test.json,sha256=ssgZNn8L633XaGD8mBL1lkk7HgZrMNKoY2VkHoUM5Zc,31284
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_2048_sha512_mgf1sha1_test.json,sha256=pCZoGS3QUPDbRjs5-evo_Yp95r-RJBlZoA_Et8E8IKc,27517
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_2048_sha512_mgf1sha512_test.json,sha256=rof_1bNM5JD2FFAISphMxFD6upRpDo6MZnBNQmKI8y0,29546
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_3072_sha256_mgf1sha1_test.json,sha256=gd8cnYuJlqQP18DopU4aMaOOtp_MQslrdjBtkstmTr0,38507
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_3072_sha256_mgf1sha256_test.json,sha256=zY8aRXZ7ZiyDsuizeprFoRMN2Pmp9FrJzrtqH2vvtwo,49871
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_3072_sha512_mgf1sha1_test.json,sha256=2eh490VoYTgj0dtpM9aFIVrNvtH59sxDonPiQ3SZ60s,37409
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_3072_sha512_mgf1sha512_test.json,sha256=KEr7XjVuzjRdG1qfVjBWVGEdUhY2mg9zD6jf9Q8VPyw,40890
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_4096_sha256_mgf1sha1_test.json,sha256=WNIxqjFQnECM-q0FqGBHMU8UqXffYunrgDtWF3z1Yd8,48665
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_4096_sha256_mgf1sha256_test.json,sha256=W5PFMgMBr7LrftEMF41eUXtk5gOWYTaPdzy0r1y4McQ,63366
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_4096_sha512_mgf1sha1_test.json,sha256=-iuHeAw8VvKt0LGqa6dS16KVvOlbZIftcaKqpkDx1TI,47299
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_4096_sha512_mgf1sha512_test.json,sha256=MgaDMR-MzZxxcCpTuHkJNprvGsQV-gUOzVTDstNREy0,57400
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_oaep_misc_test.json,sha256=jMh3_BLOIzzV1QZUbWxe4mNwVkmHF302u6wJki3SITk,1262220
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_pkcs1_2048_test.json,sha256=UoeSkKnXl60751hJ_G7856k8YhkfMHNH2EAx5eFQsF0,292951
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_pkcs1_3072_test.json,sha256=2DTy-Osluiq2MqrzmAHqxACQ5HK1a2BMQGpXW2ZdP88,423258
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/rsa_pkcs1_4096_test.json,sha256=ZIMdsdGrwxFehQuFZCCKp40l3uZKH5WcvXUstDuxku0,551672
-Cryptodome/SelfTest/Cipher/test_vectors/wycheproof/xchacha20_poly1305_test.json,sha256=F4Kso6XhhcUv1Xa5aGfoEeJKV79II0u59xN0K1MDlOk,181687
-Cryptodome/SelfTest/Hash/__init__.py,sha256=um4TKfVp-bYbGRIbSdPzy2Tal_tEmREk0NiJkCTRwz4,3533
-Cryptodome/SelfTest/Hash/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/common.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_BLAKE2.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_CMAC.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_HMAC.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_MD2.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_MD4.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_MD5.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_Poly1305.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_RIPEMD160.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA1.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA224.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA256.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA384.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA3_224.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA3_256.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA3_384.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA3_512.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHA512.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_SHAKE.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/__pycache__/test_keccak.cpython-39.pyc,,
-Cryptodome/SelfTest/Hash/common.py,sha256=C2jFAjRERl6uCNr12bwRTTighWDRpNiyAbXVfc-iSl8,9964
-Cryptodome/SelfTest/Hash/test_BLAKE2.py,sha256=vpPxSXeaZGIo6iprJCASNjuz4pW8epk1gK3C0ygjgwA,14953
-Cryptodome/SelfTest/Hash/test_CMAC.py,sha256=tj7t9augqONo539ZaxxXuNGMShgPMSs3ZNDj4RJBGHs,13946
-Cryptodome/SelfTest/Hash/test_HMAC.py,sha256=S-oBHJeQ4M8xdSfuq1IjYQB3BVqADGwC4aXpoFAGBc8,13568
-Cryptodome/SelfTest/Hash/test_MD2.py,sha256=ElKzN0tL3U-0TeLVP0e7I8txskHXSA8Ys63aYjLW_BM,2336
-Cryptodome/SelfTest/Hash/test_MD4.py,sha256=9SFHZcbB3M2AhjYtK-Y9w0tWE_cdmeo2QrHvl3f9S4U,2359
-Cryptodome/SelfTest/Hash/test_MD5.py,sha256=Bj6C548u8dz0d-pGxg7JZlezPWuXfD_TBnj7QOJGtxw,3300
-Cryptodome/SelfTest/Hash/test_Poly1305.py,sha256=2_ZTIuatKcaI0ATBGQm0DicKnXMTUqdu1nC7g6rNg10,18406
-Cryptodome/SelfTest/Hash/test_RIPEMD160.py,sha256=V1q7YGF0xKe0DeXZhAmtc4hIbbDKhEpjkNfPsNkB-qE,2675
-Cryptodome/SelfTest/Hash/test_SHA1.py,sha256=CrQWc1iCeKmVauPe5KqrBS4kt2qE2Ocwf365BOThGPM,2960
-Cryptodome/SelfTest/Hash/test_SHA224.py,sha256=Dz7sRLuh-AJZXarIZ7Lza4ZUy9tNNT5pUSsAm5Q6Ax0,2541
-Cryptodome/SelfTest/Hash/test_SHA256.py,sha256=pmV4r5WojFZmtVWAIFAl1uO55GO7wMWXCdE_I2e87J0,3637
-Cryptodome/SelfTest/Hash/test_SHA384.py,sha256=6_hL7uoZdQYAEoC0gT2mYuZQuCELHe9ebxcFhQZd4BM,2722
-Cryptodome/SelfTest/Hash/test_SHA3_224.py,sha256=S3PBL2Jqiby-Fmrj8SfU9OHoIL6ggCkWT8wbBJ69kBo,2874
-Cryptodome/SelfTest/Hash/test_SHA3_256.py,sha256=gQIzg3vguubWE2m3Dg0GiKXrWU_0aEQUvYjO5HE_LjE,2875
-Cryptodome/SelfTest/Hash/test_SHA3_384.py,sha256=iKXhYtyaa85GiNJ5y0C97JSWy2JLAR88bwZEgt-jttY,2874
-Cryptodome/SelfTest/Hash/test_SHA3_512.py,sha256=Z05p5vkxaJFoaxuPtZuFJTZxMyqRfzIFPE3z9SuBZmY,2875
-Cryptodome/SelfTest/Hash/test_SHA512.py,sha256=dGVeICdKxE_4mmpgewgEjnqzxDU0_ZYr5qt4LKMIO9c,5302
-Cryptodome/SelfTest/Hash/test_SHAKE.py,sha256=e5J4G8UNR-h5_ucZL_iqr1GlyWUY0ILyvOgqmYiGz-0,4786
-Cryptodome/SelfTest/Hash/test_keccak.py,sha256=ZdxMKcZf5zTOjcguA2HBnreYFZYWUwKBlsvPqyw6v1E,9160
-Cryptodome/SelfTest/Hash/test_vectors/BLAKE2b/blake2b-test.txt,sha256=6DYRIlZ96-rzmjXAmmoGiEIsAQqnQpIWnJqbDM26AkY,135750
-Cryptodome/SelfTest/Hash/test_vectors/BLAKE2b/tv1.txt,sha256=_fgZKswUlDW4iyAtEb4h0XcjY0edq6M0CyfEE1g0ncQ,4741
-Cryptodome/SelfTest/Hash/test_vectors/BLAKE2b/tv2.txt,sha256=hejftkYHZ5waIFHWX_OacTNfVyfdIwWhuzF0lL1KKps,9060
-Cryptodome/SelfTest/Hash/test_vectors/BLAKE2s/blake2s-test.txt,sha256=nH7O_rr67tH8etckN_qAoRu6BTAi0Oa8EIvyNaVMijs,102983
-Cryptodome/SelfTest/Hash/test_vectors/BLAKE2s/tv1.txt,sha256=sO6d-SWvAMOwzjMuLNZR8K2eb7QLIzOBk6L7omqcg9k,1413
-Cryptodome/SelfTest/Hash/test_vectors/BLAKE2s/tv2.txt,sha256=v6M_7bwZO3a7V4KXowFt93wWHudF1M5A1_2BWHz4OcI,2564
-Cryptodome/SelfTest/Hash/test_vectors/SHA1/SHA1ShortMsg.rsp,sha256=vgmR3cU3KTLVWASxFxPJFA0QQ170sxagdz41Bu7HnNo,8735
-Cryptodome/SelfTest/Hash/test_vectors/SHA2/SHA512ShortMsg.rsp,sha256=5To2wDYJ5aPjzEtuEXpJnbeGTCPsglxs7JlQOkX0B2Q,36800
-Cryptodome/SelfTest/Hash/test_vectors/SHA2/SHA512_224ShortMsg.rsp,sha256=mxH7Jf8I2McI4JiiLQE8XTjAaNHjmOtXPSBVwFO__nU,27536
-Cryptodome/SelfTest/Hash/test_vectors/SHA2/SHA512_256ShortMsg.rsp,sha256=2NUAi3P5DLkqj41NmvdFgJzu9Hr0y-su4kXMaxU_UiM,28568
-Cryptodome/SelfTest/Hash/test_vectors/SHA3/ShortMsgKAT_SHA3-224.txt,sha256=1eLWO-0-QY5KJRsFVYuMsZxZJUqid5fQdoYf62TK0UU,86195
-Cryptodome/SelfTest/Hash/test_vectors/SHA3/ShortMsgKAT_SHA3-256.txt,sha256=RvFAFF5Dz74xTtmOI-6rlwdLm9g3q6ToCZCSdTwWjgA,88243
-Cryptodome/SelfTest/Hash/test_vectors/SHA3/ShortMsgKAT_SHA3-384.txt,sha256=iyqT-Rq0yO5R6eYMQnnlEynzNYvT1fMjEb1TetruOZw,96434
-Cryptodome/SelfTest/Hash/test_vectors/SHA3/ShortMsgKAT_SHA3-512.txt,sha256=pImzhhuDKlqdHvspZxdke4Ovym8Cgfdw-5gQtni4BTI,104627
-Cryptodome/SelfTest/Hash/test_vectors/SHA3/ShortMsgKAT_SHAKE128.txt,sha256=-GOrJL52VikLqOrNLo_dW6vAuoikrIwv_M8yE-cC20c,333928
-Cryptodome/SelfTest/Hash/test_vectors/SHA3/ShortMsgKAT_SHAKE256.txt,sha256=wRVs94lIiWRqphXKojGwqWxi_BjtbNOToZwvLuT0C_4,333928
-Cryptodome/SelfTest/Hash/test_vectors/keccak/ExtremelyLongMsgKAT_224.txt,sha256=Z8BU0nZzRihAAARK2JV-gbZKBkeEPF1meRld4oOyJLU,316
-Cryptodome/SelfTest/Hash/test_vectors/keccak/ExtremelyLongMsgKAT_256.txt,sha256=wDRraKgIR_Bb--u3qjgRDI_4JuDYY3k8CERjWlfXcO0,324
-Cryptodome/SelfTest/Hash/test_vectors/keccak/ExtremelyLongMsgKAT_384.txt,sha256=J1aO_Asi6jHQkLvNqqQX0ct3IjlGSi_X2dKi886PhJw,356
-Cryptodome/SelfTest/Hash/test_vectors/keccak/ExtremelyLongMsgKAT_512.txt,sha256=xCXigswYKQjijTOnSo6YfMKbWNu-p_RnR0-WKdR2zy0,388
-Cryptodome/SelfTest/Hash/test_vectors/keccak/LongMsgKAT_224.txt,sha256=ORAzRQYztzHLW1kiQcKViaDpOFDmxRWlVH55E57axYo,300741
-Cryptodome/SelfTest/Hash/test_vectors/keccak/LongMsgKAT_256.txt,sha256=0GA-RoRMyaobz-mZsxR0FAYaGJax0yDeCMo7AidY6JA,301261
-Cryptodome/SelfTest/Hash/test_vectors/keccak/LongMsgKAT_384.txt,sha256=lcfkQiEcCvCDWCAPxrLtAjVIVtqftH9iUohS38DMlDQ,303341
-Cryptodome/SelfTest/Hash/test_vectors/keccak/LongMsgKAT_512.txt,sha256=Z9a9BYUTLD92OdA2FR15LhIcqStLBnAAZSeJqf6dggo,305421
-Cryptodome/SelfTest/Hash/test_vectors/keccak/ShortMsgKAT_224.txt,sha256=4GBcFh1vLSJXYo7p-TRHHnHvp43NgyPgXjV69KZolzA,85946
-Cryptodome/SelfTest/Hash/test_vectors/keccak/ShortMsgKAT_256.txt,sha256=qo_vZ44ayILxErUnmTwnKwOBndsWRgk9ER9GDh2r2nY,87994
-Cryptodome/SelfTest/Hash/test_vectors/keccak/ShortMsgKAT_384.txt,sha256=TmfukzxIOlEHEFfahvDDuOtrebZhSaGUcNggUv8_ywY,96186
-Cryptodome/SelfTest/Hash/test_vectors/keccak/ShortMsgKAT_512.txt,sha256=3-33JR9udHo5AELPPPFLu12Y4ltAjxkSa6HPgn3s0yI,104378
-Cryptodome/SelfTest/Hash/test_vectors/keccak/readme.txt,sha256=K1q35vq7h6S1aGqUPr8EcZKoJEjtaBgQlaQtya3v-6U,83
-Cryptodome/SelfTest/Hash/test_vectors/wycheproof/aes_cmac_test.json,sha256=4GQcX-EVpdpSANFyweVfnrUS0_qOhnwUFNZQFlBPQzk,90510
-Cryptodome/SelfTest/IO/__init__.py,sha256=62l-NkQk9WPrRYoDAbtWKMOc9LT5yAE6ENws7t7-uzU,2002
-Cryptodome/SelfTest/IO/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/SelfTest/IO/__pycache__/test_PBES.cpython-39.pyc,,
-Cryptodome/SelfTest/IO/__pycache__/test_PKCS8.cpython-39.pyc,,
-Cryptodome/SelfTest/IO/test_PBES.py,sha256=sCOtJYeUCsSYM1NRYpweWzlUgrrc8W4vSHLIdi2s_aE,3469
-Cryptodome/SelfTest/IO/test_PKCS8.py,sha256=RC8LDc5b-7056ZWgoJNMPxaRgN4J8UyzgvQNE7LfoU8,17574
-Cryptodome/SelfTest/Math/__init__.py,sha256=EkOt_fJnPR9-LS36rE0xm0j1nlj-I0Y9CPnQk1KO29E,2113
-Cryptodome/SelfTest/Math/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/SelfTest/Math/__pycache__/test_Numbers.cpython-39.pyc,,
-Cryptodome/SelfTest/Math/__pycache__/test_Primality.cpython-39.pyc,,
-Cryptodome/SelfTest/Math/__pycache__/test_modexp.cpython-39.pyc,,
-Cryptodome/SelfTest/Math/test_Numbers.py,sha256=AwPV2PIK_R51JgX5GxpYUVOxp2eZ1uzhcxvFPpzN3V8,29839
-Cryptodome/SelfTest/Math/test_Primality.py,sha256=0V_gzcBWyk1SFYEBcsEgYVaPfw3-UZtcWl0etV_bgvA,4901
-Cryptodome/SelfTest/Math/test_modexp.py,sha256=rsoK86G8jDUNPiVg5uu3c3S6XVN4wz9dl_ty0oajcwI,8135
-Cryptodome/SelfTest/Protocol/__init__.py,sha256=M2Sh9OvDVzEqup__hYYipuAqXvBwEHSooPPz4meBCyo,1763
-Cryptodome/SelfTest/Protocol/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/SelfTest/Protocol/__pycache__/test_KDF.cpython-39.pyc,,
-Cryptodome/SelfTest/Protocol/__pycache__/test_SecretSharing.cpython-39.pyc,,
-Cryptodome/SelfTest/Protocol/__pycache__/test_rfc1751.cpython-39.pyc,,
-Cryptodome/SelfTest/Protocol/test_KDF.py,sha256=qIDtlD4nJOHL0Rlg-2rAIw-PhBaR3Q96Vbn3kxzq0XI,34529
-Cryptodome/SelfTest/Protocol/test_SecretSharing.py,sha256=B64noTracARMA3qGIUmIuk5Ob-NYyIldndNK-KJVmkg,9701
-Cryptodome/SelfTest/Protocol/test_rfc1751.py,sha256=6QuxUUE-NP8_1tQNj9Macjtc540zk4j85Z7G1Nyy2cI,2220
-Cryptodome/SelfTest/Protocol/test_vectors/wycheproof/hkdf_sha1_test.json,sha256=O9w7X1BkMKkFTU_6LHA-NO1uMTMLKr0IgRSO4SlWCP0,80132
-Cryptodome/SelfTest/Protocol/test_vectors/wycheproof/hkdf_sha256_test.json,sha256=i0ExHY0YXUgtQ6TH9svR3lNezQ0ZHU_mhU_hpj0mf7Q,98622
-Cryptodome/SelfTest/Protocol/test_vectors/wycheproof/hkdf_sha384_test.json,sha256=iCNFhGsEfB3wwhKfOnKjzhBpfry4CaZIlAmg8maC9DA,122104
-Cryptodome/SelfTest/Protocol/test_vectors/wycheproof/hkdf_sha512_test.json,sha256=UzoAknq9V9ZtOoCB48e0C4VoQh4_yXesEH555P8ee-s,147385
-Cryptodome/SelfTest/PublicKey/__init__.py,sha256=aRQ22RfDcpSeNEKu98hfxITqQMIoSOCGwCG1XTQuzVo,2203
-Cryptodome/SelfTest/PublicKey/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/SelfTest/PublicKey/__pycache__/test_DSA.cpython-39.pyc,,
-Cryptodome/SelfTest/PublicKey/__pycache__/test_ECC.cpython-39.pyc,,
-Cryptodome/SelfTest/PublicKey/__pycache__/test_ElGamal.cpython-39.pyc,,
-Cryptodome/SelfTest/PublicKey/__pycache__/test_RSA.cpython-39.pyc,,
-Cryptodome/SelfTest/PublicKey/__pycache__/test_import_DSA.cpython-39.pyc,,
-Cryptodome/SelfTest/PublicKey/__pycache__/test_import_ECC.cpython-39.pyc,,
-Cryptodome/SelfTest/PublicKey/__pycache__/test_import_RSA.cpython-39.pyc,,
-Cryptodome/SelfTest/PublicKey/test_DSA.py,sha256=8V1xuY9LWsMLxFJUfbf0SkJYuy0F1mRIprozyn3kdXU,9552
-Cryptodome/SelfTest/PublicKey/test_ECC.py,sha256=aWwLootkojYrRI6cwttSD1SSYnCEGZ2QiG2uSmp8BX4,31788
-Cryptodome/SelfTest/PublicKey/test_ElGamal.py,sha256=FhcxH3ngmtbPezyLLS2g1JXUb6RreGTVfK6a8RT5y4Q,8671
-Cryptodome/SelfTest/PublicKey/test_RSA.py,sha256=_MlvOivZxIzWVARdyMYx6AKpbZnSYQ_0DfnGBlzNw3Q,12220
-Cryptodome/SelfTest/PublicKey/test_import_DSA.py,sha256=V20ehAYhf5WAcm5mBxurN9YM3Z58vAfTY-irdzE7A_Y,25492
-Cryptodome/SelfTest/PublicKey/test_import_ECC.py,sha256=0fbH06J9fkz1AErgv0uS7dUGSROOjSnxNWmpvyj5_Qg,50208
-Cryptodome/SelfTest/PublicKey/test_import_RSA.py,sha256=cWheO9zbXvoCrHsCticFCqHOmkqmuCyZQWwk2FHrq_c,23778
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256.txt,sha256=wYvstytkYlYw41vRkecS-zFU5jRFvqjck1_FslBiU9s,630
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_private.der,sha256=7qlKORodBckn-NEiXjjhvdK33oj615HsiX2lCdn_HHY,121
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_private.pem,sha256=yjB0KGJw7cK59wOGC9vav00Hua7O-4y4KmR-ZvfTIFo,227
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_private_ecparams.pem,sha256=UoWial9kzXR5-vqH-DiiStF9LQuR7HaWVEza1zO6oGM,302
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_private_enc_aes128.pem,sha256=0wkiqVsPBEzM0xudk3HJ41WKhYIp1XYb5EMid3HIhjk,314
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_private_enc_aes192.pem,sha256=TJKSWl5XvJu7ir-bBj_YNhqw1zrT2tJpQ0tacLnPswA,314
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_private_enc_aes256.pem,sha256=yMEDYmgWlztJujMOF9rMS9Iha34GBXyuXYpYgLWxx0k,314
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_private_enc_aes256_gcm.pem,sha256=GotcdRDvbl91HvWlW1z009iuUYTTSpGy4HrmVJ_sDCk,300
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_private_enc_des3.pem,sha256=XOwp6KnEADXw239Va5r9ugVpJOWoaZQTQ-iE99Gpyh4,299
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_private_openssh.pem,sha256=aCxAUluUngRkqklTjXMJ1U-R06vyTtgvAY9HJiyiBM0,525
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_private_openssh_old.pem,sha256=U2LOqXeFl_KpuBjteuFMVINwpkhySBQHreMsIsmAe8U,241
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_private_openssh_pwd.pem,sha256=faDeroEuwg_Ix_5F5NPjrcIgL1JsuVTO8ElkT09GgL4,578
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_private_openssh_pwd_old.pem,sha256=DKlWKgTzq5QEpu7OfnASW2P1CMpsTrHYLFMMzP__SMU,241
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_private_p8.der,sha256=8Lia3f3O81Fur193lkEPfMuqxxJIRO2UqjqWo_HDHF4,179
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_private_p8.pem,sha256=XoGTYG5LrjouLTIkIT4eFOxt5N1VH7AYbhBA2aZbzKE,318
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_private_p8_clear.der,sha256=cnmbIowIW8z6EJ2Nn4eg6jygbK5Fx-TPjIsr9RX50i4,138
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_private_p8_clear.pem,sha256=aQZgvErmx6ZyJ4UtYRukA17Gc4eQO7uaiDsCwBqPF08,241
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_public.der,sha256=fGv8W3UpJMMXYmJ2nPRrmjSPNnyOcE-fI1dgGsA1qWo,91
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_public.pem,sha256=18VbHNZHsikjlu35teZZB5_x_Vimb7NlLu3xTwIMs4U,178
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_public_compressed.der,sha256=wUxc_rRUKSbVuW9Xmr2y-9j6fZoWUyp-f3kMEFnScVU,59
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_public_compressed.pem,sha256=AQ9fW0iXXwb_gAfEgsZOFbv8_F9rHkrO5FWkG6WL5-4,134
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_public_openssh.txt,sha256=lez_62x3FxIN6LUS6NdwuGRn4yZZ0VqVWJIdsyC7jKY,161
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_x509.der,sha256=FbcHrhY7Q7BO0nt-AoCVMWqPPLebvNB7dPNUyBFVHtI,401
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p256_x509.pem,sha256=zTGkUwOeqJpxZz2LcsluZ3A_0f_wHrMPzR7DF3lJ7bw,599
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384.txt,sha256=30cv9scTYhSDTQE7gNXeihp7QVFW3azbBPfSqdIeLBI,848
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_private.der,sha256=gdF5yQdMI2w9N1Rz2OZl1kXAS3VjdvvO4eRBNEwci88,167
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_private.pem,sha256=lW4F-gHG8plnrEjwXODlNBDR06244E2FqdNW6RrKZ0k,288
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_private_enc_aes128.pem,sha256=m8h8zR8UR_shztyeCLv2ERdn-Pj0RZPI_lDnA84EzNU,379
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_private_enc_aes192.pem,sha256=jjDKqZ71CAeoEf9qdFUrm5qMdL9SLBBUSA77aHCdsqY,379
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_private_enc_aes256.pem,sha256=Okuv8VAz-TjM1INmOx-sfZIAaNYENrkViLhU6Tub5BM,379
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_private_enc_aes256_gcm.pem,sha256=q7oNkCM9-0ZVdmXMT-I_ubd9BAeUf7FAWw7ax45nUbA,361
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_private_enc_des3.pem,sha256=zvzq_un0MjYOriaiI2unsjiZyODYLajkEZhKl1M-fIg,352
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_private_openssh.pem,sha256=YaQ4jzZ_Qk680cHo4D7pSgOuGKL-x1ehVrmNuaP8VpA,634
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_private_openssh_old.pem,sha256=xtuVGnb35W5TviTFR-VX4UAm27jPw_qaAKT2zGRdN50,306
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_private_openssh_pwd.pem,sha256=VJGw10-QUR3K012qM5S0xulsxqHMAnLO9kjyZ9AUyAs,687
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_private_openssh_pwd_old.pem,sha256=HA9CtaFCz82uqaJWF4PbMra_WmBWeGhs_oOUPE4I46k,306
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_private_p8.der,sha256=v-ba89TMhcrwYb99FwTTSGRjPvHEY_YtAD_uHN9NXfY,288
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_private_p8.pem,sha256=28va4dDY6o0BQweiABnLzVd2XJHP6Sh1keljdA4vSMI,464
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_private_p8_clear.der,sha256=iQNdOt70TwEAa8JjslZfU14t9QMuJw4WI4xp9bO1boM,185
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_private_p8_clear.pem,sha256=p9k9kyrlXEdWLTgX77lC-EsRjRyJ_attoLxP_7u9ABo,306
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_public.der,sha256=P_Xu10VVbabmws1UYBe36AAb0r67KopkCpVXrdAZWBk,120
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_public.pem,sha256=DLmI4hGdlkQt8msGAWK8PIGeSwljpsaRPcap48ljUPE,215
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_public_compressed.der,sha256=40gth3gsa-MDzpE3oBbzNUeGT6w2xUHnGJr6MFHPPp0,72
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_public_compressed.pem,sha256=KAd0DNF4lw7LCTEHG-eQ5AlQx61yfbISZ15OoWlImxI,150
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_public_openssh.txt,sha256=lwxYgs4nmrAh3MzAwGXVnpzbGMUuIVtlGUQA6w1kd4g,205
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_x509.der,sha256=ianAVbMC_RUc_qkW56ZveHWNON9UkCtxHzRAKNTgU3Y,465
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p384_x509.pem,sha256=IoS2VsH6MzJFrqkaE7dUNx9zpPZilSOKqwWWTzwd1ss,684
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521.txt,sha256=csPtEBUyVqueAivVBMENIQK6dIW5EeVzOuMm74eEbuw,1102
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_private.der,sha256=EgT4zXHC_nUdlpMQPtVNVL6Kd85-UNlFvWpXj3ZKLsU,223
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_private.pem,sha256=SzMianLiLMvdM_uoKpuoolMEr149xfjxZs1BMzNk3E4,365
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_private_enc_aes128.pem,sha256=6Q7QjmOg9HtGgvzbr1Ir8y_s-X0VJiItGIojnGk_188,444
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_private_enc_aes192.pem,sha256=Usoy3FRZ621Ba_On0UR8iuS8a1dBIliXoNViFedOn5M,444
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_private_enc_aes256.pem,sha256=V7aiqI6niQFt33j0fRuSjLULlAebLtrzqkStBm-tynI,444
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_private_enc_aes256_gcm.pem,sha256=p5exiD4JHHDtK0jVlajI0N73pBwVVVmg03O2caZDb-M,438
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_private_enc_des3.pem,sha256=9ct7Q2bQ4Wqw-S_BCu6TPpRmLoVxuAA5Ui3vNRrcX54,429
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_private_openssh.pem,sha256=kBOZ_mWsjGkvuY76LoeXCW08zpd6e-vzL-PC2A1kRE8,756
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_private_openssh_old.pem,sha256=fo2rw0koPqjatPBspOclEYuVLVko-wLgmxTsEqoNJjY,384
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_private_openssh_pwd.pem,sha256=kVA6BoPYrlOqW1scj0tddmMaeKfn-MT7unIpZClsSIM,801
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_private_openssh_pwd_old.pem,sha256=uZCxZEF1324xbh8FsyeC-e5xWTuh2JI9THSMYta3nNc,384
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_private_p8.der,sha256=uBLXLGBOnJHNhsnfxi3_LBzEQt7zZ7dvA8W10XNFBsU,353
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_private_p8.pem,sha256=IMvxQdmrlUhfItAyms1un1MBUETxXOELdpb7wqg58RM,554
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_private_p8_clear.der,sha256=bhoyjpfdqhn8txQ02eOmK1uBoz7Y2FTj3qFYvf9er6g,241
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_private_p8_clear.pem,sha256=GvWW9t8Ux6z1-Uu7O6hWAgxdI5vgU2eVsDNcyyS_b18,384
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_public.der,sha256=n8k_4lc8DlJD1jqFzj9QFbIU2uMyJTuZt08BOjEQHaU,158
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_public.pem,sha256=cd0AukbHFnj_d1habRRQaZxss3QEgzs6pkYvFFgMh2A,268
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_public_compressed.der,sha256=35DQpuatGV2E92otSp8JcI4yszBg2A3q3a1TiVoDHzE,90
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_public_compressed.pem,sha256=LYsdWOfaBZtP9eYvu4hktp5HhmuuiGATJPOYQYNmVqw,174
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_public_openssh.txt,sha256=NUTubHKJmFuqIhBPwTy9PSOMoWI511Q_bUUOallD5jY,253
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_x509.der,sha256=T8JHzhTzXC74Bzy2t9JCfpXMi3FgC_RvhqZNK2S47vU,539
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/ecc_p521_x509.pem,sha256=il319QczAtkua27nPwS5gQnwuhPDuVc4U8z8_F5HHgQ,786
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/gen_ecc_p256.sh,sha256=jvhcZKBm51b1N-zcTLjsiquVBtdrQuLHm6c6JagsDCA,2651
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/gen_ecc_p384.sh,sha256=tOY_BeLz7D55rRohOnASfpKU5VISAI_slDKmNuQCxr8,2540
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/gen_ecc_p521.sh,sha256=pr2bzhpJtOMHa9HCIToMctduu9bzKwFhr06kFd9aeIk,2540
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/openssl_version.txt,sha256=TpgzscIqzY_FLk6WH0y1H0klab_iJn2U120v1loK4Gg,31
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/openssl_version_p384.txt,sha256=NEWRNBfUbq4TNQkZuuSOQAp6VeGmnrbIoo-lC-Qe0-M,27
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/openssl_version_p521.txt,sha256=NEWRNBfUbq4TNQkZuuSOQAp6VeGmnrbIoo-lC-Qe0-M,27
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/point-at-infinity.org-P256.txt,sha256=YCL_d9GA0wp_B4jH63gFgglZz97QDipQb3JAGyGk1iQ,9993
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/point-at-infinity.org-P384.txt,sha256=LH3JZPf82mX9kZfLCurwN6KFxAJKe0c7dn_wTkmznTc,14455
-Cryptodome/SelfTest/PublicKey/test_vectors/ECC/point-at-infinity.org-P521.txt,sha256=uXgYPT7uZU4VSE8D4of-9MbgFWVWyTLWekpPwryKWho,19421
-Cryptodome/SelfTest/PublicKey/test_vectors/RSA/gen_rsa_2048.sh,sha256=kKh8bTqhBmvzCO-rek3THD8SfhibZXb-5MKAkua6-_0,659
-Cryptodome/SelfTest/PublicKey/test_vectors/RSA/openssl_version.txt,sha256=g4a696SFxOtAl9Ta6wEQ7Gk7S2xAOYDW_2owds4QRG0,33
-Cryptodome/SelfTest/PublicKey/test_vectors/RSA/rsa2048_private.pem,sha256=p-GqC-XtacpQsChpxqB0UuDzGJz25zDVGc1XLD9QZlw,1675
-Cryptodome/SelfTest/PublicKey/test_vectors/RSA/rsa2048_private_openssh.pem,sha256=SscubX5Q_zu193_200rKEEMcDsA8UUNMFl2qwpZD79c,1843
-Cryptodome/SelfTest/PublicKey/test_vectors/RSA/rsa2048_private_openssh_old.pem,sha256=z7hNYzNlTHBBD1TgzIeRT1jL6Mz9WFNNbnB1HjihX2s,1704
-Cryptodome/SelfTest/PublicKey/test_vectors/RSA/rsa2048_private_openssh_pwd.pem,sha256=d2AQnmOPVvU_FiCA9nPo3QA7TQnRIkCrVKiiBP7Zuy4,1896
-Cryptodome/SelfTest/PublicKey/test_vectors/RSA/rsa2048_private_openssh_pwd_old.pem,sha256=akUEWlzHkLQySLriut7c1Lz7_A8Uv6GmID2a_nSrvgA,1708
-Cryptodome/SelfTest/PublicKey/test_vectors/RSA/rsa2048_public_openssh.txt,sha256=Wk5hyMlp7Cb_TAglAhmPEVFejSPMY97cTz9voxhgp4E,381
-Cryptodome/SelfTest/Random/__init__.py,sha256=vWmKA--IXzOIszf150wbGq1-OTAVBTI3sqInjutIBWk,1546
-Cryptodome/SelfTest/Random/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/SelfTest/Random/__pycache__/test_random.cpython-39.pyc,,
-Cryptodome/SelfTest/Random/test_random.py,sha256=VtbtEXdP_6EaxZ_hRL3rP-HrBVBEqb_ANN7l8HfoRFM,7014
-Cryptodome/SelfTest/Signature/__init__.py,sha256=C-5wFBkGOqSmy5j1ljP2EAHsTPmz4Cp3klsrUgTaUVI,1564
-Cryptodome/SelfTest/Signature/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/SelfTest/Signature/__pycache__/test_dss.cpython-39.pyc,,
-Cryptodome/SelfTest/Signature/__pycache__/test_pkcs1_15.cpython-39.pyc,,
-Cryptodome/SelfTest/Signature/__pycache__/test_pss.cpython-39.pyc,,
-Cryptodome/SelfTest/Signature/test_dss.py,sha256=pNFOUpR_XNTRW6YYbevhL47JH-YKuMT4Tn2-osJtKy0,48521
-Cryptodome/SelfTest/Signature/test_pkcs1_15.py,sha256=rDFun7A_XUMiqksw6iTm7HJap-1Z1wGINiwhoSRT9CI,13961
-Cryptodome/SelfTest/Signature/test_pss.py,sha256=cniIFFvnRk7JvAIfyZHagK8emuGXMklwHYKnd5ye_AM,15834
-Cryptodome/SelfTest/Signature/test_vectors/DSA/FIPS_186_3_SigGen.txt,sha256=CgbUHJa42LSFuKhzyHqIOrOhjfty1UEbqG6mZzgwG4w,332997
-Cryptodome/SelfTest/Signature/test_vectors/DSA/FIPS_186_3_SigVer.rsp,sha256=XAzACaPYLKYnuy3k9eKMEaLLYv599wDS-P4_WPc-sFM,320900
-Cryptodome/SelfTest/Signature/test_vectors/ECDSA/README.txt,sha256=-9a-bk38fNGDOL5A0MuvoMv_-DGDyXv-Hy_hi9lPVdU,233
-Cryptodome/SelfTest/Signature/test_vectors/ECDSA/SigGen.txt,sha256=fmR9CA0A0OBmTk0VXO3dLF6JuWpfYnTiR0GbKJ46u8c,73092
-Cryptodome/SelfTest/Signature/test_vectors/ECDSA/SigVer.rsp,sha256=2mRCPlaCZaEKtHnQaNT4UyV4y4Ugp2ym431pVWlO5Qs,59083
-Cryptodome/SelfTest/Signature/test_vectors/PKCS1-PSS/SigGenPSS_186-2.txt,sha256=rcKJqoIznZ4T1n7CWiQF1IdS--TtECXiJTvu9cuIlEY,241521
-Cryptodome/SelfTest/Signature/test_vectors/PKCS1-PSS/SigGenPSS_186-3.txt,sha256=Rt5_L8y1-JUW5ktb2xxP1FagnJzGgN1k4HVuYv9QAOw,84721
-Cryptodome/SelfTest/Signature/test_vectors/PKCS1-PSS/SigVerPSS_186-3.rsp,sha256=eMQgBgTucJ1k6lMI9E9r5JNWyaaYjDdojMugWQz4O_o,618655
-Cryptodome/SelfTest/Signature/test_vectors/PKCS1-v1.5/SigGen15_186-2.txt,sha256=O-UB5gD4svYkt_DtBDsPNeF-7KhkRF-DUwHhv3IAloc,228502
-Cryptodome/SelfTest/Signature/test_vectors/PKCS1-v1.5/SigGen15_186-3.txt,sha256=GcSbj8cQLMEkduIVhUzSKPH4wNMW8Oot9sGD8Wfpcko,78424
-Cryptodome/SelfTest/Signature/test_vectors/PKCS1-v1.5/SigVer15_186-3.rsp,sha256=b2A4FDStYP85DmeRO00HLufCVkvVdjaW7xspnh2WezM,248174
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/dsa_test.json,sha256=dY9VnMaPZ0VYhzjyXXu4DUa5OyN1HM8HXZFIata5Kj8,361835
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp224r1_sha224_p1363_test.json,sha256=NUzTUOvq8KUgnhgblXylo_xC0prDUrBJnvHT2COMDhY,126917
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp224r1_sha224_test.json,sha256=h0ZfND_VTKlrULr6fsqhWi1NOwSkCZQYLOY1k5kuo3Q,182708
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp224r1_sha256_p1363_test.json,sha256=frm9Q9JD6btb9aYrfeSrqu1JisTmOcsNMR67oRZUPjg,136148
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp224r1_sha256_test.json,sha256=fllUI96pdYYPSmtNnf5wengqklQcNl1Fv5tmYgGajRA,191745
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp224r1_sha3_224_test.json,sha256=rYp3SAmNMqI5Oiek4o2JradM7YsCN3sgJTm3Q2191OU,192369
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp224r1_sha3_256_test.json,sha256=DSwWgANVGnI6l3tTT_f6IX7ld1x6TWQq1QLvmkn_AmA,195342
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp224r1_sha3_512_test.json,sha256=rUn9FPrUbfFRa9Rti9mAeT1WH8TCjXvQ-SkN6ymx6_Y,216893
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp224r1_sha512_p1363_test.json,sha256=m-6HhNQBAO0oP7Hvu5qOm7y0_RhwpiavN4H7SPJKZ94,158057
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp224r1_sha512_test.json,sha256=srxXDnc8w0HyPC1cFGYEum5u9WlaFilCM2969gFRf1w,215238
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp256r1_sha256_p1363_test.json,sha256=eEd59aM1Yyrmq1aojPZKLgyRixx_tJ0-nxc_sl_Q8JQ,169360
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp256r1_sha256_test.json,sha256=Yvg1kKnp4mpdc1n4Y-1BKqzSnt3ySPgXWbCcPEiT9O0,209501
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp256r1_sha3_256_test.json,sha256=tQCOWU-wS8pwztc_QQB2vK1IXmflAvR91WGplVKfcto,212335
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp256r1_sha3_512_test.json,sha256=GO0BLh57BNYJK3ZcuiPjAynKzBLek5z9SP1EacmOkIU,235525
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp256r1_sha512_p1363_test.json,sha256=LTH5hr5Eqciwd64TdLiL9OfUTk0_YEVFyYWiCQw-4AE,192688
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp256r1_sha512_test.json,sha256=TbH2DT14pKwLQdnqdc3LJkRaf2EcdkECPZX0qtUMHqM,233815
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp384r1_sha384_p1363_test.json,sha256=fLjtA_INZ1ZC4JIwbnbTLZYvmvVN7cHn6c_sbX7-1qY,202354
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp384r1_sha384_test.json,sha256=QPdf0K6THBEM9aSkl35s6kDkh3-SIomshoX6bEtwxXI,248834
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp384r1_sha3_384_test.json,sha256=WwCSeAmsmAnJtYpRdxpT1M4GMn9SabbgiRIkSVij7AY,252441
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp384r1_sha3_512_test.json,sha256=llhW4ydRgaY_Uq663LDVieLPOz6EN-d_vqKJq1VuPj4,266529
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp384r1_sha512_p1363_test.json,sha256=ZTO1O-Z_eTEfXMXX_gZ8tyr1qHUUIxKb-8mOHOmHffs,217518
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp384r1_sha512_test.json,sha256=ycWfQpYvSTBG6B3Q3-cVoKG1rUblxAc3ric7QxZrBbs,264814
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp521r1_sha3_512_test.json,sha256=zvNdmzSSuNUmf_ZusWRljRxJspgiN_IThYGVdmzqJhE,316628
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp521r1_sha512_p1363_test.json,sha256=nivx2a4HuAwfaERUwBuTZDREIve8uGstu0wN5ZZoBCc,265577
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp521r1_sha512_test.json,sha256=gLytODmZ8DmUJTrTGbg0WuvG1wGm3uq-wwZhzNpmEAM,315478
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_test.json,sha256=1XbwmavbVPefYmWJhS7x1byueiJ5DAzTmo2eQhlG-7I,1333478
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/ecdsa_webcrypto_test.json,sha256=Qa7kaY0Xohqsixuy-ezkDSLG8yGL8L98Hubfj9DGOs0,385262
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_pss_2048_sha1_mgf1_20_test.json,sha256=bD0sOop9DKD2OIBaJOBTqN9piTU_1lqk-pBpXvAW6BU,63308
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_pss_2048_sha256_mgf1_0_test.json,sha256=ZZGPT7_oIvbgwLFKM1iFfKJefD6C9-VnuP8fgEga9Bw,72789
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_pss_2048_sha256_mgf1_32_test.json,sha256=hR7EkUvCMwshuYQW1lChpfQJdgwCsJTiEAHK1DyjV3c,74923
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_pss_2048_sha512_256_mgf1_28_test.json,sha256=LQ8ufxpctrj2VHOZ2I7TBWuNpTpzW3r9YOsPcaCGfQk,37903
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_pss_2048_sha512_256_mgf1_32_test.json,sha256=2RkYwmvFpuP1XIWTR5fKshYJyif7TObvzYxlpWQLXO8,37191
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_pss_3072_sha256_mgf1_32_test.json,sha256=xkx8gcULOEd0N9SfcehBSUQBKDOrv2Q-dDmc3MQ2NKk,101979
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_pss_4096_sha256_mgf1_32_test.json,sha256=8omUot7aJDuhggbUHYGF0qCR7DNRLjvIwnSAGXqCVEM,129037
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_pss_4096_sha512_mgf1_32_test.json,sha256=uOksGZcx2x4A_DPnnE0DXmI166rNshpY8oWfmlPcWgs,211443
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_pss_misc_test.json,sha256=d2w-C4-V2t7yCDW92y_UMEtbSdTJ3QGOLqPQs4Jxifw,463761
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_sig_gen_misc_test.json,sha256=Q1OTIr166OUg4uAMbRGsXP3_Ty9wQ8weOhZgsS0GuvQ,372540
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_2048_sha224_test.json,sha256=1ANoEKJ6Mc94iKCS-cqNqnhx79ZsHCy9a8pWV8Popsk,175874
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_2048_sha256_test.json,sha256=BHjrlYexXC5nCb_wGGNT5VBRYcKhU9bUuEzauElpBGU,181387
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_2048_sha384_test.json,sha256=bt4DMVo3j7HgRFE5l7m03aVv68UZJm6g39kmgh-Etr4,184281
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_2048_sha3_224_test.json,sha256=AdsypMqO6_GRil0LRBG7zuWJD80EEVjA3mY-9Or_Ako,181604
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_2048_sha3_256_test.json,sha256=hQ4Fs6ZQzL55QtPQmJUYAXrBP7bSukas9rL482hflOA,180890
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_2048_sha3_384_test.json,sha256=FSXUlpTnygKfQbhyKog1iSebDjG6zFxav9HInKYheHw,181604
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_2048_sha3_512_test.json,sha256=Znlqjz8DFWdsjZv40HBxn_juSuIjsoossTYYQsPiuWw,181604
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_2048_sha512_224_test.json,sha256=kC_TABoVqLd1Jo8wxqd-4NTJVCQYWRQpBTJ3_1_8jYk,183800
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_2048_sha512_256_test.json,sha256=tYXtc6895ZxNzy_uvxnRdWCOHC6pk2Jy39vi533DZjc,183086
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_2048_sha512_test.json,sha256=WsNGI8iC3jx2AqGoGzS4MEM9QDJ_Ky-bhgmrowrUuJ8,178542
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_3072_sha256_test.json,sha256=INZNK4hxDkjguICmNnPOUCkToSMFjeWWq9moA6GZ1CA,240992
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_3072_sha384_test.json,sha256=AoHmTwjmNhhJmfkGNWNXnlxPhnWP1lWs5ccMRb1llMM,236965
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_3072_sha3_256_test.json,sha256=fRdlVlSs_r1BDqFl3B7yQvCKGQTBwWeDaWV1B-k3PgE,245066
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_3072_sha3_384_test.json,sha256=RWjb1l5WR1hVKuqZ09BuLuBnpWhFcmhnXVr-r7Iipww,246036
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_3072_sha3_512_test.json,sha256=15-WDZpI2meYFNnFeRpSaAtuxapszz8MkfR8eskTu5E,246036
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_3072_sha512_256_test.json,sha256=p9euedS_ywKSYRD0T80klmDpyt52vvsZzRXwDaTPioA,248030
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_3072_sha512_test.json,sha256=695qzX0M3a9enz0Botw3LejEcMQKQ2CMATBcuY0JzUY,241950
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_4096_sha384_test.json,sha256=FvvLp8tnOeoeFjd91W8sBOMbI75sHj5fkH_DT2Q1eGA,299010
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_4096_sha512_256_test.json,sha256=dRHPuI8avsTKUBRAp8ej2VszXamupiMqYi_TzDec1no,312976
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_4096_sha512_test.json,sha256=dwFh4ADPbnVs-1T-PnHahFfIBTitecFHT-aAzlk1k4E,299010
-Cryptodome/SelfTest/Signature/test_vectors/wycheproof/rsa_signature_test.json,sha256=j_yzdGf4xK7M0bxP_iF3n6-p-cY7FKUJV76pttMADl0,353455
-Cryptodome/SelfTest/Util/__init__.py,sha256=0Ov0gHqo91NR0f639IzQMU-UX1pxOm90PI-uUaOJlro,2021
-Cryptodome/SelfTest/Util/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/SelfTest/Util/__pycache__/test_Counter.cpython-39.pyc,,
-Cryptodome/SelfTest/Util/__pycache__/test_Padding.cpython-39.pyc,,
-Cryptodome/SelfTest/Util/__pycache__/test_asn1.cpython-39.pyc,,
-Cryptodome/SelfTest/Util/__pycache__/test_number.cpython-39.pyc,,
-Cryptodome/SelfTest/Util/__pycache__/test_rfc1751.cpython-39.pyc,,
-Cryptodome/SelfTest/Util/__pycache__/test_strxor.cpython-39.pyc,,
-Cryptodome/SelfTest/Util/test_Counter.py,sha256=ApOFXU5UI7v6Fyud6x9DOxxzknMs5mRhdiPxrEayeKE,2214
-Cryptodome/SelfTest/Util/test_Padding.py,sha256=YS6QCpAg4wO1f_uF1yjRCfljxLV9exTjxzZJEzdJvQk,5642
-Cryptodome/SelfTest/Util/test_asn1.py,sha256=H8bZeUqd3I8y1eWhR_XgOTLfCTvhgIqyu6HxCb7JjM8,29439
-Cryptodome/SelfTest/Util/test_number.py,sha256=E4AuphgplCJEVK8NWQzhCQgOtUZXQDnLCKyxUCKQjm0,6440
-Cryptodome/SelfTest/Util/test_rfc1751.py,sha256=iRu-xLLslb_ktNOPkKs4TAWPljrxDMksFnSqo25q9dA,1121
-Cryptodome/SelfTest/Util/test_strxor.py,sha256=CMOooo3QahU0wx3n-gNdmpqio5FanEUOosse0XfS_jo,10618
-Cryptodome/SelfTest/__init__.py,sha256=bsbo1dGYE-girZ4Mc7JeMbsgKWQ-WccHPAlLAzd3028,3686
-Cryptodome/SelfTest/__main__.py,sha256=aQAx7W62ztb2utGTClg3Qgb8iD9zSCnThhil_cIdL84,1506
-Cryptodome/SelfTest/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/SelfTest/__pycache__/__main__.cpython-39.pyc,,
-Cryptodome/SelfTest/__pycache__/loader.cpython-39.pyc,,
-Cryptodome/SelfTest/__pycache__/st_common.cpython-39.pyc,,
-Cryptodome/SelfTest/loader.py,sha256=xO6_2DEpt-7RH6CD1YEWv8AjKjTxQsalKWLLb0ALbws,4101
-Cryptodome/SelfTest/st_common.py,sha256=XsoFHmR_gylMxGhRJrQHfarNnIT_Mu8t9oAebRPReck,1949
-Cryptodome/Signature/DSS.py,sha256=GG7RirihwrofE8dzjMDcbQfOVkit4MXobaB_55qP09A,15333
-Cryptodome/Signature/DSS.pyi,sha256=zay6LNZ3NIlu42Q63ICT3mZEcz_aVG1rXLOkJ2tfasc,1102
-Cryptodome/Signature/PKCS1_PSS.py,sha256=o3Ky9DF9iI-wpGHDi5vZs7spzFSlANYIkqgqu0zCkAo,2103
-Cryptodome/Signature/PKCS1_PSS.pyi,sha256=fzw5vQvHchfJHvlHEr24CMTY2Gw8_pqsz76jNmMUBlc,280
-Cryptodome/Signature/PKCS1_v1_5.py,sha256=aEzzt1ccFM71pJfG6drwzGZeTI-ntM4-LLxBPyaFXLA,1993
-Cryptodome/Signature/PKCS1_v1_5.pyi,sha256=eqweCPvqayn2xiO9Aqv4Bc38GKOLcca6PazT9T87ufE,157
-Cryptodome/Signature/__init__.py,sha256=Y7O7plqZibJUIIyRDTPHxUKYBNvl4botFXvjEUA0y0A,1686
-Cryptodome/Signature/__pycache__/DSS.cpython-39.pyc,,
-Cryptodome/Signature/__pycache__/PKCS1_PSS.cpython-39.pyc,,
-Cryptodome/Signature/__pycache__/PKCS1_v1_5.cpython-39.pyc,,
-Cryptodome/Signature/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/Signature/__pycache__/pkcs1_15.cpython-39.pyc,,
-Cryptodome/Signature/__pycache__/pss.cpython-39.pyc,,
-Cryptodome/Signature/pkcs1_15.py,sha256=C0tGVrnMF3caVBJArhpEYZ0dsQ2RD8taIIzv50j85gg,8749
-Cryptodome/Signature/pkcs1_15.pyi,sha256=k8o74VVp_Zw11VmbhLBxPiU6CzzTm7NbaNwGeWeNn9A,568
-Cryptodome/Signature/pss.py,sha256=1443VYy8pEuvB7t8sWJ9p--pGHnRz2yqChKx3EowkXI,13494
-Cryptodome/Signature/pss.pyi,sha256=O_6YOe-iR4rHIzNnm6vCzcwxVNPGRgfAXhhzp1N9jPE,1044
-Cryptodome/Util/Counter.py,sha256=IWid224Wy-kmQ1UxqRsutwiTDzJq-ajxQGx0rx-_M3E,2811
-Cryptodome/Util/Counter.pyi,sha256=2JrTHJYq263XosQSC_NIP0TufUsTlG7WUr-lRqjJCuA,290
-Cryptodome/Util/Padding.py,sha256=KMwvlHUL6zRNA_XMa_SXwbm7RBIND_3sK155NeSocI8,4229
-Cryptodome/Util/Padding.pyi,sha256=47R3H2kE66PtKO82eT_Vc5eCSgNe4qOFgqOIPRdlp9c,238
-Cryptodome/Util/RFC1751.py,sha256=zHC63Jx-PqZQ2ebcYGUhaG62vfkFSklQc8MZmapE7SY,21204
-Cryptodome/Util/RFC1751.pyi,sha256=B42LvsE6G786rNEsrhta_BANazgrpb0WoSBPqKyjt5g,159
-Cryptodome/Util/__init__.py,sha256=fsZWRqGXZR2gmM0jxuiogKW3WwzlzKuTRRWYiwtOOd0,1951
-Cryptodome/Util/__pycache__/Counter.cpython-39.pyc,,
-Cryptodome/Util/__pycache__/Padding.cpython-39.pyc,,
-Cryptodome/Util/__pycache__/RFC1751.cpython-39.pyc,,
-Cryptodome/Util/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/Util/__pycache__/_cpu_features.cpython-39.pyc,,
-Cryptodome/Util/__pycache__/_file_system.cpython-39.pyc,,
-Cryptodome/Util/__pycache__/_raw_api.cpython-39.pyc,,
-Cryptodome/Util/__pycache__/asn1.cpython-39.pyc,,
-Cryptodome/Util/__pycache__/number.cpython-39.pyc,,
-Cryptodome/Util/__pycache__/py3compat.cpython-39.pyc,,
-Cryptodome/Util/__pycache__/strxor.cpython-39.pyc,,
-Cryptodome/Util/_cpu_features.py,sha256=f_JiluwzxhmltMbptIQ8qA03YUdgSNBr3RwcyX9z-xc,1997
-Cryptodome/Util/_cpu_features.pyi,sha256=3wKXZ0Z8llc2uxADvbhz3dHV6YLyRrDujOsabXlffCQ,59
-Cryptodome/Util/_cpuid_c.cpython-39-x86_64-linux-gnu.so,sha256=MLtgFIWziAj9gJ2vAIbuE2asDKWUi4uNKe3O2ja0SI8,10899
-Cryptodome/Util/_file_system.py,sha256=m7HsPgKuKRsTQjgov6Vg02dn7Xsa52xhCLmqLjPIoZg,2183
-Cryptodome/Util/_file_system.pyi,sha256=5QruEWPE4urPtlCT5Eg8tBQyhV9ffBfZIAjmMo727dM,100
-Cryptodome/Util/_raw_api.py,sha256=_Uzt_wQ1_lm5GnENEF_s2Zya-LOCfG-UCA26ELB0DLg,10461
-Cryptodome/Util/_raw_api.pyi,sha256=Ohc2rr6RS-nhs6T5AL1YyQtaqsx6BVrJa092CiwAvNM,906
-Cryptodome/Util/_strxor.cpython-39-x86_64-linux-gnu.so,sha256=8ufqlsL0wHtUzSxQISNYBIqnnRec6JJfJKrIJfY0Pbk,13213
-Cryptodome/Util/asn1.py,sha256=uOFoioOtH5ko3E59qR_zHHsVE2I9ZEDHPg6cMmIJanc,31772
-Cryptodome/Util/asn1.pyi,sha256=xR4oQKBf4SXiz0IQ_K0lw427jvvgX9SiEXejIu9fdV8,3579
-Cryptodome/Util/number.py,sha256=xwH1LGqkVsg0fufxrbWlX88pVPxbE11FvO3L4Oc3zhs,94868
-Cryptodome/Util/number.pyi,sha256=ixX1BS8EvvuPXN1_8aosdYHKmtXGB9NlRNVI9T9MAA8,975
-Cryptodome/Util/py3compat.py,sha256=PrPeqRZP9glhLCzrj-G_8BFmTui7EOO3bwA1y1bBgmw,5246
-Cryptodome/Util/py3compat.pyi,sha256=GeZXPUe7HqATRZ9ijsDRt3sVXEioOvi_T8dzLrUMBN4,824
-Cryptodome/Util/strxor.py,sha256=SEcBSWY8xqSAPBmPA2TdTjFJnqTs9A4WoxVX4VyNv2Y,5126
-Cryptodome/Util/strxor.pyi,sha256=OuBvuuK_ezq3eaHY10J89xpER9IQ9wcYzFI7j1tpll0,243
-Cryptodome/__init__.py,sha256=oIHjFUCVTvgyuhVOuPLSQ29PXjOgb4XN7UiRdTs8GbU,184
-Cryptodome/__init__.pyi,sha256=e5Ea45Jy2RdOr6bmLF9jiS2Bw65WnYTD1NMLJlbGAaw,99
-Cryptodome/__pycache__/__init__.cpython-39.pyc,,
-Cryptodome/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pycryptodomex-3.9.9.dist-info/AUTHORS.rst,sha256=4AeRvMPhQSqwZcXaicX3Uv6MzyU98gNxUNcQsE6XiNg,735
-pycryptodomex-3.9.9.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-pycryptodomex-3.9.9.dist-info/LICENSE.rst,sha256=0a8_qy74zFO2x_SL3rF4rIdLBPr0ugFZqWthCfHTk-I,14685
-pycryptodomex-3.9.9.dist-info/METADATA,sha256=P7sdFrKssGKWsJR1a92GfdG4CNCtXFB3XFUPR2KWAWA,3188
-pycryptodomex-3.9.9.dist-info/RECORD,,
-pycryptodomex-3.9.9.dist-info/WHEEL,sha256=MbtbqAZac_n2F4h43wTK1gDTc2gN4Ms3L62s7suaJMo,108
-pycryptodomex-3.9.9.dist-info/top_level.txt,sha256=eHU9ase6in1ZSBEtTDpl7fwIPION42nbqZ1uFTyccxs,11
diff --git a/frozen_deps/pycryptodomex-3.9.9.dist-info/WHEEL b/frozen_deps/pycryptodomex-3.9.9.dist-info/WHEEL
deleted file mode 100644
index 3693e90..0000000
--- a/frozen_deps/pycryptodomex-3.9.9.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.35.1)
-Root-Is-Purelib: false
-Tag: cp39-cp39-manylinux1_x86_64
-
diff --git a/frozen_deps/pycryptodomex-3.9.9.dist-info/top_level.txt b/frozen_deps/pycryptodomex-3.9.9.dist-info/top_level.txt
deleted file mode 100644
index 9cbd375..0000000
--- a/frozen_deps/pycryptodomex-3.9.9.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-Cryptodome
diff --git a/frozen_deps/pysha3-1.0.2-py3.9.egg-info/PKG-INFO b/frozen_deps/pysha3-1.0.2-py3.9.egg-info/PKG-INFO
deleted file mode 100644
index 308023a..0000000
--- a/frozen_deps/pysha3-1.0.2-py3.9.egg-info/PKG-INFO
+++ /dev/null
@@ -1,249 +0,0 @@
-Metadata-Version: 1.2
-Name: pysha3
-Version: 1.0.2
-Summary: SHA-3 (Keccak) for Python 2.7 - 3.5
-Home-page: https://github.com/tiran/pysha3
-Author: Christian Heimes
-Author-email: [email protected]
-Maintainer: Christian Heimes
-Maintainer-email: [email protected]
-License: PSFL (Keccak: CC0 1.0 Universal)
-Description: ======
- pysha3
- ======
-
- SHA-3 wrapper (keccak) for Python. The package is a wrapper around the
- optimized Keccak Code Package, https://github.com/gvanas/KeccakCodePackage .
-
- The module is a standalone version of my SHA-3 module from Python 3.6
- (currently under development). The code in sha3module.c has been modified to
- be compatible with Python 2.7 to 3.5. Python 2.6 and earlier are not
- supported.
-
-
- Updates since pysha 0.3
- =======================
-
- **pysha3 1.0 is not compatible with pysha3 0.3!**
-
- pysha3 < 1.0 used the old Keccak implementation. During the finalization of
- SHA3, NIST changed the delimiter suffix from 0x01 to 0x06. The Keccak sponge
- function stayed the same. pysha3 1.0 provides the previous Keccak hash, too.
-
-
- Platforms
- =========
-
- pysha3 has been successfully tested on several platforms:
-
- - Linux (GCC, clang) on X86, X86_64 and ARMv6 (little endian)
- - Windows (VS 2008, VS 2010, VS2015) on X86 and X86_64
-
-
- Usage
- =====
-
- The `sha3` module contains several constructors for hash objects with a
- PEP 247 compatible interface. The module provides SHA3, SHAKE and Keccak:
-
- * `sha3_228()`, `sha3_256()`, `sha3_384()`, and `sha3_512()`
- * `shake_128()`, `shake_256()`
- * `keccak_228()`, `keccak_256()`, `keccak_384()`, and `keccak_512()`
-
- The `sha3` module monkey patches the `hashlib` module . The monkey patch is
- automatically activated with the first import of the `sha3` module. The
- `hashlib` module of Python 3.6 will support the four SHA-3 algorithms and
- the two SHAKE algorithms on all platforms. Therefore you shouldn't use the
- sha3 module directly and rather go through the `hashlib` interface::
-
- >>> import sys
- >>> import hashlib
- >>> if sys.version_info < (3, 6):
- ... import sha3
- >>> s = hashlib.sha3_512()
- >>> s.name
- 'sha3_512'
- >>> s.digest_size
- 64
- >>> s.update(b"data")
- >>> s.hexdigest()
- 'ceca4daf960c2bbfb4a9edaca9b8137a801b65bae377e0f534ef9141c8684c0fedc1768d1afde9766572846c42b935f61177eaf97d355fa8dc2bca3fecfa754d'
-
- >>> s = hashlib.shake_256()
- >>> s.update(b"data")
- >>> s.hexdigest(4)
- 'c73dbed8'
- >>> s.hexdigest(8)
- 'c73dbed8527f5ae0'
- >>> s.hexdigest(16)
- 'c73dbed8527f5ae0568679f30ecc5cb6'
-
- >>> import sha3
- >>> k = sha3.keccak_512()
- >>> k.update(b"data")
- >>> k.hexdigest()
- '1065aceeded3a5e4412e2187e919bffeadf815f5bd73d37fe00d384fe29f55f08462fdabe1007b993ce5b8119630e7db93101d9425d6e352e22ffe3dcb56b825'
-
- Changelog
- =========
-
- pysha3 1.0.2
- ------------
-
- *Release: 05-Feb-2017*
-
- - Rename internal C extension to _pysha3 to avoild conflict with Python 3.6'
- _sha3 extension.
-
- pysha3 1.0.1
- ------------
-
- *Release: 24-Jan-2017*
-
- - Fix github.org -> github.com (Pi Delport)
-
- - Fix endianness checks for Python 2 (William Grant)
-
- - Fix changelog, the Christmas release was 1.0.0, not 1.1.0
-
- pysha3 1.0.0
- ------------
-
- *Release date: 24-Dec-2016*
-
- - Synchronize with Python 3.6.0 release
-
- - Move all backport related additions to backport.inc
-
- - Fix flake8 violations
-
-
- pysha3 1.0b1
- ------------
-
- *Release date: 01-May-2016*
-
- - Update backend to use the latest Keccak Code Package. pysha3 now implements
- the official NIST standard. The old Keccak hashes are available with
- keccak prefix.
-
- - Add SHAKE support.
-
- - All sha3, shake and keccak variants are separate types instead of factory
- functions that return the same type.
-
- - Drop Python 2.6 and Python 3.0 to 3.3 support.
-
- - Fix typo that disabled threading optimization.
-
- - Add vector files for additional tests.
-
- - Add experimental HMAC support based on examples from
- http://wolfgang-ehrhardt.de/hmac-sha3-testvectors.html .
-
- - Test hashing of unaligned data.
-
- - Add ISO C11 memset_s() function as _Py_memset_s() in order to securely
- wipe memory that holds sensitive data. The page
- https://www.securecoding.cert.org/confluence/display/seccode/MSC06-C.+Be+aware+of+compiler+optimization+when+dealing+with+sensitive+data
- explains the motivation for memset_s().
-
- - Add tox support.
-
- - Add Travis and appveyor integration.
-
- - Add _capacity_bits, _rate_bits and _suffix attributes for diagnostic
- purposes.
-
-
- pysha3 0.3
- ----------
-
- *Release date: 14-Oct-2012*
-
- - Fix 64bit big endian support
-
- - Add workaround for alignment error on 64bit SPARC machine by using the opt32
- implementation.
-
- - block_size now returns NotImplemented to prevent users from using pysha3
- with the hmac module.
-
-
- pysha3 0.2.2
- ------------
-
- *Release date: 07-Oct-2012*
-
- - Re-add brg_endian.h to fix issue on Solaris (big endian platform)
-
-
- pysha3 0.2.1
- ------------
-
- *Release date: 06-Oct-2012*
-
- - Fix MANIFEST.in to include Makefile and tests.py
-
- - Add setup.py test command with hack for inplace builds
-
- - Enhance README.txt and fixed its markup
-
-
- pysha3 0.2
- ----------
-
- *Release date: 06-Oct-2012*
-
- - Change directory struct to use the same directory layout as Python 3.4.
-
- - Remove C++ comments from Keccak sources for ANSI C compatibility.
-
- - Declare all Keccak functions and globals as static to avoid name clashes.
-
- - Remove alias sha3() for sha3_512().
-
- - Add block_size attribute. Keccak has a internal sponge size of 1600 bits.
-
- - Release GIL around SHA3_update() calls.
-
- - Monkey patch the hashlib module to support, e.g. hashlib.sha3_512() and
- hashlib.new("sha3_512")
-
- - Release GIL around SHA3_update() when the data exceeds a certain size.
-
- - Fix build on platforms with an unsigned 64bit integer type (uint64_t). The
- module falls back to 32bit implementation of Keccak with interleave tables.
-
-
- pysha3 0.1
- ----------
-
- *Release date: 04-Oct-2012*
-
- - first release
-
- - based on KeccakReferenceAndOptimized-3.2.zip
-
-
-Keywords: sha3 sha-3 keccak hash
-Platform: POSIX
-Platform: Windows
-Classifier: Development Status :: 4 - Beta
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: Python Software Foundation License
-Classifier: License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
-Classifier: Natural Language :: English
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: POSIX :: BSD
-Classifier: Operating System :: POSIX :: Linux
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Programming Language :: C
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Topic :: Security :: Cryptography
diff --git a/frozen_deps/pysha3-1.0.2-py3.9.egg-info/SOURCES.txt b/frozen_deps/pysha3-1.0.2-py3.9.egg-info/SOURCES.txt
deleted file mode 100644
index 9cc250a..0000000
--- a/frozen_deps/pysha3-1.0.2-py3.9.egg-info/SOURCES.txt
+++ /dev/null
@@ -1,47 +0,0 @@
-CHANGES.txt
-LICENSE
-MANIFEST.in
-Makefile
-README.txt
-setup.cfg
-setup.py
-sha3.py
-tests.py
-Modules/hashlib.h
-Modules/pymemsets.c
-Modules/pymemsets.h
-Modules/_sha3/backport.inc
-Modules/_sha3/cleanup.py
-Modules/_sha3/sha3module.c
-Modules/_sha3/clinic/sha3module.c.h
-Modules/_sha3/kcp/KeccakHash.c
-Modules/_sha3/kcp/KeccakHash.h
-Modules/_sha3/kcp/KeccakP-1600-64.macros
-Modules/_sha3/kcp/KeccakP-1600-SnP-opt32.h
-Modules/_sha3/kcp/KeccakP-1600-SnP-opt64.h
-Modules/_sha3/kcp/KeccakP-1600-SnP.h
-Modules/_sha3/kcp/KeccakP-1600-inplace32BI.c
-Modules/_sha3/kcp/KeccakP-1600-opt64-config.h
-Modules/_sha3/kcp/KeccakP-1600-opt64.c
-Modules/_sha3/kcp/KeccakP-1600-unrolling.macros
-Modules/_sha3/kcp/KeccakSponge.c
-Modules/_sha3/kcp/KeccakSponge.h
-Modules/_sha3/kcp/KeccakSponge.inc
-Modules/_sha3/kcp/PlSnP-Fallback.inc
-Modules/_sha3/kcp/SnP-Relaned.h
-Modules/_sha3/kcp/align.h
-Modules/_sha3/kcp/brg_endian.h
-pysha3.egg-info/PKG-INFO
-pysha3.egg-info/SOURCES.txt
-pysha3.egg-info/dependency_links.txt
-pysha3.egg-info/top_level.txt
-vectors/keccak_224.txt
-vectors/keccak_256.txt
-vectors/keccak_384.txt
-vectors/keccak_512.txt
-vectors/sha3_224.txt
-vectors/sha3_256.txt
-vectors/sha3_384.txt
-vectors/sha3_512.txt
-vectors/shake_128.txt
-vectors/shake_256.txt \ No newline at end of file
diff --git a/frozen_deps/pysha3-1.0.2-py3.9.egg-info/dependency_links.txt b/frozen_deps/pysha3-1.0.2-py3.9.egg-info/dependency_links.txt
deleted file mode 100644
index 8b13789..0000000
--- a/frozen_deps/pysha3-1.0.2-py3.9.egg-info/dependency_links.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/frozen_deps/pysha3-1.0.2-py3.9.egg-info/installed-files.txt b/frozen_deps/pysha3-1.0.2-py3.9.egg-info/installed-files.txt
deleted file mode 100644
index aa90575..0000000
--- a/frozen_deps/pysha3-1.0.2-py3.9.egg-info/installed-files.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-../__pycache__/sha3.cpython-39.pyc
-../_pysha3.cpython-39-x86_64-linux-gnu.so
-../sha3.py
-PKG-INFO
-SOURCES.txt
-dependency_links.txt
-top_level.txt
diff --git a/frozen_deps/pysha3-1.0.2-py3.9.egg-info/top_level.txt b/frozen_deps/pysha3-1.0.2-py3.9.egg-info/top_level.txt
deleted file mode 100644
index a9e88ad..0000000
--- a/frozen_deps/pysha3-1.0.2-py3.9.egg-info/top_level.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-_pysha3
-sha3
diff --git a/frozen_deps/pysha3-1.0.2.dist-info/INSTALLER b/frozen_deps/pysha3-1.0.2.dist-info/INSTALLER
deleted file mode 100644
index a1b589e..0000000
--- a/frozen_deps/pysha3-1.0.2.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/frozen_deps/pysha3-1.0.2.dist-info/LICENSE b/frozen_deps/pysha3-1.0.2.dist-info/LICENSE
deleted file mode 100644
index 311690c..0000000
--- a/frozen_deps/pysha3-1.0.2.dist-info/LICENSE
+++ /dev/null
@@ -1,49 +0,0 @@
-PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
---------------------------------------------
-
-1. This LICENSE AGREEMENT is between the Python Software Foundation
-("PSF"), and the Individual or Organization ("Licensee") accessing and
-otherwise using this software ("Python") in source or binary form and
-its associated documentation.
-
-2. Subject to the terms and conditions of this License Agreement, PSF
-hereby grants Licensee a nonexclusive, royalty-free, world-wide
-license to reproduce, analyze, test, perform and/or display publicly,
-prepare derivative works, distribute, and otherwise use Python
-alone or in any derivative version, provided, however, that PSF's
-License Agreement and PSF's notice of copyright, i.e., "Copyright (c)
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Python Software Foundation;
-All Rights Reserved" are retained in Python alone or in any derivative
-version prepared by Licensee.
-
-3. In the event Licensee prepares a derivative work that is based on
-or incorporates Python or any part thereof, and wants to make
-the derivative work available to others as provided herein, then
-Licensee hereby agrees to include in any such work a brief summary of
-the changes made to Python.
-
-4. PSF is making Python available to Licensee on an "AS IS"
-basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
-IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
-DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
-FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
-INFRINGE ANY THIRD PARTY RIGHTS.
-
-5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
-FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
-A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
-OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
-6. This License Agreement will automatically terminate upon a material
-breach of its terms and conditions.
-
-7. Nothing in this License Agreement shall be deemed to create any
-relationship of agency, partnership, or joint venture between PSF and
-Licensee. This License Agreement does not grant permission to use PSF
-trademarks or trade name in a trademark sense to endorse or promote
-products or services of Licensee, or any third party.
-
-8. By copying, installing or otherwise using Python, Licensee
-agrees to be bound by the terms and conditions of this License
-Agreement.
-
diff --git a/frozen_deps/pysha3-1.0.2.dist-info/METADATA b/frozen_deps/pysha3-1.0.2.dist-info/METADATA
deleted file mode 100644
index a2e0aaa..0000000
--- a/frozen_deps/pysha3-1.0.2.dist-info/METADATA
+++ /dev/null
@@ -1,250 +0,0 @@
-Metadata-Version: 2.1
-Name: pysha3
-Version: 1.0.2
-Summary: SHA-3 (Keccak) for Python 2.7 - 3.5
-Home-page: https://github.com/tiran/pysha3
-Author: Christian Heimes
-Author-email: [email protected]
-Maintainer: Christian Heimes
-Maintainer-email: [email protected]
-License: PSFL (Keccak: CC0 1.0 Universal)
-Keywords: sha3 sha-3 keccak hash
-Platform: POSIX
-Platform: Windows
-Classifier: Development Status :: 4 - Beta
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: Python Software Foundation License
-Classifier: License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
-Classifier: Natural Language :: English
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: POSIX :: BSD
-Classifier: Operating System :: POSIX :: Linux
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Programming Language :: C
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Topic :: Security :: Cryptography
-License-File: LICENSE
-
-======
-pysha3
-======
-
-SHA-3 wrapper (keccak) for Python. The package is a wrapper around the
-optimized Keccak Code Package, https://github.com/gvanas/KeccakCodePackage .
-
-The module is a standalone version of my SHA-3 module from Python 3.6
-(currently under development). The code in sha3module.c has been modified to
-be compatible with Python 2.7 to 3.5. Python 2.6 and earlier are not
-supported.
-
-
-Updates since pysha 0.3
-=======================
-
-**pysha3 1.0 is not compatible with pysha3 0.3!**
-
-pysha3 < 1.0 used the old Keccak implementation. During the finalization of
-SHA3, NIST changed the delimiter suffix from 0x01 to 0x06. The Keccak sponge
-function stayed the same. pysha3 1.0 provides the previous Keccak hash, too.
-
-
-Platforms
-=========
-
-pysha3 has been successfully tested on several platforms:
-
- - Linux (GCC, clang) on X86, X86_64 and ARMv6 (little endian)
- - Windows (VS 2008, VS 2010, VS2015) on X86 and X86_64
-
-
-Usage
-=====
-
-The `sha3` module contains several constructors for hash objects with a
-PEP 247 compatible interface. The module provides SHA3, SHAKE and Keccak:
-
-* `sha3_228()`, `sha3_256()`, `sha3_384()`, and `sha3_512()`
-* `shake_128()`, `shake_256()`
-* `keccak_228()`, `keccak_256()`, `keccak_384()`, and `keccak_512()`
-
-The `sha3` module monkey patches the `hashlib` module . The monkey patch is
-automatically activated with the first import of the `sha3` module. The
-`hashlib` module of Python 3.6 will support the four SHA-3 algorithms and
-the two SHAKE algorithms on all platforms. Therefore you shouldn't use the
-sha3 module directly and rather go through the `hashlib` interface::
-
- >>> import sys
- >>> import hashlib
- >>> if sys.version_info < (3, 6):
- ... import sha3
- >>> s = hashlib.sha3_512()
- >>> s.name
- 'sha3_512'
- >>> s.digest_size
- 64
- >>> s.update(b"data")
- >>> s.hexdigest()
- 'ceca4daf960c2bbfb4a9edaca9b8137a801b65bae377e0f534ef9141c8684c0fedc1768d1afde9766572846c42b935f61177eaf97d355fa8dc2bca3fecfa754d'
-
- >>> s = hashlib.shake_256()
- >>> s.update(b"data")
- >>> s.hexdigest(4)
- 'c73dbed8'
- >>> s.hexdigest(8)
- 'c73dbed8527f5ae0'
- >>> s.hexdigest(16)
- 'c73dbed8527f5ae0568679f30ecc5cb6'
-
- >>> import sha3
- >>> k = sha3.keccak_512()
- >>> k.update(b"data")
- >>> k.hexdigest()
- '1065aceeded3a5e4412e2187e919bffeadf815f5bd73d37fe00d384fe29f55f08462fdabe1007b993ce5b8119630e7db93101d9425d6e352e22ffe3dcb56b825'
-
-Changelog
-=========
-
-pysha3 1.0.2
-------------
-
-*Release: 05-Feb-2017*
-
-- Rename internal C extension to _pysha3 to avoild conflict with Python 3.6'
- _sha3 extension.
-
-pysha3 1.0.1
-------------
-
-*Release: 24-Jan-2017*
-
-- Fix github.org -> github.com (Pi Delport)
-
-- Fix endianness checks for Python 2 (William Grant)
-
-- Fix changelog, the Christmas release was 1.0.0, not 1.1.0
-
-pysha3 1.0.0
-------------
-
-*Release date: 24-Dec-2016*
-
-- Synchronize with Python 3.6.0 release
-
-- Move all backport related additions to backport.inc
-
-- Fix flake8 violations
-
-
-pysha3 1.0b1
-------------
-
-*Release date: 01-May-2016*
-
-- Update backend to use the latest Keccak Code Package. pysha3 now implements
- the official NIST standard. The old Keccak hashes are available with
- keccak prefix.
-
-- Add SHAKE support.
-
-- All sha3, shake and keccak variants are separate types instead of factory
- functions that return the same type.
-
-- Drop Python 2.6 and Python 3.0 to 3.3 support.
-
-- Fix typo that disabled threading optimization.
-
-- Add vector files for additional tests.
-
-- Add experimental HMAC support based on examples from
- http://wolfgang-ehrhardt.de/hmac-sha3-testvectors.html .
-
-- Test hashing of unaligned data.
-
-- Add ISO C11 memset_s() function as _Py_memset_s() in order to securely
- wipe memory that holds sensitive data. The page
- https://www.securecoding.cert.org/confluence/display/seccode/MSC06-C.+Be+aware+of+compiler+optimization+when+dealing+with+sensitive+data
- explains the motivation for memset_s().
-
-- Add tox support.
-
-- Add Travis and appveyor integration.
-
-- Add _capacity_bits, _rate_bits and _suffix attributes for diagnostic
- purposes.
-
-
-pysha3 0.3
-----------
-
-*Release date: 14-Oct-2012*
-
-- Fix 64bit big endian support
-
-- Add workaround for alignment error on 64bit SPARC machine by using the opt32
- implementation.
-
-- block_size now returns NotImplemented to prevent users from using pysha3
- with the hmac module.
-
-
-pysha3 0.2.2
-------------
-
-*Release date: 07-Oct-2012*
-
-- Re-add brg_endian.h to fix issue on Solaris (big endian platform)
-
-
-pysha3 0.2.1
-------------
-
-*Release date: 06-Oct-2012*
-
-- Fix MANIFEST.in to include Makefile and tests.py
-
-- Add setup.py test command with hack for inplace builds
-
-- Enhance README.txt and fixed its markup
-
-
-pysha3 0.2
-----------
-
-*Release date: 06-Oct-2012*
-
-- Change directory struct to use the same directory layout as Python 3.4.
-
-- Remove C++ comments from Keccak sources for ANSI C compatibility.
-
-- Declare all Keccak functions and globals as static to avoid name clashes.
-
-- Remove alias sha3() for sha3_512().
-
-- Add block_size attribute. Keccak has a internal sponge size of 1600 bits.
-
-- Release GIL around SHA3_update() calls.
-
-- Monkey patch the hashlib module to support, e.g. hashlib.sha3_512() and
- hashlib.new("sha3_512")
-
-- Release GIL around SHA3_update() when the data exceeds a certain size.
-
-- Fix build on platforms with an unsigned 64bit integer type (uint64_t). The
- module falls back to 32bit implementation of Keccak with interleave tables.
-
-
-pysha3 0.1
-----------
-
-*Release date: 04-Oct-2012*
-
-- first release
-
-- based on KeccakReferenceAndOptimized-3.2.zip
-
diff --git a/frozen_deps/pysha3-1.0.2.dist-info/RECORD b/frozen_deps/pysha3-1.0.2.dist-info/RECORD
deleted file mode 100644
index 4e27e67..0000000
--- a/frozen_deps/pysha3-1.0.2.dist-info/RECORD
+++ /dev/null
@@ -1,9 +0,0 @@
-__pycache__/sha3.cpython-310.pyc,,
-_pysha3.cpython-310-x86_64-linux-gnu.so,sha256=78P0sVJ96derABo3IAPLSY-6JPc7LmMv76Z4sLKTBb8,381088
-pysha3-1.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-pysha3-1.0.2.dist-info/LICENSE,sha256=uAzp2oxCofkQeWJ_u-K_JyEK4Qig_-Xwd9WwjgdsJMg,2409
-pysha3-1.0.2.dist-info/METADATA,sha256=dv_VgbGxuacT4ckz_NKW0rQxf4c_G_YpKjdDffjvk-k,6830
-pysha3-1.0.2.dist-info/RECORD,,
-pysha3-1.0.2.dist-info/WHEEL,sha256=nTy_Z8ivGEB6qFwVLg7_h6rq0Jt0JU5Pz2cL2_FjSMQ,105
-pysha3-1.0.2.dist-info/top_level.txt,sha256=FdKZVala00U6bdey3Qbc6yW7Z1rzdaDs8Iet_iwYDP8,13
-sha3.py,sha256=QeJrjR0om_CROYj4xnndQXqkkr9Y9R11XsCKKiyYTzs,746
diff --git a/frozen_deps/pysha3-1.0.2.dist-info/WHEEL b/frozen_deps/pysha3-1.0.2.dist-info/WHEEL
deleted file mode 100644
index 3f78a79..0000000
--- a/frozen_deps/pysha3-1.0.2.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.37.1)
-Root-Is-Purelib: false
-Tag: cp310-cp310-linux_x86_64
-
diff --git a/frozen_deps/pysha3-1.0.2.dist-info/top_level.txt b/frozen_deps/pysha3-1.0.2.dist-info/top_level.txt
deleted file mode 100644
index a9e88ad..0000000
--- a/frozen_deps/pysha3-1.0.2.dist-info/top_level.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-_pysha3
-sha3
diff --git a/frozen_deps/six-1.15.0.dist-info/INSTALLER b/frozen_deps/six-1.15.0.dist-info/INSTALLER
deleted file mode 100644
index a1b589e..0000000
--- a/frozen_deps/six-1.15.0.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/frozen_deps/six-1.15.0.dist-info/LICENSE b/frozen_deps/six-1.15.0.dist-info/LICENSE
deleted file mode 100644
index de66331..0000000
--- a/frozen_deps/six-1.15.0.dist-info/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-Copyright (c) 2010-2020 Benjamin Peterson
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-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.
diff --git a/frozen_deps/six-1.15.0.dist-info/METADATA b/frozen_deps/six-1.15.0.dist-info/METADATA
deleted file mode 100644
index 869bf25..0000000
--- a/frozen_deps/six-1.15.0.dist-info/METADATA
+++ /dev/null
@@ -1,49 +0,0 @@
-Metadata-Version: 2.1
-Name: six
-Version: 1.15.0
-Summary: Python 2 and 3 compatibility utilities
-Home-page: https://github.com/benjaminp/six
-Author: Benjamin Peterson
-Author-email: [email protected]
-License: MIT
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 3
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Topic :: Utilities
-Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*
-
-.. image:: https://img.shields.io/pypi/v/six.svg
- :target: https://pypi.org/project/six/
- :alt: six on PyPI
-
-.. image:: https://travis-ci.org/benjaminp/six.svg?branch=master
- :target: https://travis-ci.org/benjaminp/six
- :alt: six on TravisCI
-
-.. image:: https://readthedocs.org/projects/six/badge/?version=latest
- :target: https://six.readthedocs.io/
- :alt: six's documentation on Read the Docs
-
-.. image:: https://img.shields.io/badge/license-MIT-green.svg
- :target: https://github.com/benjaminp/six/blob/master/LICENSE
- :alt: MIT License badge
-
-Six is a Python 2 and 3 compatibility library. It provides utility functions
-for smoothing over the differences between the Python versions with the goal of
-writing Python code that is compatible on both Python versions. See the
-documentation for more information on what is provided.
-
-Six supports Python 2.7 and 3.3+. It is contained in only one Python
-file, so it can be easily copied into your project. (The copyright and license
-notice must be retained.)
-
-Online documentation is at https://six.readthedocs.io/.
-
-Bugs can be reported to https://github.com/benjaminp/six. The code can also
-be found there.
-
-
diff --git a/frozen_deps/six-1.15.0.dist-info/RECORD b/frozen_deps/six-1.15.0.dist-info/RECORD
deleted file mode 100644
index 3805356..0000000
--- a/frozen_deps/six-1.15.0.dist-info/RECORD
+++ /dev/null
@@ -1,8 +0,0 @@
-__pycache__/six.cpython-39.pyc,,
-six-1.15.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-six-1.15.0.dist-info/LICENSE,sha256=i7hQxWWqOJ_cFvOkaWWtI9gq3_YPI5P8J2K2MYXo5sk,1066
-six-1.15.0.dist-info/METADATA,sha256=W6rlyoeMZHXh6srP9NXNsm0rjAf_660re8WdH5TBT8E,1795
-six-1.15.0.dist-info/RECORD,,
-six-1.15.0.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
-six-1.15.0.dist-info/top_level.txt,sha256=_iVH_iYEtEXnD8nYGQYpYFUvkUW9sEO1GYbkeKSAais,4
-six.py,sha256=U4Z_yv534W5CNyjY9i8V1OXY2SjAny8y2L5vDLhhThM,34159
diff --git a/frozen_deps/six-1.15.0.dist-info/WHEEL b/frozen_deps/six-1.15.0.dist-info/WHEEL
deleted file mode 100644
index ef99c6c..0000000
--- a/frozen_deps/six-1.15.0.dist-info/WHEEL
+++ /dev/null
@@ -1,6 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.34.2)
-Root-Is-Purelib: true
-Tag: py2-none-any
-Tag: py3-none-any
-
diff --git a/frozen_deps/six-1.15.0.dist-info/top_level.txt b/frozen_deps/six-1.15.0.dist-info/top_level.txt
deleted file mode 100644
index ffe2fce..0000000
--- a/frozen_deps/six-1.15.0.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-six
diff --git a/frozen_deps/six-1.16.0.dist-info/INSTALLER b/frozen_deps/six-1.16.0.dist-info/INSTALLER
deleted file mode 100644
index a1b589e..0000000
--- a/frozen_deps/six-1.16.0.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/frozen_deps/six-1.16.0.dist-info/LICENSE b/frozen_deps/six-1.16.0.dist-info/LICENSE
deleted file mode 100644
index de66331..0000000
--- a/frozen_deps/six-1.16.0.dist-info/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-Copyright (c) 2010-2020 Benjamin Peterson
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-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.
diff --git a/frozen_deps/six-1.16.0.dist-info/METADATA b/frozen_deps/six-1.16.0.dist-info/METADATA
deleted file mode 100644
index 6d7525c..0000000
--- a/frozen_deps/six-1.16.0.dist-info/METADATA
+++ /dev/null
@@ -1,49 +0,0 @@
-Metadata-Version: 2.1
-Name: six
-Version: 1.16.0
-Summary: Python 2 and 3 compatibility utilities
-Home-page: https://github.com/benjaminp/six
-Author: Benjamin Peterson
-Author-email: [email protected]
-License: MIT
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 3
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Topic :: Utilities
-Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*
-
-.. image:: https://img.shields.io/pypi/v/six.svg
- :target: https://pypi.org/project/six/
- :alt: six on PyPI
-
-.. image:: https://travis-ci.org/benjaminp/six.svg?branch=master
- :target: https://travis-ci.org/benjaminp/six
- :alt: six on TravisCI
-
-.. image:: https://readthedocs.org/projects/six/badge/?version=latest
- :target: https://six.readthedocs.io/
- :alt: six's documentation on Read the Docs
-
-.. image:: https://img.shields.io/badge/license-MIT-green.svg
- :target: https://github.com/benjaminp/six/blob/master/LICENSE
- :alt: MIT License badge
-
-Six is a Python 2 and 3 compatibility library. It provides utility functions
-for smoothing over the differences between the Python versions with the goal of
-writing Python code that is compatible on both Python versions. See the
-documentation for more information on what is provided.
-
-Six supports Python 2.7 and 3.3+. It is contained in only one Python
-file, so it can be easily copied into your project. (The copyright and license
-notice must be retained.)
-
-Online documentation is at https://six.readthedocs.io/.
-
-Bugs can be reported to https://github.com/benjaminp/six. The code can also
-be found there.
-
-
diff --git a/frozen_deps/six-1.16.0.dist-info/RECORD b/frozen_deps/six-1.16.0.dist-info/RECORD
deleted file mode 100644
index ed0b598..0000000
--- a/frozen_deps/six-1.16.0.dist-info/RECORD
+++ /dev/null
@@ -1,8 +0,0 @@
-__pycache__/six.cpython-310.pyc,,
-six-1.16.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-six-1.16.0.dist-info/LICENSE,sha256=i7hQxWWqOJ_cFvOkaWWtI9gq3_YPI5P8J2K2MYXo5sk,1066
-six-1.16.0.dist-info/METADATA,sha256=VQcGIFCAEmfZcl77E5riPCN4v2TIsc_qtacnjxKHJoI,1795
-six-1.16.0.dist-info/RECORD,,
-six-1.16.0.dist-info/WHEEL,sha256=Z-nyYpwrcSqxfdux5Mbn_DQ525iP7J2DG3JgGvOYyTQ,110
-six-1.16.0.dist-info/top_level.txt,sha256=_iVH_iYEtEXnD8nYGQYpYFUvkUW9sEO1GYbkeKSAais,4
-six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549
diff --git a/frozen_deps/six-1.16.0.dist-info/WHEEL b/frozen_deps/six-1.16.0.dist-info/WHEEL
deleted file mode 100644
index 01b8fc7..0000000
--- a/frozen_deps/six-1.16.0.dist-info/WHEEL
+++ /dev/null
@@ -1,6 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.36.2)
-Root-Is-Purelib: true
-Tag: py2-none-any
-Tag: py3-none-any
-
diff --git a/frozen_deps/six-1.16.0.dist-info/top_level.txt b/frozen_deps/six-1.16.0.dist-info/top_level.txt
deleted file mode 100644
index ffe2fce..0000000
--- a/frozen_deps/six-1.16.0.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-six
diff --git a/keytree-0.1.7-x86_64.AppImage.zsync b/keytree-0.1.7-x86_64.AppImage.zsync
deleted file mode 100644
index 4fa6e4f..0000000
--- a/keytree-0.1.7-x86_64.AppImage.zsync
+++ /dev/null
Binary files differ
diff --git a/keytree-0.1.7-x86_64.AppImage b/keytree-0.1.8-x86_64.AppImage
index 35c2824..be2ffc3 100755
--- a/keytree-0.1.7-x86_64.AppImage
+++ b/keytree-0.1.8-x86_64.AppImage
Binary files differ
diff --git a/keytree-0.1.8-x86_64.AppImage.zsync b/keytree-0.1.8-x86_64.AppImage.zsync
new file mode 100644
index 0000000..03a07b9
--- /dev/null
+++ b/keytree-0.1.8-x86_64.AppImage.zsync
Binary files differ
diff --git a/setup.py b/setup.py
index f9e4b7e..6113794 100644
--- a/setup.py
+++ b/setup.py
@@ -8,5 +8,5 @@ setup(name='keytree.py',
author_email='[email protected]',
license='MIT',
scripts=['keytree.py'],
- py_modules=['bech32'],
+ py_modules=['bech32', 'mnemonic', 'shamir'],
install_requires=['ecdsa', 'base58', 'pysha3', 'pycryptodomex'])