From 8d1c76ec7caf247d5675e14260d20fc508977ffb Mon Sep 17 00:00:00 2001 From: Determinant Date: Fri, 23 Aug 2024 03:14:03 +0000 Subject: release v0.1.8 --- frozen_deps/Cryptodome/Cipher/AES.py | 174 ++--- frozen_deps/Cryptodome/Cipher/AES.pyi | 155 +++- frozen_deps/Cryptodome/Cipher/ARC2.pyi | 12 +- frozen_deps/Cryptodome/Cipher/ARC4.py | 7 +- frozen_deps/Cryptodome/Cipher/ARC4.pyi | 2 +- frozen_deps/Cryptodome/Cipher/Blowfish.pyi | 12 +- frozen_deps/Cryptodome/Cipher/CAST.pyi | 12 +- frozen_deps/Cryptodome/Cipher/ChaCha20.py | 10 +- frozen_deps/Cryptodome/Cipher/ChaCha20.pyi | 6 +- frozen_deps/Cryptodome/Cipher/ChaCha20_Poly1305.py | 32 +- .../Cryptodome/Cipher/ChaCha20_Poly1305.pyi | 6 +- frozen_deps/Cryptodome/Cipher/DES.pyi | 12 +- frozen_deps/Cryptodome/Cipher/DES3.pyi | 12 +- frozen_deps/Cryptodome/Cipher/PKCS1_OAEP.py | 44 +- frozen_deps/Cryptodome/Cipher/PKCS1_v1_5.py | 38 +- frozen_deps/Cryptodome/Cipher/Salsa20.pyi | 5 +- frozen_deps/Cryptodome/Cipher/_ARC4.abi3.so | Bin 13768 -> 21016 bytes .../Cipher/_ARC4.cpython-39-x86_64-linux-gnu.so | Bin 14354 -> 0 bytes frozen_deps/Cryptodome/Cipher/_Salsa20.abi3.so | Bin 26784 -> 27016 bytes .../Cipher/_Salsa20.cpython-39-x86_64-linux-gnu.so | Bin 21734 -> 0 bytes frozen_deps/Cryptodome/Cipher/_chacha20.abi3.so | Bin 28224 -> 30624 bytes .../_chacha20.cpython-39-x86_64-linux-gnu.so | Bin 25741 -> 0 bytes frozen_deps/Cryptodome/Cipher/_mode_cbc.py | 22 +- frozen_deps/Cryptodome/Cipher/_mode_ccm.py | 30 +- frozen_deps/Cryptodome/Cipher/_mode_cfb.py | 22 +- frozen_deps/Cryptodome/Cipher/_mode_ctr.py | 10 +- frozen_deps/Cryptodome/Cipher/_mode_eax.py | 30 +- frozen_deps/Cryptodome/Cipher/_mode_gcm.py | 32 +- frozen_deps/Cryptodome/Cipher/_mode_ocb.py | 45 +- frozen_deps/Cryptodome/Cipher/_mode_ofb.py | 20 +- frozen_deps/Cryptodome/Cipher/_mode_siv.py | 32 +- .../Cryptodome/Cipher/_pkcs1_decode.abi3.so | Bin 28096 -> 56536 bytes .../Cryptodome/Cipher/_pkcs1_oaep_decode.py | 41 ++ frozen_deps/Cryptodome/Cipher/_raw_aes.abi3.so | Bin 66256 -> 106808 bytes .../Cipher/_raw_aes.cpython-39-x86_64-linux-gnu.so | Bin 54112 -> 0 bytes frozen_deps/Cryptodome/Cipher/_raw_aesni.abi3.so | Bin 101136 -> 106384 bytes .../_raw_aesni.cpython-39-x86_64-linux-gnu.so | Bin 52331 -> 0 bytes frozen_deps/Cryptodome/Cipher/_raw_arc2.abi3.so | Bin 43776 -> 46464 bytes .../_raw_arc2.cpython-39-x86_64-linux-gnu.so | Bin 18917 -> 0 bytes .../Cryptodome/Cipher/_raw_blowfish.abi3.so | Bin 69976 -> 78640 bytes .../_raw_blowfish.cpython-39-x86_64-linux-gnu.so | Bin 26938 -> 0 bytes frozen_deps/Cryptodome/Cipher/_raw_cast.abi3.so | Bin 42976 -> 57408 bytes .../_raw_cast.cpython-39-x86_64-linux-gnu.so | Bin 44422 -> 0 bytes frozen_deps/Cryptodome/Cipher/_raw_cbc.abi3.so | Bin 20736 -> 23000 bytes .../Cipher/_raw_cbc.cpython-39-x86_64-linux-gnu.so | Bin 17215 -> 0 bytes frozen_deps/Cryptodome/Cipher/_raw_cfb.abi3.so | Bin 25440 -> 26864 bytes .../Cipher/_raw_cfb.cpython-39-x86_64-linux-gnu.so | Bin 22696 -> 0 bytes frozen_deps/Cryptodome/Cipher/_raw_ctr.abi3.so | Bin 28600 -> 31336 bytes .../Cipher/_raw_ctr.cpython-39-x86_64-linux-gnu.so | Bin 23249 -> 0 bytes frozen_deps/Cryptodome/Cipher/_raw_des.abi3.so | Bin 75672 -> 71560 bytes .../Cipher/_raw_des.cpython-39-x86_64-linux-gnu.so | Bin 62525 -> 0 bytes frozen_deps/Cryptodome/Cipher/_raw_des3.abi3.so | Bin 76480 -> 72520 bytes .../_raw_des3.cpython-39-x86_64-linux-gnu.so | Bin 63370 -> 0 bytes frozen_deps/Cryptodome/Cipher/_raw_ecb.abi3.so | Bin 12440 -> 19016 bytes .../Cipher/_raw_ecb.cpython-39-x86_64-linux-gnu.so | Bin 10893 -> 0 bytes .../Cryptodome/Cipher/_raw_eksblowfish.abi3.so | Bin 166264 -> 181192 bytes ..._raw_eksblowfish.cpython-39-x86_64-linux-gnu.so | Bin 58926 -> 0 bytes frozen_deps/Cryptodome/Cipher/_raw_ocb.abi3.so | Bin 37344 -> 45856 bytes .../Cipher/_raw_ocb.cpython-39-x86_64-linux-gnu.so | Bin 30281 -> 0 bytes frozen_deps/Cryptodome/Cipher/_raw_ofb.abi3.so | Bin 15368 -> 22128 bytes .../Cipher/_raw_ofb.cpython-39-x86_64-linux-gnu.so | Bin 14743 -> 0 bytes frozen_deps/Cryptodome/Hash/BLAKE2b.py | 4 +- frozen_deps/Cryptodome/Hash/BLAKE2s.py | 2 +- frozen_deps/Cryptodome/Hash/CMAC.py | 12 +- frozen_deps/Cryptodome/Hash/HMAC.py | 27 +- frozen_deps/Cryptodome/Hash/KangarooTwelve.py | 78 +- frozen_deps/Cryptodome/Hash/TupleHash128.py | 18 +- frozen_deps/Cryptodome/Hash/TupleHash128.pyi | 4 +- frozen_deps/Cryptodome/Hash/TupleHash256.py | 3 - frozen_deps/Cryptodome/Hash/TurboSHAKE128.py | 112 +++ frozen_deps/Cryptodome/Hash/TurboSHAKE128.pyi | 17 + frozen_deps/Cryptodome/Hash/TurboSHAKE256.py | 22 + frozen_deps/Cryptodome/Hash/TurboSHAKE256.pyi | 12 + frozen_deps/Cryptodome/Hash/_BLAKE2b.abi3.so | Bin 21888 -> 27424 bytes .../Hash/_BLAKE2b.cpython-39-x86_64-linux-gnu.so | Bin 20015 -> 0 bytes frozen_deps/Cryptodome/Hash/_BLAKE2s.abi3.so | Bin 21712 -> 26952 bytes .../Hash/_BLAKE2s.cpython-39-x86_64-linux-gnu.so | Bin 20807 -> 0 bytes frozen_deps/Cryptodome/Hash/_MD2.abi3.so | Bin 20128 -> 23136 bytes .../Hash/_MD2.cpython-39-x86_64-linux-gnu.so | Bin 16919 -> 0 bytes frozen_deps/Cryptodome/Hash/_MD4.abi3.so | Bin 25576 -> 27192 bytes .../Hash/_MD4.cpython-39-x86_64-linux-gnu.so | Bin 19072 -> 0 bytes frozen_deps/Cryptodome/Hash/_MD5.abi3.so | Bin 31704 -> 32008 bytes .../Hash/_MD5.cpython-39-x86_64-linux-gnu.so | Bin 25434 -> 0 bytes frozen_deps/Cryptodome/Hash/_RIPEMD160.abi3.so | Bin 55608 -> 60728 bytes .../Hash/_RIPEMD160.cpython-39-x86_64-linux-gnu.so | Bin 27226 -> 0 bytes frozen_deps/Cryptodome/Hash/_SHA1.abi3.so | Bin 74416 -> 72064 bytes .../Hash/_SHA1.cpython-39-x86_64-linux-gnu.so | Bin 84273 -> 0 bytes frozen_deps/Cryptodome/Hash/_SHA224.abi3.so | Bin 43792 -> 45768 bytes .../Hash/_SHA224.cpython-39-x86_64-linux-gnu.so | Bin 35822 -> 0 bytes frozen_deps/Cryptodome/Hash/_SHA256.abi3.so | Bin 43872 -> 45832 bytes .../Hash/_SHA256.cpython-39-x86_64-linux-gnu.so | Bin 35806 -> 0 bytes frozen_deps/Cryptodome/Hash/_SHA384.abi3.so | Bin 50520 -> 54160 bytes .../Hash/_SHA384.cpython-39-x86_64-linux-gnu.so | Bin 41869 -> 0 bytes frozen_deps/Cryptodome/Hash/_SHA512.abi3.so | Bin 50624 -> 54200 bytes .../Hash/_SHA512.cpython-39-x86_64-linux-gnu.so | Bin 41967 -> 0 bytes frozen_deps/Cryptodome/Hash/__init__.py | 49 +- frozen_deps/Cryptodome/Hash/__init__.pyi | 57 ++ frozen_deps/Cryptodome/Hash/_ghash_clmul.abi3.so | Bin 50160 -> 58376 bytes .../_ghash_clmul.cpython-39-x86_64-linux-gnu.so | Bin 34203 -> 0 bytes .../Cryptodome/Hash/_ghash_portable.abi3.so | Bin 17432 -> 25024 bytes .../_ghash_portable.cpython-39-x86_64-linux-gnu.so | Bin 18711 -> 0 bytes frozen_deps/Cryptodome/Hash/_keccak.abi3.so | Bin 35064 -> 41632 bytes .../Hash/_keccak.cpython-39-x86_64-linux-gnu.so | Bin 26749 -> 0 bytes frozen_deps/Cryptodome/Hash/_poly1305.abi3.so | Bin 33360 -> 33424 bytes .../Hash/_poly1305.cpython-39-x86_64-linux-gnu.so | Bin 25921 -> 0 bytes frozen_deps/Cryptodome/Hash/cSHAKE128.py | 6 +- frozen_deps/Cryptodome/IO/PKCS8.py | 49 +- frozen_deps/Cryptodome/IO/PKCS8.pyi | 15 +- frozen_deps/Cryptodome/IO/_PBES.py | 229 ++++-- frozen_deps/Cryptodome/IO/_PBES.pyi | 15 +- frozen_deps/Cryptodome/Math/Numbers.pyi | 6 +- frozen_deps/Cryptodome/Math/_IntegerBase.py | 20 + frozen_deps/Cryptodome/Math/_IntegerBase.pyi | 6 + frozen_deps/Cryptodome/Math/_IntegerCustom.py | 56 +- frozen_deps/Cryptodome/Math/_IntegerGMP.py | 20 + frozen_deps/Cryptodome/Math/_IntegerNative.py | 45 +- frozen_deps/Cryptodome/Math/_modexp.abi3.so | Bin 294464 -> 213552 bytes .../Math/_modexp.cpython-39-x86_64-linux-gnu.so | Bin 207274 -> 0 bytes frozen_deps/Cryptodome/Protocol/DH.py | 101 +++ frozen_deps/Cryptodome/Protocol/DH.pyi | 15 + frozen_deps/Cryptodome/Protocol/KDF.py | 80 ++- frozen_deps/Cryptodome/Protocol/KDF.pyi | 20 +- frozen_deps/Cryptodome/Protocol/__init__.py | 2 +- frozen_deps/Cryptodome/Protocol/_scrypt.abi3.so | Bin 25024 -> 26176 bytes .../_scrypt.cpython-39-x86_64-linux-gnu.so | Bin 16510 -> 0 bytes frozen_deps/Cryptodome/PublicKey/ECC.py | 56 +- frozen_deps/Cryptodome/PublicKey/ECC.pyi | 50 +- frozen_deps/Cryptodome/PublicKey/RSA.py | 150 ++-- frozen_deps/Cryptodome/PublicKey/RSA.pyi | 41 +- frozen_deps/Cryptodome/PublicKey/_ec_ws.abi3.so | Bin 1068008 -> 960552 bytes .../_ec_ws.cpython-39-x86_64-linux-gnu.so | Bin 1000375 -> 0 bytes frozen_deps/Cryptodome/PublicKey/_ed25519.abi3.so | Bin 578280 -> 220544 bytes frozen_deps/Cryptodome/PublicKey/_ed448.abi3.so | Bin 329424 -> 250592 bytes frozen_deps/Cryptodome/PublicKey/_x25519.abi3.so | Bin 124632 -> 79472 bytes frozen_deps/Cryptodome/Random/random.pyi | 6 +- frozen_deps/Cryptodome/Signature/PKCS1_PSS.pyi | 27 +- frozen_deps/Cryptodome/Signature/PKCS1_v1_5.pyi | 14 +- frozen_deps/Cryptodome/Signature/eddsa.py | 12 +- frozen_deps/Cryptodome/Signature/eddsa.pyi | 2 +- frozen_deps/Cryptodome/Signature/pkcs1_15.py | 11 +- frozen_deps/Cryptodome/Signature/pss.py | 11 +- frozen_deps/Cryptodome/Signature/pss.pyi | 2 +- frozen_deps/Cryptodome/Util/Counter.py | 2 + frozen_deps/Cryptodome/Util/_cpuid_c.abi3.so | Bin 12776 -> 19304 bytes .../Util/_cpuid_c.cpython-39-x86_64-linux-gnu.so | Bin 10899 -> 0 bytes frozen_deps/Cryptodome/Util/_raw_api.py | 6 + frozen_deps/Cryptodome/Util/_strxor.abi3.so | Bin 14960 -> 20376 bytes .../Util/_strxor.cpython-39-x86_64-linux-gnu.so | Bin 13213 -> 0 bytes frozen_deps/Cryptodome/Util/asn1.py | 209 ++++-- frozen_deps/Cryptodome/Util/asn1.pyi | 18 +- frozen_deps/Cryptodome/Util/number.py | 81 ++- frozen_deps/Cryptodome/Util/py3compat.py | 11 + frozen_deps/Cryptodome/__init__.py | 2 +- .../_pysha3.cpython-310-x86_64-linux-gnu.so | Bin 381088 -> 358248 bytes frozen_deps/_pysha3.cpython-38-x86_64-linux-gnu.so | Bin 517664 -> 0 bytes frozen_deps/_pysha3.cpython-39-x86_64-linux-gnu.so | Bin 517208 -> 0 bytes frozen_deps/base58-2.0.1.dist-info/COPYING | 19 - frozen_deps/base58-2.0.1.dist-info/INSTALLER | 1 - frozen_deps/base58-2.0.1.dist-info/METADATA | 20 - frozen_deps/base58-2.0.1.dist-info/RECORD | 13 - frozen_deps/base58-2.0.1.dist-info/WHEEL | 5 - .../base58-2.0.1.dist-info/entry_points.txt | 3 - frozen_deps/base58-2.0.1.dist-info/top_level.txt | 1 - frozen_deps/base58-2.1.0.dist-info/COPYING | 19 - frozen_deps/base58-2.1.0.dist-info/INSTALLER | 1 - frozen_deps/base58-2.1.0.dist-info/METADATA | 85 --- frozen_deps/base58-2.1.0.dist-info/RECORD | 13 - frozen_deps/base58-2.1.0.dist-info/WHEEL | 5 - .../base58-2.1.0.dist-info/entry_points.txt | 3 - frozen_deps/base58-2.1.0.dist-info/top_level.txt | 1 - frozen_deps/base58-2.1.1.dist-info/COPYING | 19 - frozen_deps/base58-2.1.1.dist-info/INSTALLER | 1 - frozen_deps/base58-2.1.1.dist-info/METADATA | 86 --- frozen_deps/base58-2.1.1.dist-info/RECORD | 13 - frozen_deps/base58-2.1.1.dist-info/WHEEL | 5 - .../base58-2.1.1.dist-info/entry_points.txt | 3 - frozen_deps/base58-2.1.1.dist-info/top_level.txt | 1 - frozen_deps/bech32.py | 123 ---- frozen_deps/bin/base58 | 8 - frozen_deps/bin/keytree.py | 438 ------------ frozen_deps/ecdsa-0.16.1.dist-info/INSTALLER | 1 - frozen_deps/ecdsa-0.16.1.dist-info/LICENSE | 24 - frozen_deps/ecdsa-0.16.1.dist-info/METADATA | 626 ---------------- frozen_deps/ecdsa-0.16.1.dist-info/RECORD | 52 -- frozen_deps/ecdsa-0.16.1.dist-info/WHEEL | 6 - frozen_deps/ecdsa-0.16.1.dist-info/top_level.txt | 1 - frozen_deps/ecdsa-0.18.0.dist-info/INSTALLER | 1 - frozen_deps/ecdsa-0.18.0.dist-info/LICENSE | 24 - frozen_deps/ecdsa-0.18.0.dist-info/METADATA | 675 ------------------ frozen_deps/ecdsa-0.18.0.dist-info/RECORD | 64 -- frozen_deps/ecdsa-0.18.0.dist-info/WHEEL | 6 - frozen_deps/ecdsa-0.18.0.dist-info/top_level.txt | 1 - frozen_deps/ecdsa/__init__.py | 14 + frozen_deps/ecdsa/_compat.py | 27 +- frozen_deps/ecdsa/_version.py | 6 +- frozen_deps/ecdsa/curves.py | 77 ++ frozen_deps/ecdsa/der.py | 32 +- frozen_deps/ecdsa/ecdsa.py | 247 ++++++- frozen_deps/ecdsa/ellipticcurve.py | 28 +- frozen_deps/ecdsa/keys.py | 41 +- frozen_deps/ecdsa/numbertheory.py | 30 +- frozen_deps/ecdsa/ssh.py | 83 +++ frozen_deps/ecdsa/test_der.py | 80 ++- frozen_deps/ecdsa/test_ecdh.py | 8 + frozen_deps/ecdsa/test_ecdsa.py | 45 +- frozen_deps/ecdsa/test_eddsa.py | 47 +- frozen_deps/ecdsa/test_ellipticcurve.py | 63 +- frozen_deps/ecdsa/test_jacobi.py | 140 +++- frozen_deps/ecdsa/test_keys.py | 207 +++++- frozen_deps/ecdsa/test_malformed_sigs.py | 46 +- frozen_deps/ecdsa/test_numbertheory.py | 64 +- frozen_deps/ecdsa/test_pyecdsa.py | 607 +++++++++++----- frozen_deps/ecdsa/test_sha3.py | 4 +- frozen_deps/ecdsa/util.py | 126 +++- frozen_deps/keytree.py-0.2-py3.9.egg-info/PKG-INFO | 10 - .../keytree.py-0.2-py3.9.egg-info/SOURCES.txt | 9 - .../dependency_links.txt | 1 - .../installed-files.txt | 8 - .../keytree.py-0.2-py3.9.egg-info/requires.txt | 5 - .../keytree.py-0.2-py3.9.egg-info/top_level.txt | 1 - frozen_deps/keytree.py-0.2.dist-info/INSTALLER | 1 - frozen_deps/keytree.py-0.2.dist-info/METADATA | 14 - frozen_deps/keytree.py-0.2.dist-info/RECORD | 11 - frozen_deps/keytree.py-0.2.dist-info/REQUESTED | 0 frozen_deps/keytree.py-0.2.dist-info/WHEEL | 5 - .../keytree.py-0.2.dist-info/direct_url.json | 1 - frozen_deps/keytree.py-0.2.dist-info/top_level.txt | 1 - .../pycryptodomex-3.15.0.dist-info/AUTHORS.rst | 50 -- .../pycryptodomex-3.15.0.dist-info/INSTALLER | 1 - .../pycryptodomex-3.15.0.dist-info/LICENSE.rst | 61 -- .../pycryptodomex-3.15.0.dist-info/METADATA | 84 --- frozen_deps/pycryptodomex-3.15.0.dist-info/RECORD | 512 ------------- frozen_deps/pycryptodomex-3.15.0.dist-info/WHEEL | 5 - .../pycryptodomex-3.15.0.dist-info/top_level.txt | 1 - .../pycryptodomex-3.9.9.dist-info/AUTHORS.rst | 49 -- .../pycryptodomex-3.9.9.dist-info/INSTALLER | 1 - .../pycryptodomex-3.9.9.dist-info/LICENSE.rst | 274 ------- frozen_deps/pycryptodomex-3.9.9.dist-info/METADATA | 84 --- frozen_deps/pycryptodomex-3.9.9.dist-info/RECORD | 794 --------------------- frozen_deps/pycryptodomex-3.9.9.dist-info/WHEEL | 5 - .../pycryptodomex-3.9.9.dist-info/top_level.txt | 1 - frozen_deps/pysha3-1.0.2-py3.9.egg-info/PKG-INFO | 249 ------- .../pysha3-1.0.2-py3.9.egg-info/SOURCES.txt | 47 -- .../dependency_links.txt | 1 - .../installed-files.txt | 7 - .../pysha3-1.0.2-py3.9.egg-info/top_level.txt | 2 - frozen_deps/pysha3-1.0.2.dist-info/INSTALLER | 1 - frozen_deps/pysha3-1.0.2.dist-info/LICENSE | 49 -- frozen_deps/pysha3-1.0.2.dist-info/METADATA | 250 ------- frozen_deps/pysha3-1.0.2.dist-info/RECORD | 9 - frozen_deps/pysha3-1.0.2.dist-info/WHEEL | 5 - frozen_deps/pysha3-1.0.2.dist-info/top_level.txt | 2 - frozen_deps/six-1.15.0.dist-info/INSTALLER | 1 - frozen_deps/six-1.15.0.dist-info/LICENSE | 18 - frozen_deps/six-1.15.0.dist-info/METADATA | 49 -- frozen_deps/six-1.15.0.dist-info/RECORD | 8 - frozen_deps/six-1.15.0.dist-info/WHEEL | 6 - frozen_deps/six-1.15.0.dist-info/top_level.txt | 1 - frozen_deps/six-1.16.0.dist-info/INSTALLER | 1 - frozen_deps/six-1.16.0.dist-info/LICENSE | 18 - frozen_deps/six-1.16.0.dist-info/METADATA | 49 -- frozen_deps/six-1.16.0.dist-info/RECORD | 8 - frozen_deps/six-1.16.0.dist-info/WHEEL | 6 - frozen_deps/six-1.16.0.dist-info/top_level.txt | 1 - 264 files changed, 3506 insertions(+), 6296 deletions(-) delete mode 100755 frozen_deps/Cryptodome/Cipher/_ARC4.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Cipher/_Salsa20.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Cipher/_chacha20.cpython-39-x86_64-linux-gnu.so create mode 100644 frozen_deps/Cryptodome/Cipher/_pkcs1_oaep_decode.py delete mode 100755 frozen_deps/Cryptodome/Cipher/_raw_aes.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Cipher/_raw_aesni.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Cipher/_raw_arc2.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Cipher/_raw_blowfish.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Cipher/_raw_cast.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Cipher/_raw_cbc.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Cipher/_raw_cfb.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Cipher/_raw_ctr.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Cipher/_raw_des.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Cipher/_raw_des3.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Cipher/_raw_ecb.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Cipher/_raw_eksblowfish.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Cipher/_raw_ocb.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Cipher/_raw_ofb.cpython-39-x86_64-linux-gnu.so create mode 100644 frozen_deps/Cryptodome/Hash/TurboSHAKE128.py create mode 100644 frozen_deps/Cryptodome/Hash/TurboSHAKE128.pyi create mode 100644 frozen_deps/Cryptodome/Hash/TurboSHAKE256.py create mode 100644 frozen_deps/Cryptodome/Hash/TurboSHAKE256.pyi delete mode 100755 frozen_deps/Cryptodome/Hash/_BLAKE2b.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Hash/_BLAKE2s.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Hash/_MD2.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Hash/_MD4.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Hash/_MD5.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Hash/_RIPEMD160.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Hash/_SHA1.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Hash/_SHA224.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Hash/_SHA256.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Hash/_SHA384.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Hash/_SHA512.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Hash/_ghash_clmul.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Hash/_ghash_portable.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Hash/_keccak.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Hash/_poly1305.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Math/_modexp.cpython-39-x86_64-linux-gnu.so create mode 100644 frozen_deps/Cryptodome/Protocol/DH.py create mode 100644 frozen_deps/Cryptodome/Protocol/DH.pyi delete mode 100755 frozen_deps/Cryptodome/Protocol/_scrypt.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/PublicKey/_ec_ws.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Util/_cpuid_c.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/Cryptodome/Util/_strxor.cpython-39-x86_64-linux-gnu.so delete mode 100755 frozen_deps/_pysha3.cpython-38-x86_64-linux-gnu.so delete mode 100755 frozen_deps/_pysha3.cpython-39-x86_64-linux-gnu.so delete mode 100644 frozen_deps/base58-2.0.1.dist-info/COPYING delete mode 100644 frozen_deps/base58-2.0.1.dist-info/INSTALLER delete mode 100644 frozen_deps/base58-2.0.1.dist-info/METADATA delete mode 100644 frozen_deps/base58-2.0.1.dist-info/RECORD delete mode 100644 frozen_deps/base58-2.0.1.dist-info/WHEEL delete mode 100644 frozen_deps/base58-2.0.1.dist-info/entry_points.txt delete mode 100644 frozen_deps/base58-2.0.1.dist-info/top_level.txt delete mode 100644 frozen_deps/base58-2.1.0.dist-info/COPYING delete mode 100644 frozen_deps/base58-2.1.0.dist-info/INSTALLER delete mode 100644 frozen_deps/base58-2.1.0.dist-info/METADATA delete mode 100644 frozen_deps/base58-2.1.0.dist-info/RECORD delete mode 100644 frozen_deps/base58-2.1.0.dist-info/WHEEL delete mode 100644 frozen_deps/base58-2.1.0.dist-info/entry_points.txt delete mode 100644 frozen_deps/base58-2.1.0.dist-info/top_level.txt delete mode 100644 frozen_deps/base58-2.1.1.dist-info/COPYING delete mode 100644 frozen_deps/base58-2.1.1.dist-info/INSTALLER delete mode 100644 frozen_deps/base58-2.1.1.dist-info/METADATA delete mode 100644 frozen_deps/base58-2.1.1.dist-info/RECORD delete mode 100644 frozen_deps/base58-2.1.1.dist-info/WHEEL delete mode 100644 frozen_deps/base58-2.1.1.dist-info/entry_points.txt delete mode 100644 frozen_deps/base58-2.1.1.dist-info/top_level.txt delete mode 100644 frozen_deps/bech32.py delete mode 100755 frozen_deps/bin/base58 delete mode 100755 frozen_deps/bin/keytree.py delete mode 100644 frozen_deps/ecdsa-0.16.1.dist-info/INSTALLER delete mode 100644 frozen_deps/ecdsa-0.16.1.dist-info/LICENSE delete mode 100644 frozen_deps/ecdsa-0.16.1.dist-info/METADATA delete mode 100644 frozen_deps/ecdsa-0.16.1.dist-info/RECORD delete mode 100644 frozen_deps/ecdsa-0.16.1.dist-info/WHEEL delete mode 100644 frozen_deps/ecdsa-0.16.1.dist-info/top_level.txt delete mode 100644 frozen_deps/ecdsa-0.18.0.dist-info/INSTALLER delete mode 100644 frozen_deps/ecdsa-0.18.0.dist-info/LICENSE delete mode 100644 frozen_deps/ecdsa-0.18.0.dist-info/METADATA delete mode 100644 frozen_deps/ecdsa-0.18.0.dist-info/RECORD delete mode 100644 frozen_deps/ecdsa-0.18.0.dist-info/WHEEL delete mode 100644 frozen_deps/ecdsa-0.18.0.dist-info/top_level.txt create mode 100644 frozen_deps/ecdsa/ssh.py delete mode 100644 frozen_deps/keytree.py-0.2-py3.9.egg-info/PKG-INFO delete mode 100644 frozen_deps/keytree.py-0.2-py3.9.egg-info/SOURCES.txt delete mode 100644 frozen_deps/keytree.py-0.2-py3.9.egg-info/dependency_links.txt delete mode 100644 frozen_deps/keytree.py-0.2-py3.9.egg-info/installed-files.txt delete mode 100644 frozen_deps/keytree.py-0.2-py3.9.egg-info/requires.txt delete mode 100644 frozen_deps/keytree.py-0.2-py3.9.egg-info/top_level.txt delete mode 100644 frozen_deps/keytree.py-0.2.dist-info/INSTALLER delete mode 100644 frozen_deps/keytree.py-0.2.dist-info/METADATA delete mode 100644 frozen_deps/keytree.py-0.2.dist-info/RECORD delete mode 100644 frozen_deps/keytree.py-0.2.dist-info/REQUESTED delete mode 100644 frozen_deps/keytree.py-0.2.dist-info/WHEEL delete mode 100644 frozen_deps/keytree.py-0.2.dist-info/direct_url.json delete mode 100644 frozen_deps/keytree.py-0.2.dist-info/top_level.txt delete mode 100644 frozen_deps/pycryptodomex-3.15.0.dist-info/AUTHORS.rst delete mode 100644 frozen_deps/pycryptodomex-3.15.0.dist-info/INSTALLER delete mode 100644 frozen_deps/pycryptodomex-3.15.0.dist-info/LICENSE.rst delete mode 100644 frozen_deps/pycryptodomex-3.15.0.dist-info/METADATA delete mode 100644 frozen_deps/pycryptodomex-3.15.0.dist-info/RECORD delete mode 100644 frozen_deps/pycryptodomex-3.15.0.dist-info/WHEEL delete mode 100644 frozen_deps/pycryptodomex-3.15.0.dist-info/top_level.txt delete mode 100644 frozen_deps/pycryptodomex-3.9.9.dist-info/AUTHORS.rst delete mode 100644 frozen_deps/pycryptodomex-3.9.9.dist-info/INSTALLER delete mode 100644 frozen_deps/pycryptodomex-3.9.9.dist-info/LICENSE.rst delete mode 100644 frozen_deps/pycryptodomex-3.9.9.dist-info/METADATA delete mode 100644 frozen_deps/pycryptodomex-3.9.9.dist-info/RECORD delete mode 100644 frozen_deps/pycryptodomex-3.9.9.dist-info/WHEEL delete mode 100644 frozen_deps/pycryptodomex-3.9.9.dist-info/top_level.txt delete mode 100644 frozen_deps/pysha3-1.0.2-py3.9.egg-info/PKG-INFO delete mode 100644 frozen_deps/pysha3-1.0.2-py3.9.egg-info/SOURCES.txt delete mode 100644 frozen_deps/pysha3-1.0.2-py3.9.egg-info/dependency_links.txt delete mode 100644 frozen_deps/pysha3-1.0.2-py3.9.egg-info/installed-files.txt delete mode 100644 frozen_deps/pysha3-1.0.2-py3.9.egg-info/top_level.txt delete mode 100644 frozen_deps/pysha3-1.0.2.dist-info/INSTALLER delete mode 100644 frozen_deps/pysha3-1.0.2.dist-info/LICENSE delete mode 100644 frozen_deps/pysha3-1.0.2.dist-info/METADATA delete mode 100644 frozen_deps/pysha3-1.0.2.dist-info/RECORD delete mode 100644 frozen_deps/pysha3-1.0.2.dist-info/WHEEL delete mode 100644 frozen_deps/pysha3-1.0.2.dist-info/top_level.txt delete mode 100644 frozen_deps/six-1.15.0.dist-info/INSTALLER delete mode 100644 frozen_deps/six-1.15.0.dist-info/LICENSE delete mode 100644 frozen_deps/six-1.15.0.dist-info/METADATA delete mode 100644 frozen_deps/six-1.15.0.dist-info/RECORD delete mode 100644 frozen_deps/six-1.15.0.dist-info/WHEEL delete mode 100644 frozen_deps/six-1.15.0.dist-info/top_level.txt delete mode 100644 frozen_deps/six-1.16.0.dist-info/INSTALLER delete mode 100644 frozen_deps/six-1.16.0.dist-info/LICENSE delete mode 100644 frozen_deps/six-1.16.0.dist-info/METADATA delete mode 100644 frozen_deps/six-1.16.0.dist-info/RECORD delete mode 100644 frozen_deps/six-1.16.0.dist-info/WHEEL delete mode 100644 frozen_deps/six-1.16.0.dist-info/top_level.txt (limited to 'frozen_deps') 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) ` -:var MODE_CBC: :ref:`Cipher-Block Chaining (CBC) ` -:var MODE_CFB: :ref:`Cipher FeedBack (CFB) ` -:var MODE_OFB: :ref:`Output FeedBack (OFB) ` -:var MODE_CTR: :ref:`CounTer Mode (CTR) ` -:var MODE_OPENPGP: :ref:`OpenPGP Mode ` -:var MODE_CCM: :ref:`Counter with CBC-MAC (CCM) Mode ` -:var MODE_EAX: :ref:`EAX Mode ` -:var MODE_GCM: :ref:`Galois Counter Mode (GCM) ` -:var MODE_SIV: :ref:`Syntethic Initialization Vector (SIV) ` -:var MODE_OCB: :ref:`Offset Code Book (OCB) ` -""" 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 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 Binary files a/frozen_deps/Cryptodome/Cipher/_ARC4.abi3.so and b/frozen_deps/Cryptodome/Cipher/_ARC4.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_ARC4.cpython-39-x86_64-linux-gnu.so and /dev/null differ diff --git a/frozen_deps/Cryptodome/Cipher/_Salsa20.abi3.so b/frozen_deps/Cryptodome/Cipher/_Salsa20.abi3.so index 10ba4b7..a303d91 100755 Binary files a/frozen_deps/Cryptodome/Cipher/_Salsa20.abi3.so and b/frozen_deps/Cryptodome/Cipher/_Salsa20.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_Salsa20.cpython-39-x86_64-linux-gnu.so and /dev/null differ diff --git a/frozen_deps/Cryptodome/Cipher/_chacha20.abi3.so b/frozen_deps/Cryptodome/Cipher/_chacha20.abi3.so index 316d6cb..f1f1fa1 100755 Binary files a/frozen_deps/Cryptodome/Cipher/_chacha20.abi3.so and b/frozen_deps/Cryptodome/Cipher/_chacha20.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_chacha20.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Cipher/_pkcs1_decode.abi3.so and b/frozen_deps/Cryptodome/Cipher/_pkcs1_decode.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_aes.abi3.so and b/frozen_deps/Cryptodome/Cipher/_raw_aes.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_aes.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_aesni.abi3.so and b/frozen_deps/Cryptodome/Cipher/_raw_aesni.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_aesni.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_arc2.abi3.so and b/frozen_deps/Cryptodome/Cipher/_raw_arc2.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_arc2.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_blowfish.abi3.so and b/frozen_deps/Cryptodome/Cipher/_raw_blowfish.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_blowfish.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_cast.abi3.so and b/frozen_deps/Cryptodome/Cipher/_raw_cast.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_cast.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_cbc.abi3.so and b/frozen_deps/Cryptodome/Cipher/_raw_cbc.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_cbc.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_cfb.abi3.so and b/frozen_deps/Cryptodome/Cipher/_raw_cfb.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_cfb.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_ctr.abi3.so and b/frozen_deps/Cryptodome/Cipher/_raw_ctr.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_ctr.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_des.abi3.so and b/frozen_deps/Cryptodome/Cipher/_raw_des.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_des.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_des3.abi3.so and b/frozen_deps/Cryptodome/Cipher/_raw_des3.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_des3.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_ecb.abi3.so and b/frozen_deps/Cryptodome/Cipher/_raw_ecb.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_ecb.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_eksblowfish.abi3.so and b/frozen_deps/Cryptodome/Cipher/_raw_eksblowfish.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_eksblowfish.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_ocb.abi3.so and b/frozen_deps/Cryptodome/Cipher/_raw_ocb.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_ocb.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_ofb.abi3.so and b/frozen_deps/Cryptodome/Cipher/_raw_ofb.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Cipher/_raw_ofb.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Hash/_BLAKE2b.abi3.so and b/frozen_deps/Cryptodome/Hash/_BLAKE2b.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Hash/_BLAKE2b.cpython-39-x86_64-linux-gnu.so and /dev/null differ diff --git a/frozen_deps/Cryptodome/Hash/_BLAKE2s.abi3.so b/frozen_deps/Cryptodome/Hash/_BLAKE2s.abi3.so index 26e69e8..04a1ace 100755 Binary files a/frozen_deps/Cryptodome/Hash/_BLAKE2s.abi3.so and b/frozen_deps/Cryptodome/Hash/_BLAKE2s.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Hash/_BLAKE2s.cpython-39-x86_64-linux-gnu.so and /dev/null differ diff --git a/frozen_deps/Cryptodome/Hash/_MD2.abi3.so b/frozen_deps/Cryptodome/Hash/_MD2.abi3.so index 576ba1e..1573ca3 100755 Binary files a/frozen_deps/Cryptodome/Hash/_MD2.abi3.so and b/frozen_deps/Cryptodome/Hash/_MD2.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Hash/_MD2.cpython-39-x86_64-linux-gnu.so and /dev/null differ diff --git a/frozen_deps/Cryptodome/Hash/_MD4.abi3.so b/frozen_deps/Cryptodome/Hash/_MD4.abi3.so index 0afc5ca..8f41e31 100755 Binary files a/frozen_deps/Cryptodome/Hash/_MD4.abi3.so and b/frozen_deps/Cryptodome/Hash/_MD4.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Hash/_MD4.cpython-39-x86_64-linux-gnu.so and /dev/null differ diff --git a/frozen_deps/Cryptodome/Hash/_MD5.abi3.so b/frozen_deps/Cryptodome/Hash/_MD5.abi3.so index 38caf8d..b22cf36 100755 Binary files a/frozen_deps/Cryptodome/Hash/_MD5.abi3.so and b/frozen_deps/Cryptodome/Hash/_MD5.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Hash/_MD5.cpython-39-x86_64-linux-gnu.so and /dev/null differ diff --git a/frozen_deps/Cryptodome/Hash/_RIPEMD160.abi3.so b/frozen_deps/Cryptodome/Hash/_RIPEMD160.abi3.so index 2c02e71..78faa00 100755 Binary files a/frozen_deps/Cryptodome/Hash/_RIPEMD160.abi3.so and b/frozen_deps/Cryptodome/Hash/_RIPEMD160.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Hash/_RIPEMD160.cpython-39-x86_64-linux-gnu.so and /dev/null differ diff --git a/frozen_deps/Cryptodome/Hash/_SHA1.abi3.so b/frozen_deps/Cryptodome/Hash/_SHA1.abi3.so index 2d86b06..acd08ad 100755 Binary files a/frozen_deps/Cryptodome/Hash/_SHA1.abi3.so and b/frozen_deps/Cryptodome/Hash/_SHA1.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Hash/_SHA1.cpython-39-x86_64-linux-gnu.so and /dev/null differ diff --git a/frozen_deps/Cryptodome/Hash/_SHA224.abi3.so b/frozen_deps/Cryptodome/Hash/_SHA224.abi3.so index c462c9b..9cf3ef6 100755 Binary files a/frozen_deps/Cryptodome/Hash/_SHA224.abi3.so and b/frozen_deps/Cryptodome/Hash/_SHA224.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Hash/_SHA224.cpython-39-x86_64-linux-gnu.so and /dev/null differ diff --git a/frozen_deps/Cryptodome/Hash/_SHA256.abi3.so b/frozen_deps/Cryptodome/Hash/_SHA256.abi3.so index c51c162..6dffb17 100755 Binary files a/frozen_deps/Cryptodome/Hash/_SHA256.abi3.so and b/frozen_deps/Cryptodome/Hash/_SHA256.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Hash/_SHA256.cpython-39-x86_64-linux-gnu.so and /dev/null differ diff --git a/frozen_deps/Cryptodome/Hash/_SHA384.abi3.so b/frozen_deps/Cryptodome/Hash/_SHA384.abi3.so index 4a4237e..7c72fd0 100755 Binary files a/frozen_deps/Cryptodome/Hash/_SHA384.abi3.so and b/frozen_deps/Cryptodome/Hash/_SHA384.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Hash/_SHA384.cpython-39-x86_64-linux-gnu.so and /dev/null differ diff --git a/frozen_deps/Cryptodome/Hash/_SHA512.abi3.so b/frozen_deps/Cryptodome/Hash/_SHA512.abi3.so index ff9a01f..058653c 100755 Binary files a/frozen_deps/Cryptodome/Hash/_SHA512.abi3.so and b/frozen_deps/Cryptodome/Hash/_SHA512.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Hash/_SHA512.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Hash/_ghash_clmul.abi3.so and b/frozen_deps/Cryptodome/Hash/_ghash_clmul.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Hash/_ghash_clmul.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Hash/_ghash_portable.abi3.so and b/frozen_deps/Cryptodome/Hash/_ghash_portable.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Hash/_ghash_portable.cpython-39-x86_64-linux-gnu.so and /dev/null differ diff --git a/frozen_deps/Cryptodome/Hash/_keccak.abi3.so b/frozen_deps/Cryptodome/Hash/_keccak.abi3.so index b251995..4e494b0 100755 Binary files a/frozen_deps/Cryptodome/Hash/_keccak.abi3.so and b/frozen_deps/Cryptodome/Hash/_keccak.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Hash/_keccak.cpython-39-x86_64-linux-gnu.so and /dev/null differ diff --git a/frozen_deps/Cryptodome/Hash/_poly1305.abi3.so b/frozen_deps/Cryptodome/Hash/_poly1305.abi3.so index e8da59e..901b8c2 100755 Binary files a/frozen_deps/Cryptodome/Hash/_poly1305.abi3.so and b/frozen_deps/Cryptodome/Hash/_poly1305.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Hash/_poly1305.cpython-39-x86_64-linux-gnu.so and /dev/null 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` . + 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` . 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 Binary files a/frozen_deps/Cryptodome/Math/_modexp.abi3.so and b/frozen_deps/Cryptodome/Math/_modexp.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Math/_modexp.cpython-39-x86_64-linux-gnu.so and /dev/null 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 `_. + + 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 Binary files a/frozen_deps/Cryptodome/Protocol/_scrypt.abi3.so and b/frozen_deps/Cryptodome/Protocol/_scrypt.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Protocol/_scrypt.cpython-39-x86_64-linux-gnu.so and /dev/null 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`. + 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`. + 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): @@ -130,6 +136,30 @@ class RsaKey(object): raise AttributeError("No CRT component 'q' available for public keys") 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(): @@ -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`. + 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`. + 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 Binary files a/frozen_deps/Cryptodome/PublicKey/_ec_ws.abi3.so and b/frozen_deps/Cryptodome/PublicKey/_ec_ws.abi3.so 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 Binary files a/frozen_deps/Cryptodome/PublicKey/_ec_ws.cpython-39-x86_64-linux-gnu.so and /dev/null differ diff --git a/frozen_deps/Cryptodome/PublicKey/_ed25519.abi3.so b/frozen_deps/Cryptodome/PublicKey/_ed25519.abi3.so index bd8bcc5..e047bcb 100755 Binary files a/frozen_deps/Cryptodome/PublicKey/_ed25519.abi3.so and b/frozen_deps/Cryptodome/PublicKey/_ed25519.abi3.so differ diff --git a/frozen_deps/Cryptodome/PublicKey/_ed448.abi3.so b/frozen_deps/Cryptodome/PublicKey/_ed448.abi3.so index ee47399..da7209a 100755 Binary files a/frozen_deps/Cryptodome/PublicKey/_ed448.abi3.so and b/frozen_deps/Cryptodome/PublicKey/_ed448.abi3.so differ diff --git a/frozen_deps/Cryptodome/PublicKey/_x25519.abi3.so b/frozen_deps/Cryptodome/PublicKey/_x25519.abi3.so index bbdc726..dbb00d5 100755 Binary files a/frozen_deps/Cryptodome/PublicKey/_x25519.abi3.so and b/frozen_deps/Cryptodome/PublicKey/_x25519.abi3.so 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 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 Binary files a/frozen_deps/Cryptodome/Util/_cpuid_c.abi3.so and b/frozen_deps/Cryptodome/Util/_cpuid_c.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Util/_cpuid_c.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/Cryptodome/Util/_strxor.abi3.so and b/frozen_deps/Cryptodome/Util/_strxor.abi3.so 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 Binary files a/frozen_deps/Cryptodome/Util/_strxor.cpython-39-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/_pysha3.cpython-310-x86_64-linux-gnu.so and b/frozen_deps/_pysha3.cpython-310-x86_64-linux-gnu.so 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 Binary files a/frozen_deps/_pysha3.cpython-38-x86_64-linux-gnu.so and /dev/null 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 Binary files a/frozen_deps/_pysha3.cpython-39-x86_64-linux-gnu.so and /dev/null 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: keijser@gmail.com -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: keijser@gmail.com -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 "", line 1, in - 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: keijser@gmail.com -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 "", line 1, in - 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 -# -# 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: warner@lothar.com -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: warner@lothar.com -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.slow @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.slow @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 + + +@pytest.mark.parametrize("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 + + +@pytest.mark.slow 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") -@pytest.mark.skipif(GMPY == False, reason="requites gmpy or gmpy2") +@pytest.mark.skipif(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: tederminant@gmail.com -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: tederminant@gmail.com -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 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 - -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: helderijs@gmail.com -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 - -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: helderijs@gmail.com -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: christian@python.org -Maintainer: Christian Heimes -Maintainer-email: christian@python.org -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: christian@python.org -Maintainer: Christian Heimes -Maintainer-email: christian@python.org -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: benjamin@python.org -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: benjamin@python.org -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 -- cgit v1.2.3-70-g09d2